1. Обзор
В этом кратком руководстве мы рассмотрим, как настроить размеры стека потоков в HotSpot JVM.
2. Размер стека по умолчанию
Каждый поток JVM имеет собственный собственный стек для хранения информации о стеке вызовов , локальных переменных и частичных результатов. Поэтому стек играет решающую роль в вызовах методов. Это часть спецификации JVM , и, следовательно, каждая реализация JVM использует стеки.
Однако другие детали реализации, такие как размер стека, зависят от реализации. С этого момента мы сосредоточимся на HotSpot JVM и будем использовать термины JVM и HotSpot JVM взаимозаменяемо.
В любом случае, JVM будет создавать стеки одновременно с созданием потока-владельца.
Если мы не укажем размер стеков, JVM создаст их с размером по умолчанию. Обычно этот размер по умолчанию зависит от операционной системы и архитектуры компьютера. Например, вот некоторые из размеров по умолчанию для Java 14:
- Linux/x86 (64-разрядная версия) : 1 МБ
- macOS (64-разрядная версия) : 1 МБ
- Oracle Solaris (64-разрядная версия) : 1 МБ
- В Windows JVM использует общесистемный размер стека
По сути, мы можем ожидать около 1 МБ для каждого стека в большинстве современных операционных систем и архитектур.
3. Настройка размера стека
Чтобы изменить размер стека, мы можем использовать флаг настройки -Xss
. Например, -Xss1048576
устанавливает размер стека равным 1 МБ:
java -Xss1048576 // omitted
Если мы не хотим вычислять размер в байтах, мы можем использовать несколько удобных сокращений для указания различных единиц измерения — буква k
или K
для обозначения КБ, m
или M
для обозначения МБ и g
или G
для обозначения ГБ. Например, давайте рассмотрим несколько различных способов установить размер стека равным 1 МБ:
-Xss1m
-Xss1024k
Подобно -Xss
, мы также можем использовать флаг настройки -XX:ThreadStackSize
для настройки размера стека. Однако синтаксис для -XX:ThreadStackSize
немного отличается. Мы должны разделить размер и имя флага знаком равенства:
java -XX:ThreadStackSize=1024 // omitted
HotSpot JVM не позволит нам использовать размер меньше минимального значения :
$ java -Xss1K -version
The Java thread stack size specified is too small. Specify at least 144k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Кроме того, это не позволит нам использовать размер больше максимального значения (обычно 1 ГБ):
$ java -Xss2g -version
Invalid thread stack size: -Xss2g
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
4. Вывод
В этом кратком руководстве мы увидели, как настроить размеры стека потоков в HotSpot JVM.