Конфигуриране на размерите на стека в JVM

1. Общ преглед

В този бърз урок ще видим как да конфигурираме размера на стека на нишките в HotSpot JVM.

2. Размер на стека по подразбиране

Всяка JVM нишка има частен стек за съхраняване на информация за стека повиквания, локални променливи и частични резултати. Следователно стекът играе решаваща роля в извикванията на методите. Това е част от спецификацията на JVM и следователно всяко внедряване на JVM там използва стекове.

Други подробности за изпълнението, като например размера на стека, са специфични за изпълнението. Отсега нататък ще се фокусираме върху HotSpot JVM и ще използваме термините JVM и HotSpot JVM взаимозаменяемо.

Както и да е, JVM ще създава стекове едновременно със създаването на притежаващата нишка.

Ако не посочим размер за стековете, JVM ще създаде такъв с размер по подразбиране. Обикновено този размер по подразбиране зависи от операционната система и компютърната архитектура. Например, това са някои от размерите по подразбиране към Java 14:

  • Linux / x86 (64-битова): 1 MB
  • macOS (64-битова): 1 MB
  • Oracle Solaris (64-битова): 1 MB
  • В Windows JVM използва системния размер на стека

По принцип можем да очакваме около 1 MB за всеки стек в повечето модерни операционни системи и архитектури.

3. Персонализиране на размера на стека

За да променим размера на стека, можем да използваме флага за настройка -Xss . Например -Xss1048576 задава размера на стека, равен на 1 MB:

java -Xss1048576 // omitted

Ако не искаме да изчисляваме размера в байтове, можем да използваме някои удобни преки пътища, за да посочим различни единици - буквата k или K, за да посочи KB, m или M, за да обозначи MB, и g или G, за да посочи GB. Например, нека видим няколко различни начина за задаване на размера на стека на 1 MB:

-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 GB):

$ 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.