Пул констант что это
Какова цель пула констант Java?
в настоящее время я пытаюсь углубиться в спецификацию виртуальной машины Java. Я читал внутри книги JVM онлайн и есть одна запутанная абстракция, которую я не могу понять: постоянный пул. вот отрывок из книги:—4—>
для каждого загружаемого типа виртуальная машина Java должна хранить постоянный пул. Пул констант-это упорядоченный набор констант, используемых типом, включая литералы (string, integer и floating point константы) и символические ссылки на типы, поля и методы. На записи в пуле констант ссылается индекс, как и на элементы массива. Поскольку он содержит символические ссылки на все типы, поля и методы, используемые типом, постоянный пул играет центральную роль в динамическом связывании программ Java
У меня есть несколько вопросов о вышеизложенном и CP в целом:
4 ответов
Я думаю, что понимание того, как каркас построен с помощью схемы поможет.
фрейм-это место, где находятся операнды (инструкции по эксплуатации), и именно там происходит динамическая связь. Это сокращенный способ, так сказать, используя постоянный пул для отслеживания класса и его членов.
каждый кадр содержит ссылку на пул констант среды выполнения. Ссылки на пул констант для класса метода быть казненным за этот кадр. Эта ссылка помогает поддерживать динамическое связывание.
код C/C++ обычно компилируется в объектный файл, затем несколько объектных файлов связываются вместе с продуктом, используемым артефактом, таким как исполняемый файл или dll. На этапе связывания символьные ссылки в каждом объектном файле заменяются фактическим адресом памяти относительно конечного исполняемого файла. В Java эта фаза связывания выполняется динамически во время выполнения.
когда файл Java скомпилированные, все ссылки на переменные и методы хранятся в пуле констант класса в качестве символической ссылки. Символическая ссылка-это логическая ссылка, а не ссылка, которая фактически указывает на местоположение физической памяти.
вот ссылка Джеймс цветет JVM Internals для получения более подробной информации.
эти константы включают литералы, заданные программистом, и символьные ссылки, созданные компилятором. Символические ссылки в основном имена классов, методов и полей, на которые ссылается код. Эти ссылки используются JVM для связи вашего кода с другими классами, от которых он зависит.
например, следующий код
выдает следующий байт-код ( javap выход)
#n вот ссылки на постоянный пул. #2 является символической ссылкой на
какова цель постоянного пула, на простом английском языке?
CP-это область памяти, в которой хранятся уникальные постоянные значения для уменьшения избыточности:
в CP есть только один строковый объект «Hello», и компилятор заменяет в обеих строках одну и ту же ссылку. Ваш.файл класса содержит только одну строку «Привет». (То же самое для других типов).
давайте сначала приведем пример, чтобы понять, что означает пул строковых констант
что происходит здесь шаг за шагом
1-класс загружается при вызове JVM.
4-Ссылка для литерала «Прасад» будет помещен в память пула констант строки.
5-Затем он находит другой переменная s2 который ссылается на тот же строковый литерал «Прасад».
теперь, когда JVM уже нашел строковый литерал «Прасад», и переменные s и s2 wil относятся к тому же объекту, т. е. «Прасад».
Русские Блоги
Глубокое понимание пула констант Java
Справочник статей
Распределение виртуальной памяти JVM:
Преимущества постоянного пула
Постоянный пул позволяет избежать частого создания и разрушения объектов и повлиять на производительность системы, что обеспечивает совместное использование объектов.
Например, пул строковых констант, поместите все строковые литералы в пул констант на этапе компиляции.
(1) Сохранение памяти: все одинаковые строковые константы в пуле констант объединяются и занимают только один пробел.
(2) Сохранить время выполнения: при сравнении строк, == Быстрее, чем равно (). Для двух ссылочных переменных просто используйте ==, чтобы определить, равны ли ссылки, и вы также можете определить, равны ли фактические значения.
Во-первых, давайте объясним, что в java оператор == используется непосредственно. Сравниваются адреса ссылок двух строк, а не содержимое сравнения. Пожалуйста, используйте String.equals () для сравнения.
s1 == s2 Это очень легко понять. При присваивании значений s1 и s2 используются строковые литералы. В местном языке строка записывается напрямую. Во время компиляции этот литерал будет непосредственно помещен в файл класса. В постоянном пуле для достижения мультиплексирования после загрузки постоянного пула во время выполнения s1 и s2 указывают на один и тот же адрес памяти, поэтому они равны.
В s1 == s3 есть яма. Хотя s3 является динамически сшиваемой строкой, все части, участвующие в сшивании, являются известными литералами. Во время компиляции это сшивание будет оптимизировано. Компилятор поможет вам напрямую. Правописание хорошее, поэтому String s3 = «Hel» + «lo»; в файле класса оно оптимизировано для String s3 = «Hello», поэтому s1 == s3 установлено.Только новые объекты, созданные с использованием соединения «+» между объектами String, созданными кавычками, содержащими текст, будут добавлены в пул строк.
s1 == s4, конечно, не равно, хотя s4 также выделено, но новая часть String («lo») не является известным литералом, это непредсказуемая часть, компилятор не оптимизирует, вы должны подождать до времени выполнения Определите результат, в сочетании с теоремой об инвариантности строк, призрак знает, где расположен s4, поэтому адрес должен быть другим.Для всех выражений соединения «+», которые содержат новые объекты (включая ноль) в новом режиме, генерируемые им новые объекты не будут добавлены в пул строк.
s равно t, это один и тот же объект
A и B являются константами, значение является фиксированным, поэтому значение s также является фиксированным, оно было определено при компиляции класса. Другими словами: String s = A + B, эквивалентно: String s = «ab» + «cd»;
s не равно t, это не один и тот же объект
Хотя A и B определены как константы, они не назначаются немедленно. Перед вычислением значения s, когда они назначены и какому значению они присвоены, все переменные. Следовательно, перед присвоением A и B по природе похожи на переменную. Тогда s не могут быть определены во время компиляции, но могут быть созданы только во время выполнения.
На данный момент мы можем сделать три очень важных вывода:
Вы должны обратить внимание на поведение во время компиляции, чтобы лучше понять постоянный пул.
Константы в пуле констант во время выполнения в основном выводятся из пула констант в каждом файле класса.
Когда программа запущена, если вы вручную не добавите константу в пул констант (например, вызов метода intern), в противном случае JVM не будет автоматически добавлять константу в пул констант.
127, (байт, короткое, целое, длинное, символьное, логическое). Эти пять типов классов упаковки создают значения [-128, 127] по умолчанию Соответствующие типы кэшированных данных, но за пределами этого диапазона будут по-прежнему создавать новые объекты.
практика
Как упоминалось ранее, в файле класса есть статический пул констант, который генерируется компилятором и используется для хранения литерала в исходном файле java (эта статья посвящена только литералу), при условии, что у нас есть следующий код java:
Далее идет вход в постоянный пул. Вход использует 2 байта для определения константы с постоянным номером пула. В этом примере значение равно 00 1A, что переводится в 26 в десятичном виде, то есть есть 25 констант, из которых 0-я константа является специальным значением. Таким образом, есть только 25 констант.
Различные типы констант хранятся в пуле констант. Все они имеют свои собственные типы и имеют свои собственные спецификации хранения. В этой статье рассматриваются только строковые константы. Строковые константы начинаются с 01 (1 байт), а затем используют 2 Байт записывает длину строки, а затем фактическое содержимое строки. В этом случае: 01 00 02 68 69.
Русские Блоги
Разница между пулом констант класса, пулом констант и пулом констант времени выполнения
Каталог статей
1. Концепция
1, постоянный пул (Constant Pool)
Постоянный пул (Constant Pool), также называемый пулом констант класса (Class Constant Pool).
Файл java компилируется в файл класса. В дополнение к информации описания версии класса, полей, методов и интерфейсов файл класса также содержит пул констант, который используется для хранения различных литералов, сгенерированных компилятором ( Литеральные) и символические ссылки (Symbolic References).
Символические ссылки) представляют собой набор символов для описания цели, на которую указывает ссылка.Символ может быть любой формой литерала, если он может использоваться для определения местоположения цели без двусмысленности.
Обычно включают следующие три типа констант:
1.1, тип элемента данных в постоянном пуле
Серийный номер | Типы элементов данных в постоянном пуле | Тип флага | Описание типа |
---|---|---|---|
1 | CONSTANT_Utf8 | 1 | Строка Unicode в кодировке UTF-8 |
2 | CONSTANT_Integer | 3 | литерал типа int |
3 | CONSTANT_Float | 4 | литерал типа float |
4 | CONSTANT_Long | 5 | литерал длинного типа |
5 | CONSTANT_Double | 6 | литерал двойного типа |
6 | CONSTANT_Class | 7 | Символьная ссылка на класс или интерфейс |
7 | CONSTANT_String | 8 | Литерал строкового типа |
8 | CONSTANT_Fieldref | 9 | Символическая ссылка на поле |
9 | CONSTANT_Methodref | 10 | Символьные ссылки на методы, объявленные в классе |
10 | CONSTANT_InterfaceMethodref | 11 | Символьная ссылка на метод, объявленный в интерфейсе |
11 | CONSTANT_NameAndType | 12 | Частичная символьная ссылка на поле или метод |
Каждый тип констант имеет свою структуру. Подробнее см. Главу 6 «Углубленное понимание виртуальной машины Java».
2. Пул строк (пул строк, пул строковых констант)
После загрузки класса, после проверки,После подготовительного этапа Вкуча Чтобы сгенерировать экземпляр строкового объекта вСправочное значение хранится в пуле строк。
Помните: в пуле строк хранитсяИсходная величина, Вместо конкретных объектов-экземпляров конкретные объекты-экземпляры хранятся в пространстве, открытом в куче.
Функция String Pool, реализованная в HotSpot VM, представляет собой класс StringTable, который представляет собой хеш-таблицу, в которой хранятся резидентные символы (то есть часть, заключенная в двойные кавычки)Цитата(В отличие от самого резидентного экземпляра строки), то есть после того, как эта StringTable ссылается на некоторые экземпляры строки в куче, они эквивалентны присвоению идентификатора «резидентной строки». Эта StringTable имеет только одну копию в каждом экземпляре виртуальной машины HotSpot, которая используется всеми классами.
2.1. Справочные статьи:
3. Постоянный пул времени выполнения (постоянный пул времени выполнения)
Когда jvm выполняет определенный класс, он должен быть загружен, подключен и инициализирован, а подключение включает три этапа проверки, подготовки и анализа. И когда класс загружается в память, jvm будет пул констант класса Содержание в Пул констант времени выполнения В видно, что Пул констант времени выполнения Также есть по одному на каждый класс.
Приведите пример для иллюстрации:
Процесс выделения памяти программой синтаксического анализа:
Во-первых, в куче будет экземпляр «abc», а ссылочное значение «abc» сохраняется в глобальной StringTable.
Этот пример отличается от приведенного выше.При поиске в StringTable при синтаксическом анализе str3 существует глобальная резидентная ссылка на строку «abc», поэтому адрес ссылки str3 такой же, как и предыдущий.
str4 вызывает функцию intern () во время выполнения и возвращает ссылочное значение def в StringTable. Если нет, добавьте ссылочное значение str2. Здесь уже есть ссылочное значение def в StringTable, поэтому Вернуть ссылочное значение def, добавленное в StringTable в новом str2 выше,
Наконец, str5 также указывает на эталонное значение def в StringTable при его анализе.
После этого анализа легко понять следующие три напечатанных значения.
Прежде всего, после компиляции, в классе пул констант класса Некоторые ссылки на символы хранятся в;
Затем после загрузки класса добавьте пул констант класса Ссылка на символ, сохраненная в, передается в Пул констант времени выполнения в;
Затем после проверки, после этапа подготовки, в куче создается объект экземпляра резидентной строки (то есть объект экземпляра «abc», на который указывает str1 в приведенном выше примере), а затем ссылка на этот объект сохраняется в глобальном пуле строк, также Находится в StringTable;
Наконец, на этапе синтаксического анализа, чтобы заменить символические ссылки в пуле констант времени выполнения прямыми ссылками, затем напрямую запросите StringTable, чтобы убедиться, что значение ссылки в StringTable соответствует значению ссылки в пуле констант времени выполнения.
4. Резюме
2. Информация о файле класса в области метода, взаимосвязь между пулом констант класса и пулом констант времени выполнения.
Вопросы на собеседовании:
2.1. Схема трех взаимосвязей:
2.2, информация о файле класса области метода
Вы можете видеть, что информация файла класса в области методов включает в себя: магические числа, номера версий, пулы констант, классы, родительские классы и массивы интерфейсов, поля, методы и др. Фактически, класс включает в себя информацию о полях и методах.
Следующая диаграмма представляет собой тип данных, хранящихся в файле класса:
2.3, пул констант класса:
2.4. Пул констант времени выполнения:
Ниже приведен исходный код Java:
Видно, что содержимое декомпилированного файла класса может соответствовать приведенному выше. Это отвечает на взаимосвязь между файлом класса и пулом констант файла класса.
Взаимосвязь и различие между пулом констант файла класса и пулом констант времени выполнения
Пул констант файла классов хранит некоторые литералы и ссылки на символы, которые хранятся в области метода после того, как файл класса загружается виртуальной машиной Java.Литералы включают строки и основные типы констант.
2.5. Резюме:
В области метода хранится информация файла класса и пул констант времени выполнения, а информация файла класса включает информацию о классе и пул констант файла класса.
Помимо содержимого в пуле констант файла класса, содержимое пула констант времени выполнения также преобразует ссылку на символ в пуле констант файла класса в прямую ссылку, а содержимое пула констант времени выполнения может быть добавлено динамически. Например, вызов метода intern для String может добавить значение строки в пул констант String. Здесь пул констант String включен в пул констант времени выполнения, но после jdk1.8 пул констант String помещается в кучу.
Русские Блоги
виртуальная машина Java: пул констант времени выполнения
1. Введение в пул констант времени выполнения
Постоянный пул времени выполнения (Runtime Constant Pool), он является частью области метода. В дополнение к описанию версии, полей, методов, интерфейсов и другой информации в файле класса существует также постоянный пул (постоянная таблица пула), который используется для хранения различных буквальных и символьных ссылок, сгенерированных во время компиляции. После загрузки класса содержимое будет сохранено в пуле констант.
Во-вторых, пул информационных констант в файле класса
В-третьих, преимущества постоянного пула
Постоянный пул предназначен для предотвращения частого создания и уничтожения объектов и снижения производительности системы, которая реализует совместное использование объектов. Например, в пуле строковых констант все строковые литералы помещаются в пул констант во время компиляции.
Значение двойного знака равенства ==
Четыре основных типа классов упаковки и постоянные пулы
Большинство классов упаковки базовых типов в java реализуют технологию пула констант, а именно Byte, Short, Integer, Long, Character, Boolean. Эти 5 классов-оболочек создают соответствующие типы данных кэша со значениями [-128, 127] по умолчанию, но новые объекты все равно будут создаваться за пределами этого диапазона. Два типа пакетов с плавающей запятой класса Float, Double не реализуют технологию постоянного пула.
1) Целочисленный и постоянный пул
2) Строковое и постоянное назначение пула обычных методов
3) Строковое и постоянное назначение пула статических методов
ps: Буквальное присвоение: присвоение значения непосредственно справа от знака равенства.
4) Строковый и постоянный метод пула-стажер
Строкаintern()Метод найдет, есть ли в пуле констант такая же строка, и если есть ссылка на строку, Если нет, добавьте свою собственную строку в пул констант. а такжеВозвращает ссылку на константу。
и другие, intern () можно просто рассматривать как хороший способ «добавить String в память кучи» в пул констант.
Еще один пример
постоянная:На языке java определитепостоянныйНеобходимо добавитьfinalКлючевые слова.
5) Строка и постоянное расширение пула
Учитывайте фазу загрузки класса и фактическое время выполнения (т.е. время компиляции и время выполнения).
и другие,Этот оператор создает 2 объекта。
Русские Блоги
Что такое пул строковых констант?
Примечания к личной статье.
Пул констант строк в Java
На следующем рисунке ясно показано, как поддерживать пул строковых констант в памяти кучи Java и как сохранять его в памяти кучи, когда мы создаем строки разными способами. к
Причина, по которой существует пул строковых констант, заключается в том, что String неизменяем в Java, и это реализация концепции интернирования String. Пул строковых констант также является примером модели Flyweight.
Пул строковых констант помогает сэкономить много места для среды выполнения Java, хотя для создания строки требуется больше времени.
Когда мы используем двойные кавычки для создания строки, сначала ищем строку с тем же значением в пуле строковых констант, если она найдена, возвращаем ссылку на нее, в противном случае она создаст новую строку в пуле, а затем вернет новую Ссылка на строку.
Если вы используете оператор new для создания строки, он заставит класс String создать новый объект String в пространстве кучи. Мы можем использовать метод intern (), чтобы поместить его в пул строковых констант или найти строковый объект с тем же значением из пула строковых констант и вернуть его ссылку
Ниже приведена программная реализация пула строковых констант на приведенном выше рисунке:
Результатом вышеуказанной программы является
Иногда в java-интервью вас спросят о пуле строковых констант. Например, сколько строковых объектов создается в следующем операторе:
В приведенном выше заявлении могут быть созданы 1 или 2 строковых объекта. Если в пуле уже есть строка“Cat”, Тогда в пуле будет создана только одна строка“str”, Если в пуле нет строкового литерала“Cat”, Затем он будет создан сначала в пуле, а затем в пространстве кучи, так что всего будет создано 2 строковых объекта.
Простое понимание пула строковых констант
Размещение строк, как и других объектов, требует больших затрат времени и места. Чтобы повысить производительность и уменьшить накладные расходы на память, JVM произвела некоторые оптимизации при создании экземпляров строковых констант. Чтобы уменьшить количество строк, создаваемых в JVM, строковый класс поддерживает пул строк.Когда код создает строковую константу, JVM сначала проверяет пул строковых констант. Если строка уже существует в пуле, возвращается ссылка на экземпляр в пуле. Если строки нет в пуле, строка будет создана и помещена в пул. Java может выполнять эту оптимизацию, потому что строки неизменяемы и могут использоваться совместно, не беспокоясь о конфликтах данных.
Что такое пул констант строк Java? Почему существует такой пул констант?
1. Пул строк, хранящийся в памяти кучи Java.
2. Чтобы данные не конфликтовали друг с другом и т. Д.
Есть еще одна интересная тема. Где находится пул строковых констант в Java?
Расположение пула строковых констант в памяти
Вот простой пример, иллюстрирующий расположение пула строковых констант в памяти.
Не говорите о сплетнях и переходите сразу к коду.
public static void main(String[] args) <
String str2 = new String(array);
// Используйте intern (), чтобы поместить содержимое строки str2 в пул констант
// Это сравнение используется, чтобы показать, что константа строкового литерала находится в том же месте, что и строка, которую мы обработали с помощью intern
// Это хорошо, давайте попробуем нашего лучшего стажера ниже
ArrayList list = new ArrayList ();