Útmutató a legfontosabb JVM-paraméterekhez

1. Áttekintés

Ebben a gyors bemutatóban a legismertebb lehetőségeket tárjuk fel, amelyek felhasználhatók a Java virtuális gép konfigurálásához.

2. Kifejezett kupac memória - Xms és Xmx opciók

Az egyik legelterjedtebb teljesítményhez kapcsolódó gyakorlat a halom memória inicializálása az alkalmazás követelményeinek megfelelően.

Ezért meg kell adnunk a minimális és a maximális kupacméretet. Az alábbi paraméterek használhatók elérésére:

-Xms [egység] -Xmx [egység]

Itt, Mértékegység azt az egységet jelöli, amelyben a memória (amelyet a kupacméret) inicializálni kell. Az egységek megjelölhetők „G” GB-hoz, „M” MB és „K” a KB-hoz.

Például, ha legalább 2 GB-ot és maximum 5 GB-ot akarunk rendelni a JVM-hez, akkor írnunk kell:

-Xms2G -Xmx5G

A Java 8-tól kezdve a méret Metaspace nem meghatározott. Amint eléri a globális határt, a JVM automatikusan növeli azt. Azonban a szükségtelen instabilitás leküzdése érdekében beállíthatjuk Metaspace méret a következőkkel:

-XX: MaxMetaspaceSize = [egység]

Itt, metatér mérete azt a memóriamennyiséget jelöli, amelyhez hozzárendelni szeretnénk Metaspace.

Az Oracle irányelvei szerint a teljes rendelkezésre álló memória után a második legbefolyásosabb tényező a fiatal generáció számára fenntartott halom aránya. Alapértelmezés szerint az YG minimális mérete 1310 MB, és a maximális méret korlátlan.

Kijelölhetjük őket kifejezetten:

-XX: NewSize = [egység] -XX: MaxNewSize = [egység]

3. Szemétgyűjtés

Az alkalmazás jobb stabilitása érdekében kritikus fontosságú a megfelelő Szemétgyűjtő algoritmus kiválasztása.

A JVM-nek négy típusa van GC megvalósítások:

  • Soros szemétgyűjtő
  • Párhuzamos szemétgyűjtő
  • CMS szemétgyűjtő
  • G1 szemétgyűjtő

Ezek a megvalósítások az alábbi paraméterekkel deklarálhatók:

-XX: + UseSerialGC -XX: + UseParallelGC -XX: + USeParNewGC -XX: + UseG1GC

További részletek a Szemétgyüjtés megvalósítások itt találhatók.

4. GC naplózás

Az alkalmazás állapotának szigorú ellenőrzéséhez mindig ellenőriznünk kell a JVM-eket Szemétgyüjtés teljesítmény. Ennek legegyszerűbb módja a GC tevékenység emberi olvasható formátumban.

A következő paraméterek használatával naplózhatjuk a GC tevékenység:

-XX: + UseGCLogFileRotation -XX: NumberOfGCLogFiles = -XX: GCLogFileSize = [egység] -Xloggc: /path/to/gc.log

Használja a GCLogFileRotation alkalmazást meghatározza a naplófájl gördülő házirendjét, hasonlóan a log4j, s4lj stb. NumberOfGCLogFiles az egyetlen alkalmazás életciklusára írható naplófájlok maximális számát jelöli. GCLogFileSize megadja a fájl maximális méretét. Végül, loggc helyét jelöli.

Megjegyzendő, hogy két további JVM paraméter áll rendelkezésre (-XX: + PrintGCTimeStamps és -XX: + PrintGCDateStamps), amellyel dátum szerinti időbélyeget lehet kinyomtatni a GC napló.

Például, ha maximum 100-at akarunk rendelni GC naplófájlok, amelyek mindegyikének maximális mérete 50 MB, és ezeket a/ home / user / log / ' helyét, a szintaxis alatt használhatjuk:

-XX: + UseGCLogFileRotation -XX: NumberOfGCLogFiles = 10 -XX: GCLogFileSize = 50M -Xloggc: /home/user/log/gc.log

A probléma azonban az, hogy egy további démonszálat használnak mindig a rendszer idejének figyelemmel kísérésére a háttérben. Ez a viselkedés szűk keresztmetszetet eredményezhet a teljesítményben; ezért mindig jobb, ha nem játszunk ezzel a paraméterrel a produkcióban.

5. A memória kezelése

