Bevezetés a JVM Code Cache-be
1. Bemutatkozás
Ebben az oktatóanyagban gyorsan megnézzük és megismerhetjük a JVM kód gyorsítótárát.
2. Mi a kód gyorsítótár?
Egyszerűen fogalmazva, A JVM Code Cache egy olyan terület, ahol a JVM natív kódba fordítva tárolja a byte-kódját. A futtatható natív kód minden blokkját a-nak hívjuk nmethod. A nmethod teljes vagy beágyazott Java módszer lehet.
A just-in-time (JIT) fordító a kódgyorsítótár-terület legnagyobb fogyasztója. Ezért hívják egyes fejlesztők ezt a memóriát JIT kód gyorsítótárnak.
3. Code Cache Tuning
A kód gyorsítótárának mérete fix. Ha megtelt, a JVM nem fordít további kódokat, mivel a JIT fordító most ki van kapcsolva. Továbbá megkapjuk a „A CodeCache megtelt ... A fordító le van tiltva" figyelmeztető üzenet. Ennek eredményeként az alkalmazásunk teljesítménye romlott lesz. Ennek elkerülése érdekében a kód gyorsítótárát a következő méretbeállításokkal hangolhatjuk:
- InitialCodeCacheSize - a kezdeti kód gyorsítótár mérete, alapértelmezés szerint 160 KB
- ReservedCodeCacheSize - az alapértelmezett maximális méret 48 MB
- CodeCacheExpansionSize - a kód gyorsítótárának bővítési mérete, 32 KB vagy 64 KB
A ReservedCodeCacheSize lehet megoldás, de ez általában csak ideiglenes megoldás.
Szerencsére a JVM felajánlja a UseCodeCacheFlushing opció a kód gyorsítótárának öblítésének vezérléséhez. Alapértelmezett értéke hamis. Amikor engedélyezzük, akkor felszabadítja a megszállt területet, ha a következő feltételek teljesülnek:
- a kód gyorsítótár tele van; ez a terület ki van öblítve, ha mérete meghaladja egy bizonyos küszöböt
- a legutóbbi tisztítás óta eltelt a bizonyos időköz
- az előre lefordított kód nem elég forró. Minden egyes összeállított módszerhez a JVM nyomon követi a speciális forróságmérőt. Ha ennek a számlálónak az értéke kisebb, mint egy kiszámított küszöb, a JVM felszabadítja ezt az előre lefordított kódrészletet
4. Kód gyorsítótár használata
A kód gyorsítótár használatának figyelemmel kíséréséhez nyomon kell követnünk a jelenleg használt memória méretét.
A kód gyorsítótár használatával kapcsolatos információk megadásához megadhatjuk a –XX: + PrintCodeCache JVM opció. Az alkalmazás futtatása után hasonló kimenetet fogunk látni:
CodeCache: méret = 32768Kb használt = 542Kb max_használt = 542Kb szabad = 32226Kb
Lássuk, mit jelentenek ezek az értékek:
- méret a kimenetben a memória maximális méretét mutatja, amely megegyezik a memóriával ReservedCodeCacheSize
- használt a jelenleg használt memória tényleges mérete
- max_ felhasznált a maximálisan használt méret
- ingyenes a fennmaradó memória, amelyet még nem foglaltunk el
A PrintCodeCache opció nagyon hasznos, mivel tudjuk:
- lásd, mikor történik az öblítés
- meghatározzuk, hogy elértünk-e kritikus memóriahasználati pontot
5. Szegmentált kód gyorsítótár
A Java 9-től kezdve a JVM három külön szegmensre osztja a kód gyorsítótárát, amelyek mindegyike egy adott típusú lefordított kódot tartalmaz. Pontosabban három szegmens létezik:
- A nem módszeres szegmens JVM belső kapcsolódó kódot tartalmaz, például a bytecode tolmácsot. Alapértelmezés szerint ez a szegmens körülbelül 5 MB. A szegmens méretét a -XX: NonNMethodCodeHeapSize tuning zászló
- A profilkód szegmens könnyedén optimalizált kódot tartalmaz, rövid élettartammal. Annak ellenére, hogy a szegmens mérete alapértelmezés szerint 122 MB körül van, a -XX: ProfiledCodeHeapSize tuning zászló
- A nem profilozott szegmens teljesen optimalizált, potenciálisan hosszú élettartamú kódot tartalmaz. Hasonlóképpen, alapértelmezés szerint 122 MB körül van. Ez az érték természetesen a. Segítségével konfigurálható -XX: NonProfiledCodeHeapSize tuning zászló
Ez az új struktúra eltérően kezeli a különböző típusú betartott kódokat, ami jobb általános teljesítményhez vezet.
Például a rövid élettartamú fordított kód és a hosszú élettartamú kód elkülönítése javítja a módszer söpörő teljesítményét - főleg azért, mert kisebb memóriaterületet kell beolvasnia.
6. Következtetés
Ez a rövid cikk bemutatja a JVM kód gyorsítótárának rövid bemutatását.
Ezenkívül bemutattunk néhány használati és beállítási lehetőséget a memóriaterület megfigyelésére és diagnosztizálására.