Что такое параметр размера стека потоков (-Xss) для jvm? Почему у него ограничение не менее 68 КБ на ПК с Windows?

Я видел опцию JVM -Xss - что именно она делает? эту ссылку, но мой вопрос в том, насколько полезен этот вариант.

Потому что, если мы установим минимальное ограничение для значения -Xss, возможно, потоки не будут работать должным образом, поскольку в большинстве случаев это может вызвать ошибку stackOverflow.

Почему существует ограничение 64 КБ по крайней мере для этого значения?
Как я получил это ограничение в 64 КБ, когда я пытался настроить параметры виртуальной машины во время выполнения в IntelliJ iDE, я попытался дать кое-что например 10 КБ, и выскочила эта ошибка, заявив, что для размера стека потоков требуется не менее 64 КБ.

Другой вопрос заключается в том, как найти размер стека потоков по умолчанию для моего jvm, работающего на моем встроенном устройстве, из java-программы?

Спасибо,
Сен


person Sen    schedule 14.08.2014    source источник
comment
Когда в вашей программе много рекурсивных вызовов, полезно иметь большой размер стека. Также стек используется для хранения адресов, чтобы их можно было получить за постоянное время.   -  person Vivin    schedule 14.08.2014
comment
Я думаю, что ответ Адама Адамашека объясняет, как этот параметр полезен - если это не так для вас, можете ли вы уточнить, что еще вы ищете?   -  person user2813274    schedule 14.08.2014
comment
Пожалуйста, задайте свой второй вопрос в отдельном посте. Это совсем другая тема.   -  person apangin    schedule 15.08.2014


Ответы (1)


-Xss позволяет настроить размер стека потоков Java в соответствии с потребностями приложения:

  • больший размер стека предназначен для приложения, использующего рекурсивные алгоритмы или иные глубокие вызовы методов;
  • меньший размер стека предназначен для приложения, которое запускает тысячи потоков. Возможно, вы захотите сэкономить память, занимаемую стеками потоков.

Имейте в виду, что JVM HotSpot также использует тот же стек потоков Java для собственных методов и вызовов времени выполнения JVM (например, для загрузки классов). Это означает, что стек потоков Java используется не только для методов Java, но и JVM должна резервировать некоторые страницы стека для своей собственной работы.

Минимально необходимый размер стека рассчитывается по формуле:

(StackYellowPages + StackRedPages + StackShadowPages + 2*BytesPerWord + 1) * 4096

где

  • StackYellowPages и StackRedPages необходимы для обнаружения и обработки StackOverflowError;
  • StackShadowPages зарезервированы для нативных методов;
  • 2*4 (32-разрядная JVM) или 2*8 (64-разрядная JVM) предназначены для выполнения функций виртуальной машины;
  • дополнительный 1 для рекурсии JIT-компилятора в основном потоке;
  • 4096 — размер страницы по умолчанию.

Например. для 32-битной Windows JVM минимальный размер стека = (3 + 1 + 4 + 2*4 + 1) * 4K = 68K

Кстати, вы можете уменьшить минимальный требуемый размер стека, используя эти параметры JVM: (не рекомендуется!)

-XX:StackYellowPages=1 -XX:StackRedPages=1 -XX:StackShadowPages=1
person apangin    schedule 14.08.2014
comment
Привет, apangin, я просто хочу знать, где я могу найти статьи и документы, которые могут дать больше информации об этом. Поиск StackYellowPages в Google не дал мне хороших результатов. - person Sen; 15.08.2014
comment
@Sen Я сомневаюсь, что об этом есть отдельные статьи, поскольку это конкретная реализация, а не часть какой-либо спецификации. Лучшими источниками информации о HotSpot являются исходный код, список рассылки и система отслеживания ошибок. - person apangin; 16.08.2014