JVM Tuning Flags verkennen

1. Overzicht

Het is mogelijk om de HotSpot JVM af te stemmen met verschillende afstemmingsvlaggen. Aangezien er honderden van dergelijke vlaggen zijn, kan het een beetje beangstigend zijn om ze en hun standaardwaarden bij te houden.

In deze tutorial gaan we een paar manieren introduceren om dergelijke afstemmingsvlaggen te ontdekken en te leren hoe je ermee kunt werken.

2. Overzicht van Java-opties

De Java commando ondersteunt een breed scala aan vlaggen die in de volgende categorieën vallen:

  • Standaardopties die gegarandeerd worden ondersteund door alle JVM-implementaties die er zijn. Meestal worden deze opties gebruikt voor alledaagse handelingen, zoals –Classpath, -cp, –version, enzovoorts
  • Extra opties die niet door alle JVM-implementaties worden ondersteund en die doorgaans kunnen worden gewijzigd. Deze opties beginnen met -X

Houd er rekening mee dat we deze extra opties niet terloops moeten gebruiken. Bovendien, sommige van die aanvullende opties zijn geavanceerder en beginnen met -XX.

In dit artikel gaan we ons concentreren op meer gevorderden -XX vlaggen.

3. JVM-afstemmingsvlaggen

Om de globale JVM-afstemmingsvlaggen weer te geven, kunnen we de PrintFlagsFinal vlag als volgt:

>> java -XX: + PrintFlagsFinal -version [Globale vlaggen] uintx CodeCacheExpansionSize = 65536 {pd product} {standaard} bool CompactStrings = true {pd product} {standaard} bool DoEscapeAnalysis = true {C2 product} {standaard} dubbel G1ConcMarkStepDurationMillis = 10.000000 {product} {standaard} size_t G1HeapRegionSize = 1048576 {product} {ergonomisch} uintx MaxHeapFreeRatio = 70 {beheersbaar} {standaard} // ingekorte openjdk versie "14" 2020-03-17 OpenJDK Runtime Environment (build 14 + 36-1461 ) OpenJDK 64-bits server VM (build 14 + 36-1461, gemengde modus, delen)

Zoals hierboven getoond, hebben sommige vlaggen standaardwaarden voor deze specifieke JVM-versie.

Standaardwaarden voor sommige vlaggen kunnen verschillen op verschillende platforms, wat wordt weergegeven in de laatste kolom. Bijvoorbeeld de Product betekent dat de standaardinstelling van de vlag uniform is op alle platforms; de pd-product betekent dat de standaardinstelling van de vlag platformafhankelijk is. De beheersbaar waarden kunnen tijdens runtime dynamisch worden gewijzigd.

3.1. Diagnostische vlaggen

De PrintFlagsFinal vlag toont echter niet alle mogelijke afstemmingsvlaggen. Bijvoorbeeld, om ook diagnostische afstemmingsvlaggen te zien, moeten we de UnlockDiagnosticVMOptions vlag:

>> java -XX: + PrintFlagsFinal -versie | wc -l 557 >> java -XX: + PrintFlagsFinal -XX: + UnlockDiagnosticVMOptions -version | wc -l 728

Het is duidelijk dat er nog een paar honderd vlaggen zijn als we diagnostische opties opnemen. Het afdrukken van statistieken voor het bijhouden van het native geheugen is bijvoorbeeld alleen beschikbaar als onderdeel van diagnostische vlaggen:

bool PrintNMTStatistics = false {diagnostic} {standaard}

3.2. Experimentele vlaggen

Om ook experimentele opties te zien, moeten we de Ontgrendel ExperimentalVMOptions vlag:

>> java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions -XX: + PrintFlagsFinal -versie | wc -l 809

3.3. JVMCI-vlaggen

Vanaf Java 9 stelt de JVM-compilerinterface of JVMCI ons in staat om een ​​in Java geschreven compiler, zoals Graal, als dynamische compiler te gebruiken.

Om opties met betrekking tot JVMCI te zien, moeten we nog een paar vlaggen toevoegen en zelfs de JVMCI inschakelen:

