Что хранится в стеке (stack) в Java?

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

Ответ

Стек (stack) — это область памяти, используемая для хранения контекста выполнения методов. Для каждого потока создаётся свой стек.

Что хранится в стеке (в стековом кадре — frame):

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

Пример:

public class StackExample {
    public void methodA(int param) { // param и ссылка this в стеке
        int localVar = 10; // localVar (примитив) в стеке
        Object ref = new Object(); // ref (ссылка) в стеке, сам Object — в heap
        methodB(localVar);
    }
    private void methodB(int value) { // Новый кадр стека
        // value и this в стеке этого кадра
    }
}

Ключевые особенности stack:

  • Управляется по принципу LIFO (Last In, First Out).
  • Размер ограничен (задаётся параметром -Xss). Переполнение вызывает StackOverflowError (часто при бесконечной рекурсии).
  • Высокая скорость выделения и освобождения памяти (просто сдвиг указателя).
  • Память освобождается автоматически при выходе из метода.

Главное отличие от heap: В стеке хранятся только ссылки на объекты, сами объекты всегда создаются в куче (heap).