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