В какой области памяти Java (Memory Area) находится String Pool?

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

Ответ

String Pool (пул строк) находится в Heap (куче), а точнее — в ее специальной области под названием Metaspace (начиная с Java 8) или Permanent Generation (в более ранних версиях).

Ключевые детали:

  1. Heap (Куча): Область памяти, управляемая сборщиком мусора (Garbage Collector). Все объекты, включая объекты String, создаются в куче.
  2. String Pool — это часть кучи. Это хэш-таблица, которая хранит уникальные литералы строк и строки, явно добавленные через метод intern().
  3. Цель пула: Экономия памяти за счет повторного использования неизменяемых (immutable) строковых объектов.

Пример:

String s1 = "Hello"; // Литерал "Hello" помещается в String Pool (если его там еще нет).
String s2 = "Hello"; // s2 получает ссылку на тот же объект из пула.
String s3 = new String("Hello"); // Создается новый объект в куче ВНЕ пула.
String s4 = s3.intern(); // s4 получает ссылку на объект из пула ("Hello").

System.out.println(s1 == s2); // true (одна и та же ссылка из пула)
System.out.println(s1 == s3); // false (разные объекты в памяти)
System.out.println(s1 == s4); // true (s4 теперь ссылается на объект из пула)

Почему в куче? Пул строк должен динамически изменяться (добавлять новые строки) и очищаться сборщиком мусора, если на его объекты больше нет ссылок, что характерно для управляемой области Heap.