Какова цель пула констант Java?
в настоящее время я пытаюсь углубиться в спецификацию виртуальной машины Java. Я читал внутри книги JVM онлайн и есть одна запутанная абстракция, которую я не могу понять: постоянный пул. вот отрывок из книги:
для каждого типа, который он загружает, виртуальная машина Java должна хранить постоянный пул. Пул констант-это упорядоченный набор констант, используемых типом, включая литералы (string, integer и floating point константы) и символические ссылки на типы, поля и методы. На записи в пуле констант ссылается индекс, так же как и на элементы массива. Поскольку он содержит символические ссылки на все типы, поля и методы, используемые типом, пул констант играет центральную роль в динамическом связывании программ Java
У меня есть несколько вопросов о выше и CP в целом:
- находится ли CP в
.class
файл для каждого типа? - что автор подразумевает под "символической ссылкой"?
- какова цель постоянного пула, на простом английском языке?
4 ответа:
Я думаю, что понимание того, как каркас построен с помощью схемы поможет.
кадр находится там, где находятся операнды (инструкции по эксплуатации), и именно там происходит динамическое связывание. Это сокращенный способ, так сказать, используя постоянный пул, чтобы отслеживать класс и его членов.
каждый кадр содержит ссылку на пул констант времени выполнения. Ссылки на постоянный пул для класса метода выполняется для этого кадра. Эта ссылка помогает поддерживать динамическое связывание.
код 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 относится к тому же объекту, т. е. "Прасад".
Я надеюсь, что это будет полезно
подробнее http://www.journaldev.com/797/what-is-java-string-pool