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

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

Ответ

Хранение данных ссылочного типа разделено на две области памяти:

  1. Сам объект (его состояние, поля) всегда создается и хранится в куче (Heap).
  2. Переменная-ссылка (указатель на этот объект) хранится либо в стеке (Stack), если это локальная переменная, либо внутри другого объекта в куче, если это поле.

Пример:

public class ReferenceExample {
    private Object fieldRef = new Object(); // 1. Объект Object в куче.
                                            // 2. Ссылка fieldRef хранится в куче как часть экземпляра ReferenceExample.

    public void method() {
        Object localRef = new Object(); // 1. Объект Object в куче.
                                        // 2. Ссылка localRef хранится в стеке (фрейме метода `method`).
    }
}

Почему такая архитектура?

  • Куча: Позволяет объектам существовать дольше, чем выполнение одного метода, и управляется сборщиком мусора (Garbage Collector).
  • Стек: Обеспечивает быстрый аллокацию/освобождение памяти для локальных переменных и четкий контроль за временем жизни ссылок (уничтожаются при выходе из метода).