Nagyon gyakori, hogy egy nagy alkalmazás memóriahibából fakad, ami viszont az alkalmazás összeomlásához vezet. Nagyon kritikus forgatókönyv, és nagyon nehéz megismételni a probléma elhárításához.

Ezért a JVM olyan paraméterekkel rendelkezik, amelyek halmozott memóriát tárolnak egy fizikai fájlba, amely később felhasználható a szivárgások kiderítésére:

-XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath =. / Java_pid.hprof -XX: OnOutOfMemoryError = ";" -XX: + UseGCOverheadLimit

Néhány megjegyzendő pont itt:

  • HeapDumpOnOutOfMemoryError utasítja a JVM-et, hogy halmot helyezzen el fizikai fájlba a OutOfMemoryError
  • HeapDumpPath jelöli az utat, ahová a fájlt írni akarják; bármilyen fájlnév megadható; azonban ha JVM talál egy címke a névben, a memória elfogyását okozó folyamat folyamatazonosítója a fájlnévhez lesz csatolva .hprof formátum
  • OnOutOfMemoryError memóriahiba esetén végrehajtandó vészhelyzeti parancsok kiadására szolgál; megfelelő parancsot kell használni a cmd args helyén. Például, ha újra akarjuk indítani a szervert, amint a memória elfogy, beállíthatjuk a paramétert:
-XX: OnOutOfMemoryError = "leállítás -r"
  • Használja a GCOverheadLimit parancsot olyan házirend, amely korlátozza a virtuális gép azon idejének arányát, amelyet a GC-ben tölt el egy Elfogyott a memória hiba van dobva

6. 32/64 Bit

Az operációs rendszer környezetében, ahol 32 és 64 bites csomagok is telepítve vannak, a JVM automatikusan 32 bites környezeti csomagokat választ.

Ha a környezetet kézzel akarjuk 64 bitesre állítani, akkor az alábbi paraméter segítségével tehetjük meg:

-d

Az OS bit lehet akár 32 vagy 64. További információ erről itt található.

7. Egyéb

  • -szerver: engedélyezi a „Server Hotspot VM” funkciót; alapértelmezés szerint ezt a paramétert használja a 64 bites JVM
  • -XX: + UseStringDeduplication: Java 8u20 bevezette ezt a JVM paramétert a memória szükségtelen használatának csökkentése érdekében, túl sok példány létrehozásával Húr; ez optimalizálja a kupac memóriát az ismétlődések számának csökkentésével Húr értékek egyetlen globális char [] tömbre
  • -XX: + Használja az LWPS szinkronizálást: készletek LWP (Könnyű folyamat) - szálon alapuló szinkronizálás helyett szinkronizálási házirend
  • -XX: LargePageSizeInBytes: beállítja a Java halomhoz használt nagy oldalméretet; GB / MB / KB-ban veszi fel az argumentumot; nagyobb oldalméretekkel jobban ki tudjuk használni a virtuális memória hardver erőforrásait; ez azonban nagyobb helyméretet okozhat a PermGen, ami viszont kényszeríteni tudja a Java halomterület méretének csökkentését
  • -XX: MaxHeapFreeRatio: beállítja a halom maximális százalékos arányát a következő után: GC hogy elkerülje a zsugorodást.
  • -XX: MinHeapFreeRatio: beállítja a halom minimális százalékos arányát a következő után: GC a terjeszkedés elkerülése érdekében; A halomhasználat figyeléséhez használhatja a JDK-val szállított VisualVM-et.
  • -XX: SurvivorRatio: Aránya Éden/túlélő tér mérete - például, -XX: SurvivorRatio = 6 beállítja az egyes arányt túlélő tér és éden tér 1: 6 legyen,
  • -XX: + UseLargePages: használjon nagy oldalmemóriát, ha a rendszer támogatja; Kérjük, vegye figyelembe, hogy OpenJDK 7 általában összeomlik, ha ezt a JVM-paramétert használja

  • -XX: + UseStringCache: lehetővé teszi a Húr medence

  • -XX: + UseCompressedStrings: használj byte[] típusa Húr objektumok, amelyek tiszta ASCII formátumban ábrázolhatók
  • -XX: + OptimizeStringConcat: optimalizálja Húr összefűzési műveletek, ha lehetséges

8. Következtetés

Ebben a gyors cikkben megismerkedtünk néhány fontos JVM-paraméterrel - amelyek felhasználhatók az általános alkalmazás teljesítményének hangolására és javítására.

Ezek egy része hibakeresési célokra is felhasználható.

Ha részletesebben szeretné megismerni a referenciaparamétereket, itt kezdheti el.