Сколько оперативной памяти выделяется под стек нового потока в JVM?

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

Ответ

Размер стека потока в JVM — настраиваемый параметр, а не фиксированная величина. Память выделяется не из кучи (heap), а из отдельной области.

Размер стека по умолчанию:

  • Зависит от платформы и версии JVM.
  • Типичные значения: от 512 КБ до 1 МБ (например, в 64-битной HotSpot JVM часто 1 МБ).

Как задать размер явно:

  1. Через конструктор Thread:
    Thread thread = new Thread(null, myRunnable, "MyThread", 2 * 1024 * 1024); // 2 МБ
  2. Через аргумент командной строки JVM:
    java -Xss2m MyApplication # Устанавливает размер стека в 2 МБ для всех потоков

    Альтернативные формы: -Xss2048k, -Xss2097152.

Что хранится в стеке потока:

  • Локальные переменные методов.
  • Вызовы методов и их возвращаемые адреса (стек вызовов).
  • Примитивные типы и ссылки на объекты (сами объекты лежат в куче).

Последствия неправильной настройки:

  • -Xss слишком мал: Риск StackOverflowError при глубокой рекурсии или большом количестве локальных переменных.
  • -Xss слишком велик: Ограничивает максимальное количество потоков, которое можно создать (так как общая память под стеки ограничена).

Практическое правило: Увеличивайте -Xss только при возникновении StackOverflowError в легитимном сценарии (например, глубокая рекурсия). Для большинства задач хватает значения по умолчанию.