>> java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions \ >> -XX: + JVMCIPrintProperties -XX: + EnableJVMCI -XX: + PrintFlagsFinal -versie | wc -l 1516

Meestal zou het echter voldoende moeten zijn om globale, diagnostische en experimentele opties te gebruiken en dit zal ons helpen de vlag te vinden die we in gedachten hebben.

3.4. Alles samenvoegen

Deze combinaties van opties kunnen ons helpen een afstemmingsvlag te vinden, vooral als we de exacte naam niet meer weten. Om bijvoorbeeld de afstemmingsvlag te vinden die verband houdt met zachte verwijzingen in Java:

>> alias jflags = "java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions -XX: + PrintFlagsFinal -version" >> jflags | grep Soft size_t SoftMaxHeapSize = 4294967296 {beheersbaar} {ergonomisch} intx SoftRefLRUPolicyMSPerMB = 1000 {product} {standaard}

Aan de hand van het resultaat kunnen we dat gemakkelijk raden SoftRefLRUPolicyMSPerMB is de vlag die we zoeken.

4. Verschillende soorten vlaggen

In de vorige paragraaf hebben we een belangrijk onderwerp verdoezeld: de vlagtypen. Laten we nog eens kijken naar het java -XX: + PrintFlagsFinal -versie output:

[Globale vlaggen] uintx CodeCacheExpansionSize = 65536 {pd product} {standaard} bool CompactStrings = true {pd product} {standaard} bool DoEscapeAnalysis = true {C2 product} {standaard} dubbel G1ConcMarkStepDurationMillis = 10.000000 {product} {default} size_t G1HeapRegionSize 1048576 {product} {ergonomic} uintx MaxHeapFreeRatio = 70 {beheersbaar} {standaard} // afgekapt

Zoals hierboven weergegeven, heeft elke vlag een specifiek type.

Booleaanse opties worden gebruikt om een ​​functie in of uit te schakelen. Dergelijke opties vereisen geen waarde. Om ze in te schakelen, hoeven we alleen maar een plusteken voor de naam van de optie te plaatsen:

-XX: + PrintFlagsFinal

Om ze uit te schakelen, moeten we daarentegen een minteken voor hun naam toevoegen:

-XX: -RestrictContended

Andere vlagtypen hebben een argumentwaarde nodig. Het is mogelijk om de waarde van de optienaam te scheiden door een spatie, een dubbele punt, een gelijkteken, of het argument kan direct volgen op de optienaam (de exacte syntaxis verschilt voor elke optie):

-XX: ObjectAlignmentInBytes = 16 -Xms5g -Xlog: gc

5. Documentatie en broncode

Het vinden van de juiste vlagnaam is één ding. Achterhalen wat die specifieke vlag onder de motorkap doet, is een ander verhaal.

Een manier om dit soort details te achterhalen, is door naar de documentatie te kijken. Bijvoorbeeld, de documentatie voor het Java commando in het JDK-tools specificatiegedeelte is een geweldige plek om te beginnen.

Soms kan geen enkele hoeveelheid documentatie de broncode verslaan. Daarom, als we de naam van een bepaalde vlag hebben, kunnen we de JVM-broncode verkennen om erachter te komen wat er aan de hand is.

We kunnen bijvoorbeeld de broncode van HotSpot JVM van GitHub of zelfs hun Mercurial-repository bekijken en vervolgens:

>> git clone [e-mail beveiligd]: openjdk / jdk14u.git openjdk >> cd openjdk / src / hotspot >> grep -FR 'PrintFlagsFinal'. ./share/runtime/globals.hpp: product (bool, PrintFlagsFinal, false, ./share/runtime/init.cpp: if (PrintFlagsFinal || PrintFlagsRanges) {

Hier zoeken we naar alle bestanden met de PrintFlagsFinal draad. Nadat we de verantwoordelijke bestanden hebben gevonden, kunnen we rondkijken en zien hoe die specifieke vlag werkt.

6. Conclusie

In dit artikel hebben we gezien hoe we bijna alle beschikbare JVM-afstemmingsvlaggen konden vinden en leerden we ook een paar trucs om er effectiever mee te werken.