Пул строк создается в области PermGen или области объектов кучи.

ЗДЕСЬ, автор говорит, что

3) Пул строк создается в области PermGen кучи, сборка мусора может происходить в постоянном пространстве, но зависит от JVM для JVM. Кстати, из обновления JDK 1.7 пул строк перемещен в область кучи, где создаются объекты.

Есть ли конкретная причина, почему это делается? Я не могу найти в Интернете. И каковы последствия?


person Andy897    schedule 23.01.2015    source источник
comment
Не ответ на этот вопрос, но может иметь значение: с Java 8 больше нет пространства PermGen.   -  person meskobalazs    schedule 23.01.2015
comment
Куча легче очищается, контролируется и настраивается, чем Perm Gen или Metaspace.   -  person Peter Lawrey    schedule 23.01.2015


Ответы (2)


Переход на Metaspace был необходим, поскольку PermGen было очень сложно настроить.

Кроме того, было сложно определить размер PermGen, поскольку размер зависел от множества факторов, таких как общее количество классов, размер пулов констант, размер методов и т. д.

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

person Walt    schedule 23.01.2015

В дни Java 6 все интернированные строки хранились в PermGen — части кучи фиксированного размера, которая в основном использовалась для хранения загруженных классов и пула строк. Помимо явно интернированных строк, пул строк PermGen также содержит все литеральные строки, ранее использовавшиеся в вашей программе.

Самой большой проблемой пула строк в Java 6 было его расположение — файл PermGen. PermGen имеет фиксированный размер и не может быть расширен во время выполнения. Вы можете установить его с помощью опции -XX:MaxPermSize=N.

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

Ссылка: http://java-performance.info/string-intern-in-java-6-7-8/

person Tanmoy Bhattacharjee    schedule 23.01.2015