Ответ
Размер стека потока в JVM — настраиваемый параметр, а не фиксированная величина. Память выделяется не из кучи (heap), а из отдельной области.
Размер стека по умолчанию:
- Зависит от платформы и версии JVM.
- Типичные значения: от 512 КБ до 1 МБ (например, в 64-битной HotSpot JVM часто 1 МБ).
Как задать размер явно:
- Через конструктор
Thread:Thread thread = new Thread(null, myRunnable, "MyThread", 2 * 1024 * 1024); // 2 МБ - Через аргумент командной строки JVM:
java -Xss2m MyApplication # Устанавливает размер стека в 2 МБ для всех потоковАльтернативные формы:
-Xss2048k,-Xss2097152.
Что хранится в стеке потока:
- Локальные переменные методов.
- Вызовы методов и их возвращаемые адреса (стек вызовов).
- Примитивные типы и ссылки на объекты (сами объекты лежат в куче).
Последствия неправильной настройки:
-Xssслишком мал: РискStackOverflowErrorпри глубокой рекурсии или большом количестве локальных переменных.-Xssслишком велик: Ограничивает максимальное количество потоков, которое можно создать (так как общая память под стеки ограничена).
Практическое правило: Увеличивайте -Xss только при возникновении StackOverflowError в легитимном сценарии (например, глубокая рекурсия). Для большинства задач хватает значения по умолчанию.
Ответ 18+ 🔞
Так, слушай сюда, про стек потока в JVM. Это ж не какая-то хуйня железобетонная, а настраиваемый параметр, его можно крутить-вертеть. И память для него берётся не из общей кучи, где объекты болтаются, а из своей отдельной, блядь, резервации.
Сколько по умолчанию отсыпают? А хер его знает точно! Зависит от того, на чём ты сидишь и какую JVM в рот взял. Обычно где-то от 512 КБ до 1 МБ. На 64-битной HotSpot, например, часто ровно мегабайт дают, не больше.
А если мало или много? Как своё, блядь, выклянчить?
- Прямо при создании потока, внаглую:
Thread thread = new Thread(null, myRunnable, "MyThread", 2 * 1024 * 1024); // На, жри 2 МБ - Всей программе сразу, через аргументы JVM: Запускаешь и говоришь:
java -Xss2m MyApplication // Всем потокам по 2 МБ, и ни байтом меньше!Можно и так:
-Xss2048k, или вот так совсем уж точно:-Xss2097152. Главное — чтоб JVM не обосралась от удивления.
А что там, в этом стеке, вообще лежит? Да обычная лабуда: локальные переменные твоих методов, цепочка вызовов — кто кого позвал, и ссылочки на объекты в куче. Самые объекты, ясное дело, туда не влазят, они жирные.
К чему вся эта ёбля может привести?
- Сделал
-Xssслишком маленьким: Получи, блядь,StackOverflowErrorна ровном месте, как только рекурсия чуть глубже обычного или методов много навызывали. - Сделал
-Xssслишком большим: Ну всё, пидарас, теперь ты можешь создать потоков в два раза меньше, потому что память-то общая! Каждому потоку по дворцу отгрохал, а они все в одной квартире ютиться должны.
Вывод, блядь, простой: Не лезь без дела. Не трогай -Xss, пока тебя реально не начнёт выбрасывать из стека с ошибкой по-серьёзному. Для 99% дефолта хватает за глаза, а остальное — уже понты и узкие специфичные случаи.