Ответ
Стек (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).