Что такое стек вызовов (call stack) в Java?

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

Ответ

Стек вызовов (call stack) — это структура данных, организованная по принципу LIFO (Last In, First Out), которая используется для управления вызовами методов и хранения их контекста выполнения.

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

  1. При вызове метода в стек помещается (push) новый стековый кадр (stack frame).
  2. Кадр содержит:
    • Локальные переменные метода и его параметры.
    • Адрес возврата (куда передать управление после завершения метода).
    • Ссылку на объект this (для нестатических методов).
  3. При завершении метода его кадр извлекается (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 имеет свой собственный стек вызовов.