Где хранятся объекты в памяти во время выполнения Java-программы?

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

Ответ

Основное место хранения объектов — куча (Heap). Это динамически выделяемая область памяти, управляемая JVM и сборщиком мусора (Garbage Collector, GC).

Детализация:

  1. Куча (Heap):

    • Все объекты, созданные оператором new, размещаются здесь.
    • Это общая область памяти для всех потоков приложения.
    • Память в куче освобождается автоматически GC, когда на объект больше нет ссылок.
      MyClass obj = new MyClass(); // Ссылка 'obj' в стеке, сам объект MyClass — в куче.
  2. Стек (Stack):

    • Хранит примитивные типы (int, boolean, char и т.д.) и ссылки на объекты для локальных переменных методов.
    • Каждый поток имеет свой собственный стек.
    • Память освобождается сразу при выходе из области видимости (блока или метода).
      public void someMethod() {
      int count = 10; // Примитив 'count' хранится в стеке.
      String localRef = "Hello"; // Ссылка 'localRef' в стеке, объект String — в куче/пуле строк.
      }
  3. Пул строк (String Pool):

    • Специальная область внутри кучи для хранения литералов строк (String).
    • Обеспечивает повторное использование неизменяемых (immutable) строковых объектов.
      String s1 = "literal"; // Объект может быть создан или взят из пула.
      String s2 = "literal"; // s2 будет ссылаться на тот же объект, что и s1.
      String s3 = new String("literal"); // Принудительно создает новый объект в куче.