Где хранится String Pool в Java?
Как я понимаю, до Java 8 String Pool находился в PermGen, который был частью памяти JVM, но в Java 8 PermGen был заменён на Metaspace с динамически расширяемой областью памяти, вынесенной из Heap. Metaspace теперь хранит метаданные классов, а также Runtime Constant Pool, который был частью PermGen. Правильно ли я понимаю, что String Pool теперь так же как и Runtime Constant Pool хранится в Metaspace, а не в Heap, как это было ранее?
Ответы (1 шт):
Нет, String Pool хранится отдельно в Heap. Интернирование строк происходит не только для класса и его констант, но и может происходить просто в процессе выполнения. Вызывая в цикле тот же String.intern и сделав вывод GC.heap_info памяти можно увидеть как растет Heap и остается неизменным Metaspace.
Назначение Runtime Constant Pool хранить символьную ссылку на String, далее уже конкретное значение которой достается из String Pool в Heap.
Сам PermGem был жестко ограничен и вел к OutOfMemory, поэтому его убрали. Поэтому еще стоит уточнить, что Heap для String Pool сейчас и Heap для PermGen в котором пул был ранее разные понятия.