2016-09-22 5 views
0

Почему объекты класса передаются загрузчиком класса? не должно ли быть другим способом. i.e должен был быть отправлен загрузчик классов , чтобы объект класса мог получить право на GC, если объект класса недостижим и меньше потребляет память?объект класса, упомянутый загрузчиком классов?

Я знаю, что мне не хватает элементарных данных здесь, но не знаю, что. Я попытался найти его, но не смог найти ответ

+0

загрузчик классов является частью JVM, который фактически хранит сведения о структуре классов в памяти, такие как методы полей и т. Д. Для системы, а вновь созданный объект является зеркальной копией этой структуры классов в памяти, на которой вы фактически выполняете свои операции. –

ответ

2

Потому что ClassLoader загружает классы и несет ответственность за то, чтобы узнать, какие классы он загрузил. Class Объекты также имеют ссылку на ClassLoader, которые загрузили его, следовательно, getClassLoader() в Class.

Потребление памяти имеет абсолютно ничего. ничего не стоит здесь, я не могу представить, почему вы думаете, что это так.

+0

позвольте мне по-другому. Если не должно быть ответственности только объекта класса, чтобы знать, кто его загрузил (как вы сказали, он уже делает, что объекты i.e.Class также имеют ссылку на загрузчик ClassLoader, который его загрузил). Если бы это было так, то недостижимый объект класса мог бы быть GC'd, когда он недоступен (becoz в настоящее время, даже если объект класса недоступен, его не GC'd, потому что его ссылается на загрузчик классов)? – emilly

+1

Нет, не следует. Разгрузка класса не очень важна, по крайней мере, с точки зрения памяти. Однако «ClassLoader», зная, какие классы он загрузил, очень важен, поэтому он не загружает один и тот же класс дважды, например. Вы очень одержимы классами GCing. Не беспокойтесь, это возможно и легко даже в нынешней ситуации. – Kayaman

+0

@ Kayaman, хотя для ClassLoader действительно необходимо знать, какие классы уже были загружены, это не означает, что загрузчики классов поддерживают ссылки на эти классы. –

0

Если вы посмотрите на реализацию класса java.lang.ClassLoader, вы обнаружите, что фактическая копия объектов класса происходит «за кулисами» JVM. Информация о классе получена собственными методами (например, findLoadedClass0), а ClassLoader вызывает собственный метод defineClass1 для определения нового класса, когда это необходимо. Как эти методы реализованы, зависит от JVM.

Таким образом, нет необходимости поддерживать эти ссылки для целей создания объектов. Однако, как государства комментариев в вектор объектов класса в исходном коде java.lang.ClassLoader:

// The classes loaded by this class loader. The only purpose of this table 
// is to keep the classes from being GC'ed until the loader is GC'ed. 
// private final Vector<Class<?>> classes = new Vector<>(); 

Следствием этого является то, что если вам нужно освободить память неиспользуемых определений класса, необходимо GC в ClassLoader сам. Это возможно, если нет объекта, содержащего ссылку на любой из классов, загруженных этим загрузчиком классов, и вы можете просто забыть ссылку на этот загрузчик классов. Это именно то, что происходит на серверах приложений JEE и контейнерах OSGi, когда они выгружают веб-приложения и плагины.

+1

Вы правы, что это не то, о чем мы должны заботиться, но ваше первое предложение не [абсолютно верно] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/ языки/ClassLoader.java # 180). – Kayaman

+0

Спасибо, я этого не заметил. –

Смежные вопросы