Где находится String Pool в Java?

«Где находится String Pool в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

String Pool (пул строк) — это специальная область памяти внутри кучи (Heap), предназначенная для хранения уникальных литералов строк (String). Его основная цель — оптимизация памяти за счет предотвращения дублирования неизменяемых (immutable) строковых объектов.

Как строки попадают в пул:

  • Автоматически — при использовании строковых литералов: String s = "text";
  • Явно — при вызове метода intern(): new String("text").intern();

Пример, демонстрирующий работу пула:

String literal1 = "java";       // Создается в String Pool
String literal2 = "java";       // Переиспользует объект из пула
String newString = new String("java"); // Создается новый объект в куче, ВНЕ пула
String interned = newString.intern(); // Помещает строку в пул (или находит существующую)

System.out.println(literal1 == literal2);   // true (одна ссылка)
System.out.println(literal1 == newString);  // false (разные объекты)
System.out.println(literal1 == interned);   // true (теперь одна ссылка)

Важно: Начиная с Java 7, String Pool был перемещен из PermGen (Permanent Generation) в основную Heap-область, что позволило избежать ошибок OutOfMemoryError: PermGen space и упростить сборку мусора для строк.