Основные технические вопросы и ответы (11) Загрузка класса JVM

Java задняя часть JVM Безопасность

1 Какова концепция механизма загрузки классов?

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

Каковы компоненты байт-кода типа 2?

В структуре файла класса есть только два типа данных:

  1. беззнаковое число: это базовый тип данных, где u1, u2, u4 и u8 представляют беззнаковые числа размером 1, 2, 4 и 8 байт соответственно, которые можно использовать для описания чисел, ссылок на индексы, количественных значений или кодирования в соответствии с в UTF-8 строковое значение ;
  2. поверхность: составной тип данных, состоящий из нескольких чисел без знака или других таблиц в качестве элементов данных, все таблицы заканчиваются на «_info»;
  3. Таким образом, файл класса по сути представляет собой таблицу;

Содержимое файловой структуры класса состоит из:

  1. магическое число: Первые 4 байта каждого файла класса, магический номер языка JAVA: CAFEBABE, шестнадцатеричное число, только слева и справа, чтобы подтвердить, является ли файл файлом класса, принятым виртуальной машиной;
  2. Версия файла класса: 5-й и 6-й байты файла Class являются дополнительным номером версии, а 7-й и 8-й байты — основным номером версии;
  3. постоянный пул: Начиная с 9-го байта, он в основном хранит два типа констант: (1) литералы, (2) символические ссылки;
  4. Флаг доступа: два байта сразу после пула констант представляют собой флаг доступа, представляющий иерархическую информацию о классе или интерфейсе;
  5. Индекс класса, индекс родительского класса и коллекция индексов интерфейса: За индексом класса, индексом родительского класса и индексом интерфейса следует флаг доступа, все из которых являются данными типа u2, и отношение наследования класса определяется этими тремя данными в файле класса;
  6. Коллекция полевых таблиц: за ним следует коллекция таблиц полей, которая используется для описания переменных, объявленных в интерфейсе или классе;
  7. Коллекция таблиц методов: Далее идет коллекция таблиц методов, которая используется для описания методов, объявленных в интерфейсе или классе;

3 Процесс загрузки класса примерно разделен на несколько этапов?

类加载步骤

4 Когда начнется загрузка класса?

  1. Создайте экземпляр класса: создать экземпляр объекта с помощью нового ключевого слова;
  2. Доступ к статическим переменным класса: GetStatic или Putstatic, читайте или установите статическую переменную класса (исключая статические переменные, модифицированные финалом);
  3. Доступ к статическим методам класса: invokestatic вызывает статический метод класса;
  4. Использование java.lang.reflect для вызовов отражения: Например, Class.forName("xxxxx");
  5. Когда подкласс инициализируется, родительский класс будет инициализирован первым;

5 У вас есть несколько пассивных ссылок, пассивные ссылки не запускают инициализацию?

  1. Ссылка на статические поля родительского класса через подкласс не приведет к инициализации подкласса, будет инициализирован только родительский класс;
  2. Ссылка на класс через определение массива не вызывает инициализацию класса;
  3. Константы будут храниться в пуле констант вызывающего класса на этапе компиляции, и нет прямой ссылки на класс, определяющий константу по сути, потому что инициализация класса, определяющего константу, не будет инициирована;

6 Загрузка класса: Каков конкретный процесс первого этапа загрузки?

  1. Получите двоичный поток, определяющий этот класс по его полному имени;
  2. Преобразование статической структуры двоичного потока в структуру данных времени выполнения области метода;
  3. Генерирует объект java.lang.class, представляющий этот класс в памяти. Для виртуальной машины HotSpot объект класса хранится в области метода;

7 Загрузка класса: каков конкретный процесс второго этапа проверки?

Основная функция заключается в обеспечении того, чтобы информация, содержащаяся в потоке байтов файла Class, соответствовала требованиям текущей виртуальной машины и не угрожала безопасности самой виртуальной машины;

  1. проверка формата файла: проверьте формат и версию;
  2. проверка метаданных: семантический анализ байт-кода;
  3. Проверка байт-кода;
  4. Проверка символьной ссылки;

8 Загрузка класса: Каков конкретный процесс этапа подготовки к третьему шагу?

  1. Формально выделяют память для переменных класса, и память выделяется в области методов.Переменные класса относятся к статически измененным переменным;
  2. Установите начальное значение переменной класса.Это начальное значение обычно является нулевым значением типа данных, например: public static int value = 123, начальное значение 0, а не 123, и присваивание 123 не будет выполняться до этапа инициализации;

9 Загрузка класса: каков конкретный процесс четвертого шага фазы синтаксического анализа?

Заменить символические ссылки в константном пуле файла класса прямыми ссылками;

10 Загрузка класса: пятый шаг для инициализации конкретного процесса?

Чтобы фактически начать выполнение программного кода Java, определенного в классе, процесс инициализации представляет собой процесс выполнения метода конструктора класса ();

  1. Метод () будет автоматически собирать действия присваивания и статические блоки кода всех переменных класса (статических) в классе, а порядок сбора компилятором определяется порядком появления кода;
  2. Метод () отличается от конструктора экземпляра класса.Виртуальная машина гарантирует, что метод () родительского класса будет выполнен до выполнения метода () подкласса;

12 Существует несколько типов загрузчиков классов, и какова роль каждого из них?

类加载器

  1. Загрузчик корневого класса (Bootstrap ClassLoader): отвечает за загрузку основных классов Java, таких как String и System;
  2. Расширение ClassLoader: отвечает за загрузку расширенной библиотеки классов JRE;
  3. Системный загрузчик классов: отвечает за загрузку пакета JAR и пути к классам, заданного переменной среды CLASSPATH;
  4. Загрузчик пользовательских классов: определяемый пользователем загрузчик с загрузчиком классов в качестве родительского класса.

13 Что такое шаблон делегирования родительского загрузчика классов и почему?

Механизм родительского делегирования: если загрузчик класса получает запрос на загрузку класса, он не будет пытаться сначала загрузить класс сам по себе, а делегирует задачу запроса загрузчику родительского класса для рекурсивного завершения, если родительский класс Если загрузчик может завершить задачу загрузки класса, он вернется успешно; только когда загрузчик родительского класса не может завершить задачу загрузки, он загрузит ее сам.

Классы Java имеют приоритетную иерархию вместе с загрузчиком классов, который их загружает. Например, класс Object в Java хранится в rt.jar. Независимо от того, какой загрузчик классов хочет загрузить этот класс, в конечном итоге он делегируется для загрузки загрузчику запускаемого класса в верхней части модели. Поэтому Object загружается в различные Тот же класс в среде загрузки классов. Если родительская модель делегирования не принята, то каждый загрузчик классов будет загружаться и загружаться сам по себе, тогда в системе будет много разных классов объектов.