Подробное объяснение JVM: пул констант времени выполнения

Java

Введение

JVM загрузит, свяжет и инициализирует файл класса во время работы. Что происходит с постоянным пулом, определенным в файле класса, после загрузки JVM? Приходите посмотреть.

постоянный пул в файле класса

Когда мы говорили о структуре файлов классов ранее, мы упомянули, что каждый файл классов имеет пул констант.Что хранится в пуле констант?

Строковые константы, имена классов и интерфейсов, имена полей и другие константы, на которые есть ссылки в классе.

постоянный пул времени выполнения

Но только константного пула в class-файле явно недостаточно, потому что нам нужно запустить его в JVM.

В настоящее время для обслуживания работы JVM требуется постоянный пул времени выполнения.

Существует однозначное соответствие между пулом констант времени выполнения и пулом констант файла класса, который создается из пула констант файла класса.

Существует два типа пула констант времени выполнения, а именно символические ссылки и статические константы.

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

Что такое статическая константа и что такое символическая ссылка? Возьмем интуитивный пример.

String site="www.flydean.com"

Приведенную выше строку «www.flydean.com» можно рассматривать как статическую константу, потому что она не изменится и будет отображать то, что есть.

Имя приведенной выше строки «сайт» является символической ссылкой, которую необходимо анализировать во время выполнения.Почему?

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

Подробное объяснение статических констант

Статические константы в пуле констант времени выполнения создаются из пула констант в файле класса. Можно разделить на две части: строковые константы и числовые константы.

Строковая константа

Строковые константы — это ссылки на объекты String, созданные из структуры CONSTANT_String_info в классе:

CONSTANT_String_info {
    u1 tag;
    u2 string_index;
}

tag — это тег структуры, а string_index — это индекс строки в пуле констант класса.

Содержимое пула констант класса, соответствующего string_index, представляет собой структуру CONSTANT_Utf8_info.

CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}

Что такое CONSTANT_Utf8_info? Это вариант кодировки UTF-8 создаваемого объекта String.

Мы знаем, что диапазон юникода от 0x0000 до 0x10FFFF.

Вариант UTF-8 — это способ кодирования Unicode. Как это закодировано?

Как видно из рисунка выше, разные диапазоны юникода используют разные методы кодирования.

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

Если диапазон символов после FFFF, то формат не используется, это комбинация двух 3-х байт.

Поговорив о структуре CONSTANT_String_info в файле класса, давайте посмотрим на правила создания строковых констант времени выполнения из CONSTANT_String_info:

  1. Правило 1: Если String.intern был вызван ранее и возвращаемый результат согласуется с кодировкой, хранящейся в CONSTANT_String_info, это означает, что они указывают на один и тот же экземпляр String.

  2. Правило 2: Если отличается, создается новый экземпляр String, а константа String во время выполнения указывает на экземпляр String. Наконец, для этого экземпляра String вызывается внутренний метод String. Основная цель вызова внутреннего метода — добавить экземпляр String в пул строковых констант.

числовая константа

Числовые константы создаются из CONSTANT_Integer_info, CONSTANT_Float_info, CONSTANT_Long_info и CONSTANT_Double_info в файле класса.

Подробная справка по символам

Символические ссылки также создаются из пула констант в классе.

Символические ссылки на класс и интерфейс поступают из CONSTANT_Class_info.

Ссылки на поля в классе и интерфейсе берутся из CONSTANT_Fieldref_info.

Ссылка на метод в классе происходит из CONSTANT_Methodref_info.

Ссылка на метод в интерфейсе происходит из CONSTANT_InterfaceMethodref_info.

Ссылка на дескриптор метода происходит из CONSTANT_MethodHandle_info.

Ссылка на тип метода происходит из CONSTANT_MethodType_info.

Символические ссылки на динамически вычисляемые константы поступают из CONSTANT_MethodType_info.

Ссылка на динамически вычисляемый сайт вызова поступает из CONSTANT_InvokeDynamic_info.

Пул строк Постоянный пул строк

Когда мы говорили о пуле констант времени выполнения, мы упомянули, что константы String являются ссылками на объекты String. Так где же размещаются эти созданные объекты String?

Правильно, это пул строковых констант String Pool.

В каждой JVM поддерживается только одна копия этого пула строк. разделяется всеми классами.

Струнный пул хранится в области метода до 1,6. Он был помещен в Java Heap после 1.8.

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

Так вот вопрос?

String name = new String("www.flydean.com");

Сколько объектов создано?

Суммировать

Пул констант в файле класса хранит строковые константы, имена классов и интерфейсов, имена полей и другие константы, на которые ссылается класс. На каждый класс по одному экземпляру.

Пул констант времени выполнения содержит ссылки на статические константы и символические ссылки, созданные из пула констант файла класса. На каждый класс по одному экземпляру.

Пул строковых констант содержит экземпляры «character» для ссылки пулом констант времени выполнения.

Пул констант времени выполнения находится во взаимно однозначном соответствии с классами или интерфейсами.Если класс генерирует два объекта экземпляра, эти два объекта экземпляра совместно используют пул констант времени выполнения или создают два разных пула констант? Добро пожаловать, друзья, чтобы оставить сообщение для обсуждения.

Ссылка на эту статью:woohoo. Флойд press.com/JVM-run-topic…

Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!