Каков размер стека потока в Java и как его изменить?

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

Ответ

Размер стека потока (Stack) в Java — это область памяти, выделяемая под каждый поток для хранения фреймов методов, локальных переменных и информации о вызовах.

Размер по умолчанию зависит от JVM и платформы:

  • Современные 64-битные JVM: обычно 1 МБ.
  • 32-битные JVM: обычно 320 КБ.

Изменение размера: Размер задается параметром JVM -Xss (или -XX:ThreadStackSize).

# Запуск приложения с размером стека 2 МБ
java -Xss2m -jar MyApplication.jar

Ключевые моменты:

  1. StackOverflowError: Возникает при исчерпании выделенной памяти стека, чаще всего из-за глубокой или бесконечной рекурсии.
  2. Факторы, влияющие на использование: Глубина стека зависит не только от глубины вызовов, но и от размера каждого фрейма (количество и тип локальных переменных, аргументов метода).
  3. Компромисс: Увеличение размера стека позволяет иметь более глубокую цепочку вызовов, но уменьшает максимальное количество потоков, которое можно создать в пределах доступной памяти процесса.