Udforskning af JVM Tuning Flags

1. Oversigt

Det er muligt at tune HotSpot JVM med en række tuningflag. Da der er hundredvis af sådanne flag, kan det være lidt skræmmende at holde styr på dem og deres standardværdier.

I denne vejledning vil vi introducere et par måder til at opdage sådanne tuningflag og lære at arbejde med dem.

2. Oversigt over Java-indstillinger

Det java kommando understøtter en bred vifte af flag, der falder inden for følgende kategorier:

  • Standardindstillinger, der garanteres understøttes af alle JVM-implementeringer derude. Normalt bruges disse muligheder til hverdagslige handlinger som f.eks –Klassesti, -cp, –version, og så videre
  • Ekstra muligheder, der ikke understøttes af alle JVM-implementeringer, og som normalt kan ændres. Disse muligheder starter med -X

Bemærk, at vi ikke bør bruge disse ekstra muligheder tilfældigt. I øvrigt, nogle af disse ekstra muligheder er mere avancerede og begynder med -XX.

I hele denne artikel vil vi fokusere på mere avancerede -XX flag.

3. JVM Tuning Flags

For at liste de globale JVM-tuningflag kan vi aktivere PrintFlagsFinal flag som følger:

>> java -XX: + PrintFlagsFinal -version [Global flags] 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} // trunkeret openjdk version "14" 2020-03-17 OpenJDK Runtime Environment (build 14 + 36-1461 ) OpenJDK 64-bit server-VM (build 14 + 36-1461, blandet tilstand, deling)

Som vist ovenfor har nogle flag standardværdier for denne særlige JVM-version.

Standardværdier for nogle flag kan være forskellige på forskellige platforme, hvilket vises i den sidste kolonne. For eksempel produkt betyder, at standardindstillingen for flag er ensartet på tværs af alle platforme; det pd-produkt betyder, at standardindstillingen for flag er platformafhængig. Det håndterbar værdier kan ændres dynamisk ved kørsel.

3.1. Diagnostiske flag

Det PrintFlagsFinal flag viser dog ikke alle mulige tuningflag. For eksempel, for også at se diagnostiske tuningflag, skal vi tilføje Lås opDiagnosticVMOptions flag:

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

Der er tydeligvis et par hundrede flere flag, når vi inkluderer diagnostiske muligheder. For eksempel er udskrivning af indbygget hukommelsessporingsstatistik kun tilgængelig som en del af diagnostiske flag:

bool PrintNMTStatistics = falsk {diagnostisk} {standard}

3.2. Eksperimentelle flag

For også at se eksperimentelle muligheder skal vi tilføje UnlockExperimentalVMOptions flag:

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

3.3. JVMCI-flag

Fra og med Java 9 giver JVM-kompilatorgrænsefladen eller JVMCI os mulighed for at bruge en compiler skrevet i Java, såsom Graal, som en dynamisk compiler.

For at se muligheder relateret til JVMCI skal vi tilføje et par flere flag og endda aktivere JVMCI:

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

Det meste af tiden er det dog tilstrækkeligt at bruge globale, diagnostiske og eksperimentelle muligheder og vil hjælpe os med at finde det flag, vi har i tankerne.

3.4. Samler det hele

Disse kombinationer af muligheder kan hjælpe os med at finde et tuningsflag, især når vi ikke husker det nøjagtige navn. For eksempel for at finde tuningflagget relateret til bløde referencer 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 nemt gætte det SoftRefLRUPolicyMSPerMB er det flag, vi leder efter.

4. Forskellige typer flag

I det forrige afsnit glansede vi over et vigtigt emne: flagtyperne. Lad os se endnu en gang på java -XX: + PrintFlagsFinal -version produktion:

[Globale flag] uintx CodeCacheExpansionSize = 65536 {pd produkt} {standard} bool CompactStrings = sand {pd produkt} {standard} bool DoEscapeAnalysis = sand {C2 produkt} {standard} dobbelt G1ConcMarkStepDurationMillis = 10.000000 {produkt} {standard} størrelse_t G1HeapRegion 1048576 {produkt} {ergonomisk} uintx MaxHeapFreeRatio = 70 {håndterbar} {standard} // afkortet

Som vist ovenfor har hvert flag en bestemt type.

Boolske indstillinger bruges til enten at aktivere eller deaktivere en funktion. Sådanne muligheder kræver ikke en værdi. For at aktivere dem skal vi bare sætte et plustegn foran valgnavnet:

-XX: + PrintFlagsFinal

Tværtimod, for at deaktivere dem, skal vi tilføje et minustegn foran deres navn:

-XX: -RestrikContended

Andre flagtyper har brug for en argumentværdi. Det er muligt at adskille værdien fra indstillingsnavnet med et mellemrum, et kolon, et lighedstegn, eller argumentet kan direkte følge indstillingsnavnet (den nøjagtige syntaks er forskellig for hver indstilling):

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

5. Dokumentation og kildekode

At finde det rigtige flagnavn er en ting. At finde ud af, hvad det pågældende flag gør under emhætten, er en anden historie.

En måde at finde ud af denne slags detaljer er ved at se i dokumentationen. For eksempel, dokumentationen til java kommandoen i JDK-værktøjsspecifikationsafsnittet er et godt sted at starte.

Nogle gange kan ingen mængde dokumentation slå kildekoden. Derfor, hvis vi har navnet på et bestemt flag, så kan vi udforske JVM-kildekoden for at finde ud af, hvad der foregår.

For eksempel kan vi tjekke HotSpot JVM's kildekode fra GitHub eller endda deres Mercurial-lager og derefter:

>> 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 leder vi efter alle filer, der indeholder PrintFlagsFinal snor. Efter at have fundet de ansvarlige filer, kan vi se os omkring og se, hvordan det specifikke flag fungerer.

6. Konklusion

I denne artikel så vi, hvordan vi kunne finde næsten alle tilgængelige JVM-tuningflag og lærte også et par tricks til at arbejde mere effektivt med dem.


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