Gymterview
junior

Какой параметр запуска JVM используется для контроля размера стека потока?

Для контроля размера стека потока используется параметр -Xss.

Синтаксис

Пример
java -Xss<размер> MyApp

Примеры:

Пример
java -Xss512k MyApp    # 512 килобайт
java -Xss1m MyApp      # 1 мегабайт
java -Xss2m MyApp      # 2 мегабайта

Значения по умолчанию

Платформа Размер стека по умолчанию
Linux x64 1 МБ
macOS x64 1 МБ
Windows x64 1 МБ (может варьироваться)
32-bit JVM 512 КБ

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

  • Фреймы вызовов методов (call stack frames)
  • Локальные переменные (примитивы и ссылки)
  • Промежуточные результаты вычислений
  • Информация для обработки исключений

Когда увеличивать -Xss

  • StackOverflowError при глубокой рекурсии – увеличьте -Xss.
  • Приложение использует много потоков с глубокими стеками вызовов.

Когда уменьшать -Xss

  • Приложение создаёт много потоков (тысячи) и памяти не хватает: каждый поток выделяет стек, и при 1000 потоках × 1 МБ = 1 ГБ только на стеки.
  • Уменьшение -Xss до 256-512 КБ может существенно снизить потребление памяти.

Программная установка

Размер стека можно задать при создании потока:

Пример
// Размер стека только для этого потока
Thread thread = new Thread(null, runnable, "my-thread", 512 * 1024); // 512 КБ
thread.start();

Virtual Threads (Java 21+)

Для виртуальных потоков параметр -Xss не применяется. Виртуальные потоки используют динамический стек, который начинается с нескольких КБ и растёт по мере необходимости. Это позволяет создавать миллионы виртуальных потоков без проблем с памятью.

Аналогия из жизни. -Xss – это высота шкафа для документов: чем выше шкаф (больше стек), тем больше папок (вызовов методов) можно положить. Но если шкафов много (много потоков), большие шкафы могут не поместиться в комнату (память).

На собеседовании. Запомните: -Xss (или -XX:ThreadStackSize). Типичное значение по умолчанию – 1 МБ. Увеличивают при StackOverflowError, уменьшают при большом количестве потоков для экономии памяти. Также можно задать размер стека программно через конструктор Thread. Для виртуальных потоков это неактуально.