Рубрики
Без рубрики

Где находится пул строковых констант Java, Куча или стек?

Автор оригинала: baeldung.

1. введение

Всякий раз, когда мы объявляем переменную или создаем объект, он сохраняется в памяти. На высоком уровне Java делит память на два блока: стек и куча . Обе памяти хранят определенные типы данных и имеют различные шаблоны для их хранения и доступа.

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

2. Пул строковых констант

Строка постоянный пул – это специальная область памяти. Когда мы объявляем String литерал, JVM создает объект в пуле и сохраняет его ссылку в стеке. Перед созданием каждого объекта String в памяти JVM выполняет некоторые шаги, чтобы уменьшить нагрузку на память.

Пул строковых констант использует в своей реализации Hashmap . Каждое ведро Hashmap содержит список String s с одним и тем же хэш-кодом. В более ранних версиях Java область хранения для пула была фиксированного размера и часто приводила к ошибке Не удалось зарезервировать достаточно места для кучи объектов .

Когда система загружает классы, String литералы всех классов переходят в пул уровня приложения. Это связано с тем, что равные строковые литералы разных классов должны быть одинаковыми Объект . В этих ситуациях данные в пуле должны быть доступны каждому классу без какой-либо зависимости.

Обычно в стеке хранятся кратковременные данные. Он включает в себя локальные примитивные переменные, ссылки на объекты кучи и выполняемые методы. Куча позволяет динамическое выделение памяти, хранит объекты Java и классы JRE во время выполнения.

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

Стек хранит данные в непрерывных блоках памяти и разрешает произвольный доступ. Если классу нужна случайная строка | из пула, она может быть недоступна из-за правила LIFO (last-in-first-out) стека. В отличие от этого, куча выделяет память динамически и позволяет нам получить доступ к данным любым способом.

Предположим, у нас есть фрагмент кода, состоящий из различных типов переменных. Стек будет хранить значение литерала int и ссылки на String и демонстрационные объекты . Значение любого объекта будет храниться в куче, и все литералы String будут помещены в пул внутри кучи:

Переменные, созданные в стеке, освобождаются, как только поток завершает выполнение. Напротив, сборщик мусора восстанавливает ресурсы в куче. Аналогично, сборщик мусора собирает не связанные элементы из пула.

Размер пула по умолчанию может отличаться на разных платформах. В любом случае, он все равно намного больше, чем доступный размер стека. До JDK 7 пул был частью пространства permgen, а с JDK 7 по настоящее время он является частью основной памяти кучи.

3. Заключение

В этой короткой статье мы узнали о области хранения для пула констант String . Стек и куча имеют разные характеристики для хранения данных и доступа к ним. От выделения памяти до ее доступа и доступности куча является наиболее подходящей областью для хранения пула строковых констант.

На самом деле пул никогда не был частью стековой памяти.