Где хранятся локальные переменные методов в Java?

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

Ответ

Локальные переменные методов (включая параметры) хранятся в стеке памяти (Stack Memory), в области, называемой стековым фреймом (stack frame).

Как это работает:

  1. При каждом вызове метода JVM создает для него новый стековый фрейм и помещает его на вершину стека потока.
  2. В этом фрейме выделяется память для:
    • Примитивных переменных ( int, boolean, char и т.д.) — значение хранится прямо в стеке.
    • Ссылок на объекты — сама ссылка (адрес памяти) хранится в стеке, а объект, на который она указывает, размещается в куче (Heap Memory).
  3. По завершении метода его фрейм удаляется (pop) из стека, и все локальные переменные уничтожаются.

Пример:

public void calculate(int multiplier) { // Параметр 'multiplier' — в стеке
    int localValue = 10;               // Примитив 'localValue' — в стеке
    String message = "Result: ";       // Ссылка 'message' — в стеке, объект String — в куче
    Object data = new Object();        // Ссылка 'data' — в стеке, объект Object — в куче
} // Конец метода: фрейм удаляется, localValue и ссылки уничтожаются.
   // Объекты в куче будут удалены сборщиком мусора, если на них не осталось ссылок.

Почему это важно: Такая организация обеспечивает изоляцию данных методов, быстрый доступ к переменным и автоматическое управление памятью для локальных данных.