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

Ответ

Размер стека потока в 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 в легитимном сценарии (например, глубокая рекурсия). Для большинства задач хватает значения по умолчанию.

Ответ 18+ 🔞

Так, слушай сюда, про стек потока в JVM. Это ж не какая-то хуйня железобетонная, а настраиваемый параметр, его можно крутить-вертеть. И память для него берётся не из общей кучи, где объекты болтаются, а из своей отдельной, блядь, резервации.

Сколько по умолчанию отсыпают? А хер его знает точно! Зависит от того, на чём ты сидишь и какую JVM в рот взял. Обычно где-то от 512 КБ до 1 МБ. На 64-битной HotSpot, например, часто ровно мегабайт дают, не больше.

А если мало или много? Как своё, блядь, выклянчить?

  1. Прямо при создании потока, внаглую:
    Thread thread = new Thread(null, myRunnable, "MyThread", 2 * 1024 * 1024); // На, жри 2 МБ
  2. Всей программе сразу, через аргументы JVM: Запускаешь и говоришь:
    java -Xss2m MyApplication // Всем потокам по 2 МБ, и ни байтом меньше!

    Можно и так: -Xss2048k, или вот так совсем уж точно: -Xss2097152. Главное — чтоб JVM не обосралась от удивления.

А что там, в этом стеке, вообще лежит? Да обычная лабуда: локальные переменные твоих методов, цепочка вызовов — кто кого позвал, и ссылочки на объекты в куче. Самые объекты, ясное дело, туда не влазят, они жирные.

К чему вся эта ёбля может привести?

  • Сделал -Xss слишком маленьким: Получи, блядь, StackOverflowError на ровном месте, как только рекурсия чуть глубже обычного или методов много навызывали.
  • Сделал -Xss слишком большим: Ну всё, пидарас, теперь ты можешь создать потоков в два раза меньше, потому что память-то общая! Каждому потоку по дворцу отгрохал, а они все в одной квартире ютиться должны.

Вывод, блядь, простой: Не лезь без дела. Не трогай -Xss, пока тебя реально не начнёт выбрасывать из стека с ошибкой по-серьёзному. Для 99% дефолта хватает за глаза, а остальное — уже понты и узкие специфичные случаи.