1. введение
Когда мы компилируем файл .java , мы получаем отдельный файл класса с расширением .class . Файл .class состоит из нескольких разделов, и одним из них является постоянный пул.
В этом кратком руководстве мы рассмотрим детали постоянного пула. Кроме того, мы увидим, какие типы он поддерживает и как он форматирует информацию.
2. Постоянный пул в Java
Проще говоря, пул констант содержит константы, необходимые для выполнения кода определенного класса. По сути, это структура данных времени выполнения, похожая на таблицу символов. Это представление среды выполнения для каждого класса или интерфейса в файле класса Java.
Содержимое пула констант состоит из символьных ссылок, генерируемых компилятором. Эти ссылки представляют собой имена переменных, методов, интерфейсов и классов, на которые ссылается код. JVM использует их для связи кода с другими классами, от которых он зависит.
Давайте разберемся в структуре пула констант с помощью простого класса Java:
public class ConstantPool { public void sayHello() { System.out.println("Hello World"); } }
Чтобы просмотреть содержимое пула констант, нам нужно сначала скомпилировать файл, а затем выполнить команду:
javap -v name.class
Приведенная выше команда даст результат:
#1 = Methodref #6.#14 // java/lang/Object."":()V #2 = Fieldref #15.#16 // java/lang/System.out:Ljava/io/PrintStream; #3 = String #17 // Hello World #4 = Methodref #18.#19 // java/io/PrintStream.println:(Ljava/lang/String;)V #5 = Class #20 // com/baeldung/jvm/ConstantPool #6 = Class #21 // java/lang/Object #7 = Utf8 #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 sayHello #12 = Utf8 SourceFile #13 = Utf8 ConstantPool.java #14 = NameAndType #7:#8 // " ":()V #15 = Class #22 // java/lang/System #16 = NameAndType #23:#24 // out:Ljava/io/PrintStream; #17 = Utf8 Hello World #18 = Class #25 // java/io/PrintStream #19 = NameAndType #26:#27 // println:(Ljava/lang/String;)V #20 = Utf8 com/baeldung/jvm/ConstantPool #21 = Utf8 java/lang/Object #22 = Utf8 java/lang/System #23 = Utf8 out #24 = Utf8 Ljava/io/PrintStream; #25 = Utf8 java/io/PrintStream #26 = Utf8 println #27 = Utf8 (Ljava/lang/String;)V
#n указывает ссылки на постоянный пул. #17-это символическая ссылка на строку “Hello World” , #18-это System.out , а #19-это println. Аналогично , #8 подчеркивает, что возвращаемый тип метода – void , а #20-это полное имя класса.
Важно отметить, что постоянная таблица пула начинается с индекса 1. Значение индекса 0 считается недопустимым индексом.
2.1. Типы
Постоянный пул поддерживает несколько типов:
- Integer , Float : с 32-битными константами
- Double , Long : с 64-битными константами
- String : 16-битная строковая константа, указывающая на другую запись в пуле, содержащую фактические байты
- Class : содержит полное имя класса
- Utf 8 : поток байтов
- Имя и тип : пара значений, разделенных двоеточием, первая запись представляет имя, а вторая-тип
- Fieldref , Methodref , InterfaceMethodref : пара значений, разделенных точками, первое значение указывает на Class запись, тогда как второе значение указывает как NameAndType запись
А как насчет других типов, таких как boolean , short и byte ? Эти типы представлены в пуле как Integer constant.
2.2. Формат
Каждая запись в таблице подчиняется общему формату:
cp_info { u1 tag; u1 info[]; }
Начальный 1-байтовый тег указывает вид константы. Как только JVM захватывает и перехватывает теги, он знает, что следует за тегом. Обычно за тегом следуют два или более байта для передачи информации об этой константе.
Давайте рассмотрим некоторые типы и их индексы тегов:
- Utf 8 : 1
- Целое число : 3
- Поплавок : 4
- Длинный : 5
- Двойной : 6
- Ссылка на класс: 7
- Строка ссылка: 8
Постоянный пул любого класса или интерфейса создается только после завершения загрузки JVM.
3. Заключение
В этой краткой статье мы узнали о постоянном пуле в JVM. Мы видели, что он содержит символические ссылки, которые используются для определения местоположения реальных объектов. Кроме того, мы рассмотрим, как пул форматирует информацию о константах и их типах.
Как всегда, фрагмент кода можно найти на Github .