> Что хранится в стеке и в куче в Java (Java)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Eltex

Стек: Java

> Пример ответа

В Java память делится на две основные области: стек (Stack) и куча (Heap).

Стек (Stack) - это область памяти, работающая по принципу LIFO (последним пришёл - первым ушёл). В стеке хранятся:

  • Примитивные типы (int, double, boolean, char и т.д.) - их значения непосредственно.

  • Ссылки на объекты (адреса в куче).

  • Локальные переменные методов и параметры вызова.

  • Кадры стека (stack frames) для каждого вызова метода, включая адрес возврата.

Стек автоматически управляется JVM: при вызове метода создаётся новый кадр, при завершении - удаляется. Размер стека фиксирован (обычно 1 МБ на поток), и переполнение вызывает StackOverflowError.

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

  • Все объекты (экземпляры классов, массивы, строки), созданные через new или автоматически (например, строковые литералы в пуле строк).

  • Поля объектов (включая примитивные типы, если они являются частью объекта).

  • Статические переменные (в некоторых реализациях JVM - в специальной области Metaspace, но исторически - в куче).

Куча управляется сборщиком мусора (Garbage Collector), который удаляет объекты, на которые нет активных ссылок. Размер кучи можно настраивать (например, -Xmx). Переполнение кучи вызывает OutOfMemoryError.

Пример для наглядности:

JAVA
public void example() {
int a = 5; // a в стеке (примитив)
String s = "hello"; // s - ссылка в стеке, объект "hello" в куче (пул строк)
List<Integer> list = new ArrayList<>(); // list - ссылка в стеке, объект ArrayList в куче
}

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью