Где хранятся объекты Class, созданные подсистемой classloader? - PullRequest
0 голосов
/ 05 октября 2018

Я полагаю, что более новые версии Java объединили область метода и область кучи как одну область кучи.Но это касается более старых версий.

Но определение jvm loading определяет как "процесс поиска файла .class и создания объекта Class"

Это мои сомнения:

  1. Когда мы запускаем наш файл .class, он сначала сохраняется как биты памяти как есть в области метода?Полный файл .class конвертируется в биты памяти?Или только метаданные?Каков характер распределения памяти этих «данных класса» в области метода?
  2. Использует ли класс Classloader методы класса Class для получения этих метаданных, которые в конечном итоге сохраняются в области метода?
  3. Являются ли эти объекты Class одинаковымиВ качестве объектов мы создаем с использованием новых?Я уже просмотрел документацию, но все еще не могу понять, , на каком этапе создается объект Class. Преобразуется ли информация файла .class в метаданные и сохраняется как объекты Class в области метода?

Я уже посмотрел документацию.Мне нужно только простое объяснение того, что «загружается»?Область метода имеет объекты класса, которые имеют эти метаданные?Или просто побитовая информация всего файла .class?

Редактировать: Также я знаю, что под «написанием / выполнением кода» подразумевается, что весь этот файл находится в битовом формате в ОЗУ.Я хочу знать, есть ли у этой области специальных методов в ОЗУ эта копия или она совершенно иная.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

A ClassLoader отвечает только за поиск и чтение файла класса и, при необходимости, связывает ProtectionDomain с местоположением кода для поддержки мер безопасности.

Затем он передает байты одному изdefineClass методы, которые наследует каждый загрузчик классов.Эти методы принимают байты файла класса либо в виде массива, либо ByteBuffer, и выполняют всю магию, возвращая, наконец, Class объект.

Эти Class объекты в основном похожи на обычные объекты, но вы никогдасоздать их через new;только JVM будет создавать экземпляры.Кроме того, JVM может связывать дополнительную информацию с этими объектами, которая не видна программисту приложения, смотрящему на объект Java.

То, что происходит в defineClass, зависит от конкретной реализации.Но это типично, чтобы не хранить байты файла класса как есть.Скорее всего, они содержат информацию, не необходимую для выполнения, и требуемая информация может быть не в оптимальном формате для текущей платформы (например, порядок байтов и предпочтительное выравнивание данных).Кроме того, имеет смысл складывать одинаковые константы разных классов в одно хранилище.Так как данные класса должны быть проверены на достоверность в любом случае, имеет смысл объединить этот этап обработки с преобразованием данных во внутренний формат, более подходящий для последующей обработки.

Полная информация времени выполнения относительно класса по-прежнему распространяетсячерез кучу (например, экземпляр Class и связанные с ним объекты Reflection) и область метода (например, код, информация о связях, внутренние структуры JVM и т. д.).Обратите внимание, что эти имена даны спецификацией, то есть куча Java определена как область памяти, содержащая все объекты Java , а область метода определена как хранилище метаданных .Поскольку это различие дается по определению , независимо от того, имеет ли оно значение для конкретной реализации (в конце концов, это просто ОЗУ), вы не увидите изменений, зависящих от реализации, в этой классификации.

0 голосов
/ 05 октября 2018

Для полного объяснения того, как это работает, вам необходимо прочитать главу 5 Спецификации виртуальной машины Java.Во введении говорится,

" Виртуальная машина Java динамически загружает, связывает и инициализирует классы и интерфейсы. Загрузка - это процесс поиска двоичного представления класса или типа интерфейса с определенным именем и созданиякласс или интерфейс из этого двоичного представления. Связывание - это процесс взятия класса или интерфейса и объединения его в состояние времени выполнения виртуальной машины Java для его выполнения. Инициализация класса или интерфейса состоит из выполнения классаили метод инициализации интерфейса"

Чтобы ответить на конкретные вопросы:

  1. Файл класса не загружен как есть в область метода, он загружен как специфичная для реализации (это означает, что JVMS не обязывает это) внутреннее представление класса.Классы (кроме классов массивов) загружаются загрузчиком классов.Загрузчик класса создает экземпляр объекта Class (то есть метаданные) для данного класса.Выделение пространства в куче для этого объекта обрабатывается JVM.
  2. Нет.Загрузчик классов отвечает за создание объекта Class, поэтому не использует методы этого объекта.
  3. Да, объекты Class имеют ту же форму, что и любой другой объект Java.Класс Class наследуется от Object, и вы можете вызывать такие методы, как equals, hachCode и т. Д., Как и в случае с другими объектами.
...