Utforske JVM Tuning Flags

1. Oversikt

Det er mulig å stille inn HotSpot JVM med en rekke tuningflagg. Siden det er hundrevis av slike flagg, kan det være litt skremmende å holde rede på dem og standardverdiene.

I denne opplæringen skal vi introdusere noen måter å oppdage slike innstillingsflagg og lære å jobbe med dem.

2. Oversikt over Java-alternativer

De java kommandoen støtter et bredt utvalg av flagg som faller inn i følgende kategorier:

  • Standardalternativer som garantert støttes av alle JVM-implementeringer der ute. Vanligvis brukes disse alternativene til hverdagslige handlinger som –Klassesti, -cp, –versjon, og så videre
  • Ekstra alternativer som ikke støttes av alle JVM-implementeringer og som vanligvis kan endres. Disse alternativene starter med -X

Vær oppmerksom på at vi ikke bør bruke disse ekstra alternativene tilfeldig. Videre noen av disse tilleggsalternativene er mer avanserte og begynner med -XX.

Gjennom denne artikkelen skal vi fokusere på mer avanserte -XX flagg.

3. JVM Tuning Flags

For å liste de globale JVM-innstillingsflaggene, kan vi aktivere PrintFlagsFinal flagg som følger:

>> java -XX: + PrintFlagsFinal -versjon [Globale flagg] uintx CodeCacheExpansionSize = 65536 {pd product} {default} bool CompactStrings = true {pd product} {default} bool DoEscapeAnalysis = true {C2 product} {default} double G1ConcMarkStepDurationMillis = 10.000000 {produkt} {standard} størrelse_t G1HeapRegionSize = 1048576 {produkt} {ergonomisk} uintx MaxHeapFreeRatio = 70 {håndterbar} {standard} // avkortet openjdk-versjon "14" 2020-03-17 OpenJDK Runtime Environment (build 14 + 36-1461 ) OpenJDK 64-biters server-VM (bygg 14 + 36-1461, blandet modus, deling)

Som vist ovenfor, har noen flagg standardverdier for denne spesielle JVM-versjonen.

Standardverdier for noen flagg kan være forskjellige på forskjellige plattformer, som vises i den siste kolonnen. For eksempel produkt betyr at standardinnstillingen for flagget er ensartet på alle plattformer; de pd produkt betyr at standardinnstillingen for flagget er plattformavhengig. De overkommelig verdier kan endres dynamisk ved kjøretid.

3.1. Diagnostiske flagg

De PrintFlagsFinal flagg viser imidlertid ikke alle mulige innstillingsflagg. For eksempel, for å også se diagnostiske tuningflagg, bør vi legge til Lås oppDiagnosticVMOptions flagg:

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

Det er tydeligvis et par hundre flere flagg når vi inkluderer diagnosealternativer. For eksempel er utskrift av internminnesporingsstatistikk bare tilgjengelig som en del av diagnostiske flagg:

bool PrintNMTStatistics = false {diagnostic} {standard}

3.2. Eksperimentelle flagg

For å også se eksperimentelle alternativer, bør vi legge til Lås oppExperimentalVMOptions flagg:

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

3.3. JVMCI-flagg

Fra og med Java 9 gjør JVM-kompilatorgrensesnittet eller JVMCI oss i stand til å bruke en kompilator skrevet i Java, for eksempel Graal, som en dynamisk kompilator.

For å se alternativer relatert til JVMCI, bør vi legge til noen flere flagg og til og med aktivere JVMCI:

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

Mesteparten av tiden, men bruk av globale, diagnostiske og eksperimentelle alternativer bør imidlertid være tilstrekkelig og vil hjelpe oss med å finne flagget vi har i tankene.

3.4. Sette alt sammen

Disse kombinasjonene av alternativer kan hjelpe oss med å finne et innstillingsflagg, spesielt når vi ikke husker det eksakte navnet. For eksempel for å finne innstillingsflagget relatert til myke referanser i Java:

>> alias jflags = "java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions -XX: + PrintFlagsFinal -version" >> jflags | grep Soft size_t SoftMaxHeapSize = 4294967296 {håndterbar} {ergonomisk} intx SoftRefLRUPolicyMSPerMB = 1000 {produkt} {standard}

Fra resultatet kan vi enkelt gjette det SoftRefLRUPolicyMSPerMB er flagget vi leter etter.

4. Ulike typer flagg

I forrige avsnitt glanset vi over et viktig emne: flaggtypene. La oss ta en titt på java -XX: + PrintFlagsFinal -versjon produksjon:

[Globale flagg] uintx CodeCacheExpansionSize = 65536 {pd product} {default} bool CompactStrings = true {pd product} {default} bool DoEscapeAnalysis = true {C2 product} {default} double G1ConcMarkStepDurationMillis = 10.000000 {product} {default} size_t G1HeapRegion 1048576 {produkt} {ergonomisk} uintx MaxHeapFreeRatio = 70 {håndterbar} {standard} // avkortet

Som vist ovenfor har hvert flagg en bestemt type.

Boolske alternativer brukes til å aktivere eller deaktivere en funksjon. Slike alternativer krever ingen verdi. For å aktivere dem, må vi bare sette et pluss-tegn foran alternativnavnet:

-XX: + PrintFlagsFinal

Tvert imot, for å deaktivere dem, må vi legge til et minustegn foran navnet deres:

-XX: -RestrictContended

Andre flaggtyper trenger en argumentverdi. Det er mulig å skille verdien fra alternativnavnet med et mellomrom, et kolon, et likhetstegn, ellers kan argumentet følge alternativnavnet (den eksakte syntaksen er forskjellig for hvert alternativ):

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

5. Dokumentasjon og kildekode

Å finne riktig flaggnavn er en ting. Å finne hva det aktuelle flagget gjør under panseret er en annen historie.

En måte å finne ut denne typen detaljer er ved å se i dokumentasjonen. For eksempel, dokumentasjonen for java kommandoen i spesifikasjonsseksjonen for JDK-verktøy er et flott sted å starte.

Noen ganger kan ingen dokumentasjon slå kildekoden. Derfor, hvis vi har navnet på et bestemt flagg, kan vi utforske JVM-kildekoden for å finne ut hva som skjer.

For eksempel kan vi sjekke kildekoden til HotSpot JVM fra GitHub eller til og med deres Mercurial-depot og deretter:

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

Her ser vi etter alle filer som inneholder PrintFlagsFinal streng. Etter å ha funnet de ansvarlige filene, kan vi se oss rundt og se hvordan det spesifikke flagget fungerer.

6. Konklusjon

I denne artikkelen så vi hvordan vi kunne finne nesten alle tilgjengelige JVM-tuningflagg, og lærte også noen triks for å jobbe med dem mer effektivt.


$config[zx-auto] not found$config[zx-overlay] not found