Какова цель пула констант Java?

в настоящее время я пытаюсь углубиться в спецификацию виртуальной машины Java. Я читал внутри книги JVM онлайн и есть одна запутанная абстракция, которую я не могу понять: постоянный пул. вот отрывок из книги:--4-->

для каждого загружаемого типа виртуальная машина Java должна хранить постоянный пул. Пул констант-это упорядоченный набор констант, используемых типом, включая литералы (string, integer и floating point константы) и символические ссылки на типы, поля и методы. На записи в пуле констант ссылается индекс, как и на элементы массива. Поскольку он содержит символические ссылки на все типы, поля и методы, используемые типом, постоянный пул играет центральную роль в динамическом связывании программ Java

У меня есть несколько вопросов о вышеизложенном и CP в целом:

  1. находится в .class файл для каждого тип?
  2. что автор подразумевает под "символической ссылкой"?
  3. какова цель постоянного пула, на простом английском языке?

4 ответов


Я думаю, что понимание того, как каркас построен с помощью схемы поможет.

enter image description here

фрейм-это место, где находятся операнды (инструкции по эксплуатации), и именно там происходит динамическая связь. Это сокращенный способ, так сказать, используя постоянный пул для отслеживания класса и его членов.

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

код C/C++ обычно компилируется в объектный файл, затем несколько объектных файлов связываются вместе с продуктом, используемым артефактом, таким как исполняемый файл или dll. На этапе связывания символьные ссылки в каждом объектном файле заменяются фактическим адресом памяти относительно конечного исполняемого файла. В Java эта фаза связывания выполняется динамически во время выполнения.

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

вот ссылка Джеймс цветет JVM Internals для получения более подробной информации.


постоянный пул является частью .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 является символической ссылкой на


какова цель постоянного пула, на простом английском языке?

CP-это область памяти, в которой хранятся уникальные постоянные значения для уменьшения избыточности:

System.err.println("Hello");
System.out.println("Hello");

в CP есть только один строковый объект "Hello", и компилятор заменяет в обеих строках одну и ту же ссылку. Ваш.файл класса содержит только одну строку "Привет". (То же самое для других типов).

находится в CP .Файл класса для каждого тип?

Да, смотрите сюда:http://en.wikipedia.org/wiki/Java_class_file


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

   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 wil относятся к тому же объекту, т. е. "Прасад".

enter image description here

Я надеюсь, что это будет полезно

подробнее http://www.journaldev.com/797/what-is-java-string-pool