Java: Где выделяется память для физических байтов класса при загрузке ClassLoader? - PullRequest
2 голосов
/ 20 мая 2011

Я создал крошечный пользовательский загрузчик классов в фиктивном приложении, чтобы понять, как работает динамическая загрузка классов. Для этого вопроса мне не нужно вдаваться в подробности о том, что он делает, кроме упоминания о том, что он создает два разных экземпляра моего загрузчика классов и каждый из них загружает разные классы, чтобы я мог удовлетворить себя, подтвердив " ClassNotFoundException "из одного из экземпляров загрузчика классов, когда только другой загрузил определенный класс.

Однако у меня есть вопрос, который можно легко выразить с помощью следующей, надеюсь, не требующей пояснений строки кода.

        Class clazz = myClassLoader.loadClass(theClazz);

Эта строка кода заставляет мой пользовательский загрузчик классов загружать байты класса в память и возвращать экземпляр объекта Class для этого класса.

У меня такой вопрос: где находятся физические байты памяти для загруженного класса (т. Е. Содержимое файла .class)? Они хранятся внутри объекта ClassLoader или внутри объекта Class (после чего объект ClassLoader просто содержит внутреннюю ссылку на этот объект Class) - или где-то еще целиком?

Ответы [ 6 ]

2 голосов
/ 27 мая 2011

Объект classloader имеет коллекцию всех классов, которые он загрузил.

Если один и тот же физический класс загружается двумя разными загрузчиками классов, байты этого класса дважды записываются в память. Два класса ведут себя как разные типы. Они не совместимы друг с другом! Где хранятся байты, на самом деле не имеет значения, интересно, почему вы хотите это знать. Если вы пишете свой собственный ClassLoader, вы можете «хранить» его там, где вы хотите. Однако в какой-то момент вы сделаете вызов вроде: ClassLoader.defineClass (String, byte [], int, int). Затем создаются соответствующие структуры в памяти внутри виртуальной машины (MethodArea, ConstantPool и т. Д.), Как указано в других ответах.

2 голосов
/ 20 мая 2011

На самом низком уровне двоичное представление класса присутствует в различных областях времени выполнения виртуальной машины, особенно в области метода и в пуле времени выполнения . Проще говоря, ожидается, что Область Метода будет содержать информацию о классе, включая код для методов и конструкторов, о чем свидетельствует следующая цитата из Спецификации виртуальной машины:

В виртуальной машине Java есть метод область, которая является общей для всей Java потоки виртуальной машины. Метод площадь аналогична складской площади для скомпилированного кода обычного язык или аналог "текст" сегмент в процессе UNIX. Это магазины структуры для каждого класса, такие как постоянный пул времени выполнения, поле и данные метода и код для методов и конструкторы, в том числе специальные методы (§3.9), используемые в классе и инициализация экземпляра и инициализация типа интерфейса.

2 голосов
/ 20 мая 2011

Из исходного кода для 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 Vector classes = new Vector();

Исходный код для классов Java находится в src.zip в вашем каталоге JDK.

Редактировать: Это было то, что вы спросилиоколо?

1 голос
/ 20 мая 2011

Файл класса и его внутреннее, специфичное для JVM представление обычно хранятся в постоянном поколении - по крайней мере, в воплощении Sun / Oracle JVM.

См. Что на самом деле означает PermGen? для получения дополнительных ссылок.

1 голос
/ 20 мая 2011

Это зависит от JVM, например, здесь или здесь .В старых версиях Mac OS использовалась схема указателя на указатель, называемая handle .

1 голос
/ 20 мая 2011

"Эта строка кода заставляет мой пользовательский загрузчик классов загружать байты класса в память и возвращать экземпляр объекта Class для этого класса"

Если я понимаю вашевопрос правильный, выделение памяти для объектов выполняется в пространстве кучи Java-процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...