A JVM Tuning Flags felfedezése

1. Áttekintés

A HotSpot JVM hangolása különféle hangoló zászlókkal lehetséges. Mivel több száz ilyen zászló létezik, ezek nyomon követése és alapértelmezett értéke kissé ijesztő lehet.

Ebben az oktatóanyagban bemutatunk néhány módot az ilyen hangoló zászlók felfedezésére és a velük való együttműködés megtanulására.

2. A Java opciók áttekintése

A Jáva parancs a következő kategóriákba tartozó zászlók sokféle változatát támogatja:

  • Normál opciók, amelyeket garantáltan támogat az összes ottani JVM-implementáció. Ezeket a lehetőségeket általában a mindennapi műveletekhez használják, mint pl –Osztályút, -cp, –verzió, stb
  • Extra opciók, amelyeket nem minden JVM-implementáció támogat, és általában változhatnak. Ezek a lehetőségek a következőkkel kezdődnek -X

Felhívjuk figyelmét, hogy nem szabad alkalmanként használni ezeket az extra lehetőségeket. Ráadásul, ezeknek a további lehetőségeknek némelyike ​​fejlettebb és azzal kezdődik -XX.

Ebben a cikkben a fejlettebbekre fogunk összpontosítani -XX zászlók.

3. JVM Tuning zászlók

A globális JVM tuning zászlók felsorolásához engedélyezhetjük a PrintFlagsFinal zászló a következőképpen:

>> java -XX: + PrintFlagsFinal -version [Globális jelzők] uintx CodeCacheExpansionSize = 65536 {pd product} {default} bool CompactStrings = true {pd product} {default} bool DoEscapeAnalysis = true {C2 product} {default} double G1ConcMarkisPepDuration 10,000000 {product} {alapértelmezett} size_t G1HeapRegionSize = 1048576 {product} {ergonomikus} uintx MaxHeapFreeRatio = 70 {kezelhető} {alapértelmezett} // csonka openjdk verzió "14" 2020-03-17 OpenJDK futási környezet ) OpenJDK 64 bites kiszolgáló virtuális gép (14 + 36-1461 build, vegyes mód, megosztás)

Mint fentebb látható, néhány zászló alapértelmezett értékekkel rendelkezik az adott JVM verzióhoz.

Egyes zászlók alapértelmezett értékei eltérőek lehetnek a különböző platformokon, ami az utolsó oszlopban látható. Például a termék azt jelenti, hogy a zászló alapértelmezett beállítása minden platformon egységes; a pd termék azt jelenti, hogy a zászló alapértelmezett beállítása platformfüggő. A kezelhető futás közben dinamikusan megváltoztathatók az értékek.

3.1. Diagnosztikai zászlók

A PrintFlagsFinal A flag azonban nem mutatja az összes lehetséges tuning zászlót. Például, diagnosztikai tuningjelzők megtekintéséhez hozzá kell adnunk a UnlockDiagnosticVMOptions zászló:

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

Nyilvánvaló, hogy még pár száz zászló van, amikor a diagnosztikai lehetőségeket belefoglaljuk. Például a natív memóriakövetési statisztikák nyomtatása csak a diagnosztikai jelzők részeként érhető el:

bool PrintNMTStatistics = hamis {diagnosztika} {alapértelmezett}

3.2. Kísérleti zászlók

A kísérleti lehetőségek megtekintéséhez hozzá kell adnunk a UnlockExperimentalVMOptions zászló:

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

3.3. JVMCI Flags

A Java 9-től kezdve a JVM fordító felülete vagy a JVMCI lehetővé teszi számunkra, hogy dinamikus fordítóként használjunk Java-ban írt fordítót, például Graal-t.

A JVMCI-hez kapcsolódó opciók megtekintéséhez adjunk hozzá még néhány zászlót, és még engedélyezzük a JVMCI-t is:

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

Legtöbbször azonban a globális, diagnosztikai és kísérleti lehetőségek használatának elegendőnek kell lennie, és segít nekünk megtalálni azt a zászlót, amelyre gondolunk.

3.4. Összedobva az egészet

Az opciók ezen kombinációi segíthetnek abban, hogy megtaláljuk a hangoló zászlót, különösen akkor, ha nem emlékszünk a pontos névre. Például a Java hivatkozásokhoz kapcsolódó hangolási jelző megkereséséhez:

>> alias jflags = "java -XX: + UnlockDiagnosticVMOptions -XX: + UnlockExperimentalVMOptions -XX: + PrintFlagsFinal -version" >> jflags | grep Soft size_t SoftMaxHeapSize = 4294967296 {kezelhető} {ergonomikus} intx SoftRefLRUPolicyMSPerMB = 1000 {termék} {alapértelmezett}

Az eredményből ezt könnyen kitalálhatjuk SoftRefLRUPolicyMSPerMB a zászló, amit keresünk.

4. Különböző típusú zászlók

Az előző részben áttekintettünk egy fontos témát: a zászlótípusokat. Vessünk egy újabb pillantást a java -XX: + PrintFlagsFinal -verzió Kimenet:

[Globális zászlók] 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 G11 1048576 {product} {ergonomikus} uintx MaxHeapFreeRatio = 70 {kezelhető} {alapértelmezett} // csonka

Amint fentebb látható, minden zászlónak van egy meghatározott típusa.

A logikai beállítások a funkció engedélyezésére vagy letiltására szolgálnak. Az ilyen opciók nem igényelnek értéket. Engedélyezésükhöz csak egy pluszjelet kell tennünk az opció neve elé:

-XX: + PrintFlagsFinal

Éppen ellenkezőleg, letiltásukhoz mínuszjelet kell adnunk a nevük elé:

-XX: -RestrictContended

Más jelzőtípusokhoz argumentumértékre van szükség. Lehetséges, hogy az értéket az opció nevétől szóközzel, kettősponttal, egyenlőségjelrel különítsük el, vagy az argumentum közvetlenül követheti az opció nevét (a pontos szintaxis az egyes opcióknál eltér):

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

5. Dokumentáció és forráskód

A megfelelő zászló név megtalálása egy dolog. Megtalálni, hogy az adott zászló mit csinál a motorháztető alatt, az egy másik történet.

Az ilyen jellegű részletek megismerésének egyik módja a dokumentáció megnézése. Például, a. dokumentációja Jáva A JDK eszközök specifikáció szakaszában található parancs remek kiindulópont.

Néha semmilyen dokumentáció nem képes legyőzni a forráskódot. Ezért, ha van egy adott zászló neve, akkor felfedezhetjük a JVM forráskódját, hogy megtudjuk, mi történik.

Megnézhetjük például a HotSpot JVM forráskódját a GitHub-ból vagy akár a Mercurial-tárából, majd:

>> git klón [e-mail védett]: openjdk / jdk14u.git openjdk >> cd openjdk / src / hotspot >> grep -FR 'PrintFlagsFinal'. ./share/runtime/globals.hpp: termék (bool, PrintFlagsFinal, hamis, ./share/runtime/init.cpp: if (PrintFlagsFinal || PrintFlagsRanges) {

Itt keresünk minden fájlt, amely tartalmazza a PrintFlagsFinal húr. A felelős fájlok megtalálása után körülnézhetünk, és láthatjuk, hogy az adott zászló hogyan működik.

6. Következtetés

Ebben a cikkben láttuk, hogyan találhatjuk meg szinte az összes rendelkezésre álló JVM tuning zászlót, és megtanultunk néhány trükköt is, hogy hatékonyabban tudjunk velük dolgozni.