Úvod do medzipamäte kódu JVM

1. Úvod

V tomto tutoriáli sa rýchlo pozrieme na a dozvieme sa viac o pamäti cache kódu JVM.

2. Čo je kódová vyrovnávacia pamäť?

Jednoducho povedané, JVM Code Cache je oblasť, kde JVM ukladá svoj bytecode skompilovaný do natívneho kódu. Každý blok spustiteľného natívneho kódu nazývame a nmethod. The nmethod môže to byť úplná alebo vložená metóda Java.

Kompilátor just-in-time (JIT) je najväčším spotrebiteľom v oblasti kódovej medzipamäte. Preto niektorí vývojári nazývajú túto pamäť medzipamäťou kódu JIT.

3. Ladenie medzipamäte kódu

Cache kódu má pevnú veľkosť. Keď je plná, JVM nebude kompilovať žiadny ďalší kód, pretože kompilátor JIT je teraz vypnutý. Ďalej dostaneme „CodeCache je plný ... kompilátor bol zakázaný”Varovná správa. Vo výsledku skončíme so zníženým výkonom v našej aplikácii. Aby sme sa tomu vyhli, môžeme vyladiť kódovú medzipamäť s nasledujúcimi možnosťami veľkosti:

  • InitialCodeCacheSize - veľkosť počiatočnej medzipamäte kódu, predvolená hodnota 160 kB
  • ReservedCodeCacheSize - predvolená maximálna veľkosť je 48 MB
  • CodeCacheExpansionSize - veľkosť rozšírenia kódovej medzipamäte, 32 kB alebo 64 kB

Zvyšovanie ReservedCodeCacheSize môže byť riešením, ale zvyčajne ide iba o dočasné riešenie.

Našťastie JVM ponúka a UseCodeCacheFlushing možnosť ovládať vyprázdňovanie oblasti kódovej medzipamäte. Jeho predvolená hodnota je false. Keď to povolíme, je to uvoľní okupovanú oblasť, ak sú splnené nasledujúce podmienky:

  • vyrovnávacia pamäť kódov je plná; táto oblasť je vyprázdnená, ak jej veľkosť presahuje určitú hranicu
  • určitý interval prešiel od posledného vyčistenia
  • predkompilovaný kód nie je dostatočne horúci. Pre každú zostavenú metódu JVM sleduje špeciálny čítač horúčav. Ak je hodnota tohto počítadla nižšia ako vypočítaná prahová hodnota, JVM uvoľní tento kúsok predkompilovaného kódu

4. Použitie medzipamäte kódu

Aby sme mohli monitorovať využitie medzipamäte kódu, musíme sledovať veľkosť momentálne používanej pamäte.

Ak chcete získať informácie o použití medzipamäte kódu, môžeme určiť –XX: + PrintCodeCache Možnosť JVM. Po spustení našej aplikácie uvidíme podobný výstup:

CodeCache: veľkosť = 32768 kB použitá = 542 kB max_used = 542 kB zadarmo = 32226 kB 

Pozrime sa, čo každá z týchto hodnôt znamená:

  • veľkosť vo výstupe zobrazuje maximálnu veľkosť pamäte, ktorá je identická s ReservedCodeCacheSize
  • použité je skutočná veľkosť pamäte, ktorá sa momentálne používa
  • max_used je maximálna veľkosť, ktorá sa používa
  • zadarmo je zostávajúca pamäť, ktorá ešte nie je obsadená

The PrintCodeCache táto možnosť je veľmi užitočná, pretože môžeme:

  • uvidíme, kedy dôjde k začervenaniu
  • určiť, či sme dosiahli kritický bod využitia pamäte

5. Segmentovaná medzipamäť kódu

Od verzie Java 9 rozdeľuje JVM kódovú medzipamäť na tri odlišné segmenty, z ktorých každý obsahuje konkrétny typ skompilovaného kódu.. Konkrétnejšie, existujú tri segmenty:

  • Segment bez metódy obsahuje interný súvisiaci kód JVM, ako je napríklad interpret bytového kódu. Štandardne je tento segment okolo 5 MB. Je tiež možné konfigurovať veľkosť segmentu pomocou -XX: NonNMethodCodeHeapSize ladiaca vlajka
  • Segment profilovaného kódu obsahuje ľahko optimalizovaný kód s potenciálne krátkou životnosťou. Aj keď je veľkosť segmentu predvolene okolo 122 MB, môžeme ju zmeniť prostredníctvom -XX: ProfiledCodeHeapSize ladiaca vlajka
  • Neprofilovaný segment obsahuje plne optimalizovaný kód s potenciálne dlhou životnosťou. Podobne je to predvolene okolo 122 MB. Túto hodnotu je samozrejme možné konfigurovať pomocou -XX: NonProfiledCodeHeapSize ladiaca vlajka

Táto nová štruktúra zaobchádza s rôznymi typmi vyhovujúceho kódu odlišne, čo vedie k lepšiemu celkovému výkonu.

Napríklad oddelenie krátkodobého kompilovaného kódu od kódu s dlhou životnosťou zlepšuje výkon zametača metód - hlavne preto, že musí skenovať menšiu oblasť pamäte.

6. Záver

Tento rýchly článok predstavuje krátky úvod do medzipamäte JVM Code Cache.

Ďalej sme predstavili niektoré možnosti využitia a vyladenia na sledovanie a diagnostiku tejto oblasti pamäte.


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