Konfigurieren von Stapelgrößen in der JVM

1. Übersicht

In diesem kurzen Tutorial erfahren Sie, wie Sie die Thread-Stapelgrößen in der HotSpot-JVM konfigurieren.

2. Standardstapelgröße

Jeder JVM-Thread verfügt über einen privaten nativen Stapel zum Speichern von Aufrufstapelinformationen, lokalen Variablen und Teilergebnissen. Daher spielt der Stapel eine entscheidende Rolle bei Methodenaufrufen. Dies ist Teil der JVM-Spezifikation, und folglich verwendet jede JVM-Implementierung Stapel.

Andere Implementierungsdetails, wie z. B. die Stapelgröße, sind jedoch implementierungsspezifisch. Von nun an konzentrieren wir uns auf die HotSpot-JVM und verwenden die Begriffe JVM und HotSpot-JVM austauschbar.

Auf jeden Fall erstellt die JVM Stapel zur gleichen Zeit, zu der sie den Eigentümer-Thread erstellt.

Wenn wir keine Größe für die Stapel angeben, erstellt die JVM eine mit einer Standardgröße. Normalerweise hängt diese Standardgröße vom Betriebssystem und der Computerarchitektur ab. Dies sind beispielsweise einige der Standardgrößen ab Java 14:

  • Linux / x86 (64-Bit): 1 MB
  • macOS (64-Bit): 1 MB
  • Oracle Solaris (64-Bit): 1 MB
  • Unter Windows verwendet die JVM die systemweite Stapelgröße

Grundsätzlich können wir in den meisten modernen Betriebssystemen und Architekturen ungefähr 1 MB für jeden Stack erwarten.

3. Anpassen der Stapelgröße

Um die Stapelgröße zu ändern, können wir die Verwendung -Xss Tuning Flagge. Zum Beispiel setzt der -Xss1048576 die Stapelgröße auf 1 MB:

java -Xss1048576 // omitted

Wenn wir die Größe nicht in Bytes berechnen möchten, können wir einige praktische Verknüpfungen verwenden, um verschiedene Einheiten anzugeben - den Buchstaben k oder K für KB, m oder M für MB und g oder G für GB. Sehen wir uns zum Beispiel verschiedene Möglichkeiten an, um die Stapelgröße auf 1 MB festzulegen:

-Xss1m -Xss1024k

Ähnlich wie bei -Xss können wir auch das Optimierungsflag -XX: ThreadStackSize verwenden, um die Stapelgröße zu konfigurieren. Die Syntax für -XX: ThreadStackSize ist jedoch etwas anders. Wir sollten die Größe und den Flaggennamen durch ein Gleichheitszeichen trennen:

java -XX:ThreadStackSize=1024 // omitted

Mit der HotSpot-JVM können wir keine Größe verwenden, die unter einem Mindestwert liegt:

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

Außerdem können wir keine Größe verwenden, die über dem Maximalwert (normalerweise 1 GB) liegt:

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

In diesem kurzen Tutorial haben wir gesehen, wie die Thread-Stapelgrößen in der HotSpot-JVM konfiguriert werden.