В чем разница между стеком (stack) и кучей (heap) в контексте памяти JVM?

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

Ответ

Стек и куча — это две основные области памяти, управляемые JVM, с разным назначением и жизненным циклом.

Сравнение: Параметр Стек (Stack Memory) Куча (Heap Memory)
Назначение Хранение примитивов и ссылок на объекты в рамках вызова метода. Хранение всех объектов и их полей (включая массивы).
Структура Организован по принципу LIFO (Last-In-First-Out). Древовидная структура (поколения: Young, Old).
Доступ Очень быстрый (указатель смещения). Относительно медленнее.
Размер Ограниченный, задается при создании потока (-Xss). Крупный, настраивается (-Xms, -Xmx).
Управление Автоматическое (push/pop при входе/выходе из метода). Управляется сборщиком мусора (Garbage Collector).
Потокобезопасность Приватная область для каждого потока. Общая для всех потоков, требует синхронизации.
Время жизни Пока выполняется метод (фрейм стека). Пока на объект есть активная ссылка.

Визуализация в коде:

public class MemoryDemo {
    // Поле 'name' (сам объект String) - в куче. Ссылка в объекте MemoryDemo.
    private String name = "Demo";

    public void calculate(int value) { // 'value' и ссылка 'this' - в стеке фрейма метода
        int localVar = value * 10; // Примитив 'localVar' - в стеке
        Object helper = new Object(); // Сам объект Object - в куче. Ссылка 'helper' - в стеке.
        // При выходе из метода фрейм очищается: localVar и ссылка helper удаляются.
        // Объект Object в куче станет кандидатом на GC, если на него нет других ссылок.
    }
}

Ключевой вывод: Примитивы и ссылки живут в стеке метода, а объекты, на которые они указывают, — всегда в куче.