Ответ
Стек вызовов (call stack) — это структура данных, организованная по принципу LIFO (Last In, First Out), которая используется для управления вызовами методов и хранения их контекста выполнения.
Как это работает:
- При вызове метода в стек помещается (push) новый стековый кадр (stack frame).
- Кадр содержит:
- Локальные переменные метода и его параметры.
- Адрес возврата (куда передать управление после завершения метода).
- Ссылку на объект
this(для нестатических методов).
- При завершении метода его кадр извлекается (pop) из стека, и выполнение продолжается с точки вызова.
Пример:
void main() {
a(); // (1) В стеке: main
}
void a() {
b(); // (2) В стеке: a -> main
}
void b() {
// (3) В стеке: b -> a -> main
System.out.println("Глубина стека: " + Thread.currentThread().getStackTrace().length);
} // (4) После завершения b: стек a -> main
Критические ситуации:
- StackOverflowError: Возникает при переполнении стека, чаще всего из-за бесконечной или слишком глубокой рекурсии.
- Каждый поток в Java имеет свой собственный стек вызовов.