Какова цель 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