Что хранится в стеке (Stack) памяти JVM?

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

Ответ

Стек (Stack) в JVM — это область памяти, выделенная для каждого потока выполнения. В нём хранятся фреймы методов (stack frames), которые создаются при вызове метода и уничтожаются при его завершении (возврате).

Что хранится во фрейме метода:

  1. Локальные переменные метода:
    • Примитивные типы (int, boolean, char и т.д.) — хранятся непосредственно в стеке.
    • Ссылки (reference) на объекты — хранятся в стеке, а сами объекты находятся в куче (Heap).
  2. Операндный стек (Operand Stack) – Рабочая область для вычислений (временные результаты операций).
  3. Ссылка на текущий объект (this) – Для нестатических методов.
  4. Ссылка на константный пул (run-time constant pool) класса для разрешения символов.
  5. Информация для возврата управления – Адрес возврата после завершения метода.

Пример работы стека:

public class StackExample {
    public static void main(String[] args) { // Фрейм main
        int x = 10; // Примитив 'x' — в стеке (фрейм main)
        Object obj = new Object(); // Ссылка 'obj' — в стеке, объект Object — в куче
        int result = calculate(x); // Создаётся фрейм для calculate
    }

    static int calculate(int a) { // Фрейм calculate
        int b = a * 2; // Примитивы 'a' и 'b' — в стеке (фрейм calculate)
        return b;
    } // Фрейм calculate уничтожается, значение 'b' передаётся в фрейм main
}

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

  • Потоко-локальная память: У каждого потока свой стек.
  • Быстрый доступ: Выделение и очистка памяти происходят по простому принципу LIFO.
  • Ограниченный размер: Обычно меньше, чем у кучи. Переполнение приводит к StackOverflowError (часто из-за бесконечной рекурсии).
  • Не требует сборки мусора — фреймы удаляются сразу при выходе из метода.