Istraživanje JVM-ovih zastavica za podešavanje

1. Pregled

Moguće je podesiti HotSpot JVM različitim zastavicama za podešavanje. Kako postoji stotina takvih zastava, njihovo praćenje i njihove zadane vrijednosti mogu biti malo zastrašujuće.

U ovom uputstvu predstavit ćemo nekoliko načina kako otkriti takve zastavice i naučiti raditi s njima.

2. Pregled Java opcija

The Java naredba podržava širok spektar zastava koje spadaju u sljedeće kategorije:

  • Standardne opcije za koje jamče da će ih podržati sve implementacije JVM-a. Obično se ove opcije koriste za svakodnevne radnje poput –Classpath, -cp, –verzija, i tako dalje
  • Dodatne opcije koje nisu podržane u svim implementacijama JVM-a i obično su podložne promjenama. Te opcije počinju sa -X

Imajte na umu da ove dodatne opcije ne bismo trebali koristiti ležerno. Štoviše, neke od tih dodatnih opcija su naprednije i započinju s -XX.

Kroz ovaj ćemo se članak usredotočiti na naprednije -XX zastave.

3. JVM-ove zastavice za podešavanje

Da bismo popisali globalne zastavice za podešavanje JVM-a, možemo omogućiti PrintFlagsFinal zastava kako slijedi:

>> 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 G1ConcMarkStepDuration 10,000000 {product} {default} size_t G1HeapRegionSize = 1048576 {product} {ergonomic} uintx MaxHeapFreeRatio = 70 {upravljivo} {default} // skraćena openjdk verzija "14" 2020-03-17 OpenJDK Runtime Environment (build 14 + 36-1461 ) OpenJDK 64-bitni poslužitelj VM (gradnja 14 + 36-1461, mješoviti način rada, dijeljenje)

Kao što je gore prikazano, neke zastave imaju zadane vrijednosti za ovu JVM verziju.

Zadane vrijednosti za neke zastavice mogu se razlikovati na različitim platformama, što je prikazano u zadnjem stupcu. Na primjer, proizvod znači da je zadana postavka zastave ujednačena na svim platformama; the pd proizvod znači da zadana postavka zastave ovisi o platformi. The upravljiv vrijednosti se mogu dinamički mijenjati tijekom izvođenja.

3.1. Dijagnostičke zastave

The PrintFlagsFinal flag, međutim, ne prikazuje sve moguće zastavice za podešavanje. Na primjer, da bismo vidjeli i dijagnostičke zastavice za podešavanje, trebali bismo dodati UnlockDiagnosticVMOptions zastava:

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

Jasno je da postoji još par stotina zastavica kad uključujemo dijagnostičke mogućnosti. Na primjer, ispis statistika praćenja izvorne memorije dostupan je samo kao dio dijagnostičkih zastavica:

bool PrintNMTStatistics = false {dijagnostika} {zadano}

3.2. Eksperimentalne zastave

Da bismo također vidjeli eksperimentalne opcije, trebali bismo dodati OtključajEksperimentalneVMOptions zastava:

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

3.3. JVMCI zastave

Od Jave 9, sučelje JVM kompajlera ili JVMCI omogućuje nam upotrebu kompajlera napisanog na Javi, kao što je Graal, kao dinamičkog kompajlera.

Da bismo vidjeli opcije povezane s JVMCI, trebali bismo dodati još nekoliko zastavica, a također čak i omogućiti JVMCI:

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

Većinu vremena, međutim, uporaba globalnih, dijagnostičkih i eksperimentalnih opcija trebala bi biti dovoljna i pomoći će nam da pronađemo zastavicu koju imamo na umu.

3.4. Sve to zajedno

Ove kombinacije opcija mogu nam pomoći da pronađemo zastavicu za podešavanje, posebno kada se ne sjećamo točnog naziva. Na primjer, da biste pronašli zastavicu za podešavanje koja se odnosi na soft reference u Javi:

>> alias jflags = "java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions -XX: + PrintFlagsFinal -version" >> jflags | grep Soft size_t SoftMaxHeapSize = 4294967296 {upravljiv} {ergonomski} intx SoftRefLRUPolicyMSPerMB = 1000 {proizvod} {zadani}

Iz rezultata to lako možemo pogoditi SoftRefLRUPolicyMSPerMB je zastava koju tražimo.

4. Različite vrste zastava

U prethodnom smo dijelu pregledali važnu temu: vrste zastava. Pogledajmo još jedan java -XX: + PrintFlagsFinal -verzija izlaz:

[Global flags] 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_t1GeGeGeSG 1048576 {product} {ergonomic} uintx MaxHeapFreeRatio = 70 {upravljivo} {zadano} // skraćeno

Kao što je gore prikazano, svaka zastava ima određenu vrstu.

Logičke opcije koriste se za omogućavanje ili onemogućavanje značajke. Takve opcije ne zahtijevaju vrijednost. Da bismo ih omogućili, samo moramo staviti znak plus ispred naziva opcije:

-XX: + PrintFlagsFinal

Naprotiv, da bismo ih onemogućili, moramo dodati znak minus ispred njihovog imena:

-XX: -RestrictContended

Ostale vrste zastava trebaju vrijednost argumenta. Vrijednost od naziva opcije moguće je odvojiti razmakom, dvotačkom, znakom jednakosti ili argument može izravno slijediti naziv opcije (točna sintaksa razlikuje se za svaku opciju):

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

5. Dokumentacija i izvorni kod

Pronaći pravo ime zastave jedno je. Druga je priča pronaći ono što ta zastava radi ispod haube.

Jedan od načina da saznate ovakve detalje je pregled dokumentacije. Na primjer, dokumentacija za Java naredba u odjeljku specifikacije alata JDK izvrsno je mjesto za početak.

Ponekad nijedna količina dokumentacije ne može nadmašiti izvorni kod. Stoga, ako imamo naziv određene zastave, tada možemo istražiti izvorni kod JVM-a kako bismo saznali što se događa.

Na primjer, možemo provjeriti izvorni kod HotSpot JVM-a s GitHub-a ili čak njihovog Mercurial spremišta, a zatim:

>> git klon [zaštićen e-poštom]: 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) {

Ovdje tražimo sve datoteke koje sadrže PrintFlagsFinal niz. Nakon pronalaska odgovornih datoteka možemo pogledati oko sebe i vidjeti kako funkcionira ta posebna zastava.

6. Zaključak

U ovom smo članku vidjeli kako možemo pronaći gotovo sve dostupne zastavice za podešavanje JVM-a i naučili nekoliko trikova za učinkovitiji rad s njima.


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