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

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

Ответ

Стек (Stack) — это область памяти, работающая по принципу LIFO (Last-In-First-Out), выделяемая для каждого потока. В стеке хранятся:

  • Примитивные переменные локальных методов.
  • Ссылки на объекты (сами объекты лежат в куче).
  • Вызовы методов и информация о возврате.

Куча (Heap) — это общая, динамически выделяемая область памяти, доступная всем потокам. В куче хранятся:

  • Все объекты (экземпляры классов).
  • Массивы.

Пример:

void exampleMethod() {
    int primitive = 42; // Примитив хранится в стеке.
    Object objRef = new Object(); // Ссылка `objRef` — в стеке, сам объект Object — в куче.
}
Сравнительная таблица: Критерий Стек (Stack) Куча (Heap)
Назначение Хранение вызовов методов и локальных примитивов/ссылок. Хранение всех объектов и массивов.
Управление Автоматическое (при входе/выходе из метода). Управляется сборщиком мусора (Garbage Collector).
Размер Ограничен, обычно меньше. Может привести к StackOverflowError. Большой, ограничен настройками JVM/системой. Может привести к OutOfMemoryError.
Скорость Высокая (аллокация — просто перемещение указателя). Ниже (требуется управление памятью и возможная дефрагментация).
Потокобезопасность Каждый поток имеет свой стек (thread-local). Общая для всех потоков (требует синхронизации).
Время жизни Данные живут, пока выполняется метод (фрейм стека). Объекты живут до тех пор, пока на них есть ссылки и их не удалит GC.