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


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

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

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

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

4 ответа:

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

enter image description here

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

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

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

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

вот ссылка James Blooms 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