Какова цель Java Constant Pool?
В настоящее время я пытаюсь углубиться в спецификацию виртуальной машины Java. Я читал Внутри JVM-книги в Интернете, и есть одна запутанная абстракция, которую я не могу понять: Constant Pool. вот выдержка из книги:
Для каждого загружаемого типа виртуальная машина Java должна хранить постоянный пул. Постоянный пул - это упорядоченный набор констант, используемых типом, включая литералы (строковые, целочисленные и константы с плавающей запятой) и символические ссылки на типы, поля и методы. Записи в пуле констант ссылаются на индекс, подобно элементам массива. Поскольку он содержит символические ссылки на все типы, поля и методы, используемые типом, пул констант играет центральную роль в динамической компоновке программ Java
У меня есть несколько вопросов о вышеупомянутом и CP вообще:
- Доступен ли CP в файле
.class
для каждого типа?
- Что означает автор "символическая ссылка"?
- Что такое цель Constant Pool, на простом английском языке?
Ответы
Ответ 1
Я думаю, что понимание того, как кадр будет построен с использованием диаграммы, поможет.
![enter image description here]()
В кадре находятся операнды (инструкции по эксплуатации), и там происходит динамическое связывание. Это сокращенный путь, так сказать, использование постоянного пула для отслеживания класса и его членов.
Каждый кадр содержит ссылку на пул констант времени выполнения. Ссылка указывает на постоянный пул для класса метода, выполняемого для этого фрейма. Эта ссылка помогает поддерживать динамическое связывание.
Код C/С++ обычно скомпилирован в объектный файл, а затем несколько объектных файлов связаны вместе с продуктом пригодного для использования артефакта, такого как исполняемый файл или dll. Во время фазы связывания символические ссылки в каждом объектном файле заменяются фактическим адресом памяти относительно окончательного исполняемого файла. В Java эта фаза связывания выполняется динамически во время выполнения.
Когда файл Java скомпилирован, все ссылки на переменные и методы хранятся в пуле констант класса как символическая ссылка. Символическая ссылка является логической ссылкой, а не ссылкой, которая фактически указывает на физическую память.
Вот ссылка на Джеймс Блумс JVM Internals для более подробной информации.
Ответ 2
Константный пул является частью файла .class
(и его представления в памяти), который содержит константы, необходимые для запуска кода этого класса.
Эти константы включают литералы, указанные программистом и символические ссылки, сгенерированные компилятором. Символические ссылки - это в основном имена классов, методов и полей, на которые ссылается код. Эти ссылки используются JVM, чтобы связать ваш код с другими классами, от которых он зависит.
Например, следующий код
System.out.println("Hello, world!");
выводит следующий байт-код (javap
вывод)
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String Hello, world!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
#n
Здесь приведены ссылки на постоянный пул. #2
является символьной ссылкой на поле System.out
, #3
является строкой Hello, world!
, а #4
является символической ссылкой на метод PrintStream.println(String)
.
Как вы можете видеть, символические ссылки - это не просто имена - например, символическая ссылка на метод также содержит информацию о его параметрах (Ljava/lang/String;
) и тип возврата (V
означает void
).
Вы можете проверить постоянный пул класса, выполнив javap -verbose
для этого класса.
Ответ 3
Что такое цель с постоянным пулом, на простом английском?
CP - это область памяти. Для уменьшения избыточности сохраняются очень уникальные постоянные значения:
System.err.println("Hello");
System.out.println("Hello");
В CP есть только один объект String "Hello", а компилятор заменяет в обеих строках одну и ту же ссылку. Файл .class содержит только одну строку Hello. (То же самое для других типов).
Является ли CP, находящимся в файле .Class для каждого типа?
Да, смотрите здесь: http://en.wikipedia.org/wiki/Java_class_file
Ответ 4
Давайте дадим Пример Сначала, чтобы понять, что означает константный пул строк
public class StringConstantPool {
public static void main(String[] args) {
String s = "prasad";
String s2 = "prasad";
System.out.println(s.equals(s2));
System.out.println(s == s2);
}
}
вывод будет
true
true
что происходит здесь шаг за шагом
1- Класс загружается при вызове JVM.
2- JVM будет искать все строковые литералы в программе.
3- Во-первых, он находит переменную s, которая ссылается на литерал "прасад" и будет создана в памяти
4- Ссылка на литерал "прасад" будет помещена в память пула строковых констант.
5- Затем он находит еще одну переменную s2, которая ссылается на тот же строковый литерал "прасад" .
Теперь, когда JVM уже нашел строковый литерал "прасад" , обе переменные s и s2 относятся к одному и тому же объекту, т.е. "прасад" .
![enter image description here]()
Надеюсь, это будет полезно
подробнее
http://www.journaldev.com/797/what-is-java-string-pool