Skúmanie ladiacich vlajok JVM

1. Prehľad

HotSpot JVM je možné vyladiť rôznymi ladiacimi príznakmi. Pretože existujú také príznaky, ich sledovanie a ich predvolené hodnoty môžu byť trochu skľučujúce.

V tomto tutoriáli predstavíme niekoľko spôsobov, ako tieto ladiace príznaky objaviť a naučiť sa s nimi pracovať.

2. Prehľad možností Java

The java príkaz podporuje širokú škálu príznakov spadajúcich do nasledujúcich kategórií:

  • Štandardné možnosti, ktoré zaručene podporia všetky implementácie JVM. Zvyčajne sa tieto možnosti používajú na každodenné akcie ako napr –Classpath, -cp, –verzia, a tak ďalej
  • Ďalšie možnosti, ktoré nie sú podporované všetkými implementáciami JVM a obvykle sa môžu zmeniť. Tieto možnosti začínajú na -X

Upozorňujeme, že by sme tieto extra možnosti nemali používať náhodne. Navyše, niektoré z týchto ďalších možností sú pokročilejšie a začínajú na -XX.

V tomto článku sa zameriame na pokročilejšie -XX vlajky.

3. Ladiace vlajky JVM

Ak chcete zobraziť zoznam globálnych ladiacich príznakov JVM, môžeme povoliť PrintFlagsFinal takto označiť:

>> java -XX: + PrintFlagsFinal -version [Globálne vlajky] uintx CodeCacheExpansionSize = 65536 {pd produkt} {default} bool CompactStrings = true {pd product} {default} bool DoEscapeAnalysis = true {C2 produkt} {default} dvojitý G1ConcMarkStepDurationMillis = 10,000000 {product} {default} size_t G1HeapRegionSize = 1048576 {product} {ergonomic} uintx MaxHeapFreeRatio = 70 {manageable} {default} // skrátená openjdk verzia "14" 2020-03-17 OpenJDK Runtime Environment (build 14 + 36-1461) ) OpenJDK 64-Bit Server VM (build 14 + 36-1461, mixed mode, sharing)

Ako je uvedené vyššie, niektoré príznaky majú predvolené hodnoty pre túto konkrétnu verziu JVM.

Predvolené hodnoty pre niektoré príznaky sa môžu líšiť na rôznych platformách, čo sa zobrazuje v poslednom stĺpci. Napríklad výrobok znamená, že predvolené nastavenie vlajky je jednotné na všetkých platformách; the produkt pd znamená, že predvolené nastavenie príznaku je závislé od platformy. The zvládnuteľné hodnoty je možné meniť dynamicky za behu.

3.1. Diagnostické príznaky

The PrintFlagsFinal vlajka však neukazuje všetky možné ladiace vlajky. Napríklad aby sme videli aj diagnostické ladiace príznaky, mali by sme pridať UnlockDiagnosticVMOptions vlajka:

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

Je zrejmé, že keď zahrnieme diagnostické možnosti, existuje niekoľko ďalších stoviek vlajok. Napríklad tlač štatistík sledovania natívnej pamäte je k dispozícii iba ako súčasť diagnostických príznakov:

bool PrintNMTStatistics = false {diagnostické} {predvolené}

3.2. Experimentálne vlajky

Ak chcete zobraziť aj experimentálne možnosti, mali by sme pridať UnlockExperimentalVMOptions vlajka:

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

3.3. Vlajky JVMCI

Od verzie Java 9 nám rozhranie kompilátora JVM alebo JVMCI umožňuje používať ako dynamický kompilátor kompilátor napísaný v jazyku Java, napríklad Graal.

Ak chcete zobraziť možnosti súvisiace s JVMCI, mali by sme pridať niekoľko ďalších príznakov a dokonca dokonca povoliť JVMCI:

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

Väčšinou by však malo stačiť použitie globálnych, diagnostických a experimentálnych možností a pomôže nám nájsť vlajku, ktorú máme na mysli.

3.4. Dávať to všetko dokopy

Tieto kombinácie možností nám môžu pomôcť nájsť ladiacu vlajku, najmä keď si nepamätáme presný názov. Napríklad vyhľadanie príznaku ladenia súvisiaceho s mäkkými referenciami v Jave:

>> alias jflags = "java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions -XX: + PrintFlagsFinal -version" >> jflags | grep Soft size_t SoftMaxHeapSize = 4294967296 {spravovateľné} {ergonomické} intx SoftRefLRUPolicyMSPerMB = 1000 {produkt} {predvolené}

Podľa výsledku to ľahko uhádneme SoftRefLRUPolicyMSPerMB je vlajka, ktorú hľadáme.

4. Rôzne typy vlajok

V predchádzajúcej časti sme sa venovali dôležitej téme: typom vlajok. Pozrime sa ešte raz na java -XX: + PrintFlagsFinal -verzia výkon:

[Globálne vlajky] 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 G1HeapRion 1048576 {produkt} {ergonomický} uintx MaxHeapFreeRatio = 70 {spravovateľný} {predvolené} // skrátené

Ako je uvedené vyššie, každý príznak má špecifický typ.

Logické možnosti sa používajú na povolenie alebo zakázanie funkcie. Takéto možnosti nevyžadujú hodnotu. Aby sme ich povolili, musíme pred názov možnosti vložiť znamienko plus:

-XX: + PrintFlagsFinal

Naopak, aby sme ich deaktivovali, musíme pred ich meno pridať znamienko mínus:

-XX: -RestrictContended

Ostatné typy príznakov vyžadujú hodnotu argumentu. Hodnotu od názvu možnosti je možné oddeliť medzerou, dvojbodkou, znamienkom rovnosti alebo argumentom, ktorý môže priamo nasledovať za názvom možnosti (presná syntax sa pre každú možnosť líši):

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

5. Dokumentácia a zdrojový kód

Nájsť správny názov vlajky je jedna vec. Nájsť, čo tá konkrétna vlajka robí pod kapotou, je iný príbeh.

Jedným zo spôsobov, ako zistiť tieto druhy podrobností, je prezeranie dokumentácie. Napríklad dokumentácia pre java príkaz v sekcii špecifikácie nástrojov JDK je skvelým miestom na začatie.

Zdrojové kódy niekedy neprekonajú žiadne množstvo dokumentácie. Preto, ak máme názov konkrétneho príznaku, môžeme preskúmať zdrojový kód JVM a zistiť, čo sa deje.

Môžeme si napríklad pozrieť zdrojový kód HotSpot JVM z GitHubu alebo dokonca z jeho úložiska Mercurial a potom:

>> git clone [chránený e-mailom]: 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) {

Tu hľadáme všetky súbory obsahujúce PrintFlagsFinal struna. Po nájdení zodpovedných súborov sa môžeme rozhliadnuť a zistiť, ako ten konkrétny príznak funguje.

6. Záver

V tomto článku sme videli, ako môžeme nájsť takmer všetky dostupné príznaky ladenia JVM, a tiež sme sa naučili niekoľko trikov, ako s nimi pracovať efektívnejšie.


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