Stack Sizes configureren in de JVM

1. Overzicht

In deze korte tutorial gaan we zien hoe we de grootte van de thread-stack in de HotSpot JVM kunnen configureren.

2. Standaard stapelformaat

Elke JVM-thread heeft een eigen native stack om call stack-informatie, lokale variabelen en gedeeltelijke resultaten op te slaan. Daarom speelt de stapel een cruciale rol bij methode-aanroepen. Dit maakt deel uit van de JVM-specificatie en daarom gebruikt elke JVM-implementatie die er is stapels.

Andere implementatiedetails, zoals de stapelgrootte, zijn echter implementatiespecifiek. Vanaf nu zullen we ons concentreren op de HotSpot JVM en de termen JVM en HotSpot JVM door elkaar gebruiken.

In ieder geval, de JVM maakt stapels op hetzelfde moment dat het de thread maakt.

Als we geen grootte voor de stapels specificeren, zal de JVM er een maken met een standaardgrootte. Meestal hangt deze standaardgrootte af van het besturingssysteem en de computerarchitectuur. Dit zijn bijvoorbeeld enkele van de standaardformaten vanaf Java 14:

  • Linux / x86 (64-bits): 1 MB
  • macOS (64-bits): 1 MB
  • Oracle Solaris (64-bits): 1 MB
  • In Windows gebruikt de JVM de systeembrede stackgrootte

In principe kunnen we ongeveer 1 MB verwachten voor elke stapel in de meeste moderne besturingssystemen en architecturen.

3. De stapelgrootte aanpassen

Om de stapelgrootte te wijzigen, kunnen we de -Xss afstemmenvlag. Bijvoorbeeld de -Xss1048576 stelt de stapelgrootte in op 1 MB:

java -Xss1048576 // weggelaten

Als we de grootte niet in bytes willen berekenen, kunnen we enkele handige sneltoetsen gebruiken om verschillende eenheden te specificeren - de letter k of K om KB aan te geven, m of M. om MB aan te geven, en g of G om GB aan te geven. Laten we bijvoorbeeld een aantal verschillende manieren bekijken om de stapelgrootte in te stellen op 1 MB:

-Xss1m -Xss1024k

Gelijkwaardig aan -Xss, we kunnen ook de -XX: ThreadStackSize afstemmingsvlag om de stapelgrootte te configureren. De syntaxis voor -XX: ThreadStackSizeis echter een beetje anders. We moeten de grootte en de vlagnaam scheiden met een gelijkteken:

java -XX: ThreadStackSize = 1024 // weggelaten

De HotSpot JVM staat ons niet toe om een ​​grootte te gebruiken die kleiner is dan een minimumwaarde:

$ java -Xss1K -version De opgegeven Java-threadstapelgrootte is te klein. Specificeer tenminste 144k Fout: Kon de Java Virtual Machine niet maken. Fout: er is een fatale uitzondering opgetreden. Programma zal stoppen.

Het staat ons ook niet toe om een ​​groter formaat te gebruiken dan de maximale waarde (meestal 1 GB):

$ java -Xss2g -version Ongeldige threadstackgrootte: -Xss2g De opgegeven grootte overschrijdt de maximaal representeerbare grootte. Fout: kan de Java Virtual Machine niet maken. Fout: er is een fatale uitzondering opgetreden. Programma zal stoppen.

4. Conclusie

In deze korte tutorial hebben we gezien hoe we de grootte van de thread-stack in de HotSpot JVM kunnen configureren.