Вопрос проверяет понимание того, где и как JVM хранит контекст вызовов методов, локальные переменные и как это связано с потоками.
Stack нужен для хранения контекста выполнения методов.
В стеке лежат локальные переменные, параметры методов и информация о том, куда возвращаться после вызова.
Каждый вызов метода добавляет новый «кадр» в стек.
Когда метод завершается, его кадр удаляется, и выполнение возвращается назад.
Stack (стек) — это область памяти, которая помогает JVM выполнять методы и управлять последовательностью вызовов.
Stack — это память потока, в которой JVM хранит кадры вызова методов (stack frame) и все, что нужно для выполнения этих методов.
В каждом stack frame обычно есть:
Параметры метода
Локальные переменные примитивных типов (int, long, boolean и т.д.)
Ссылки на объекты (сами объекты при этом находятся в heap)
Служебная информация
адрес возврата
промежуточные результаты вычислений
Выполнение кода идет так:
Вызываем метод A()
JVM кладет frame метода A() в стек
Внутри A() вызываем метод B()
JVM кладет frame метода B() поверх
B() заканчивается — его frame снимается
JVM продолжает выполнение A()
Пример:
void a() { b(); }
void b() { /* ... */ }
Стек работает по принципу LIFO:
Последний вызванный метод завершается первым
Выделение памяти под frame и освобождение происходят очень быстро
Не нужен GC для очистки стека, потому что кадры снимаются автоматически
Если вызовы методов уходят слишком глубоко, стек переполняется.
Пример бесконечной рекурсии:
int f(int n) {
return f(n + 1); // бесконечно
}
Важно разделять:
В stack лежит ссылка User user
В heap лежит сам объект new User(...)
Пример:
User u = new User(); // u в stack, объект в heap
Stack нужен для выполнения методов: он хранит кадры вызовов, локальные данные и точки возврата.
Он быстрый, потоковый и очищается автоматически при выходе из методов.