В Java: можно ли изменить размер стека потока во время его выполнения?

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

Ответ

Нет, размер стека потока фиксируется при его создании и не может быть изменен во время выполнения.

  • Настройка размера: Размер стека задается для всех потоков глобально при запуске JVM с помощью параметра -Xss (например, -Xss1m). Для отдельного потока его можно задать через конструктор Thread(ThreadGroup group, Runnable target, String name, long stackSize), но это зависит от JVM и ОС.
  • Что хранится в стеке: В нем размещаются фреймы методов, локальные переменные (примитивы и ссылки) и частично результаты вычислений.
  • Ошибка переполнения: При исчерпании выделенной памяти возникает StackOverflowError.

Пример, демонстрирующий фиксированный размер стека:

public class StackExample {
    public static void main(String[] args) {
        // Размер стека задан при запуске: java -Xss256k StackExample
        recursiveCall(1);
    }

    static void recursiveCall(int depth) {
        System.out.println("Глубина: " + depth);
        recursiveCall(depth + 1); // Приведет к StackOverflowError
    }
}