Ответ
Стек (Stack) в JVM — это область памяти, выделенная для каждого потока выполнения. В нём хранятся фреймы методов (stack frames), которые создаются при вызове метода и уничтожаются при его завершении (возврате).
Что хранится во фрейме метода:
- Локальные переменные метода:
- Примитивные типы (
int,boolean,charи т.д.) — хранятся непосредственно в стеке. - Ссылки (reference) на объекты — хранятся в стеке, а сами объекты находятся в куче (Heap).
- Примитивные типы (
- Операндный стек (Operand Stack) – Рабочая область для вычислений (временные результаты операций).
- Ссылка на текущий объект (
this) – Для нестатических методов. - Ссылка на константный пул (run-time constant pool) класса для разрешения символов.
- Информация для возврата управления – Адрес возврата после завершения метода.
Пример работы стека:
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(часто из-за бесконечной рекурсии). - Не требует сборки мусора — фреймы удаляются сразу при выходе из метода.