Permgen vs Metaspace v Jave

1. Úvod

V tomto rýchlom návode ideme skúmať rozdiely medzi oblasťami pamäte PermGen a Metaspace v prostredí Java.

Je dôležité mať na pamäti, že počnúc jazykom Java 8 nahrádza Metaspace PermGen - čo prináša niekoľko podstatných zmien.

2. PermGen

PermGen (Permanent Generation) je špeciálny priestor haldy oddelený od haldy hlavnej pamäte.

JVM sleduje metaúdaje načítanej triedy v PermGene. Okrem toho JVM ukladá všetok statický obsah do tejto pamäťovej sekcie. Patria sem všetky statické metódy, primitívne premenné a odkazy na statické objekty.

Ďalej obsahuje údaje o bajtkódoch, menách a informáciách JIT. Pred programom Java 7 bol súčasťou tejto pamäte aj program String Pool. Nevýhody pevnej veľkosti bazénu sú uvedené v našom dokumente.

Predvolená maximálna veľkosť pamäte pre 32-bitové JVM je 64 MB a 82 MB pre 64-bitovú verziu.

Predvolenú veľkosť však môžeme zmeniť pomocou možností JVM:

  • -XX: PermSize = [veľkosť] je počiatočná alebo minimálna veľkosť priestoru PermGen
  • -XX: MaxPermSize = [veľkosť] je maximálna veľkosť

Čo je najdôležitejšie, Spoločnosť Oracle úplne uvoľnila tento pamäťový priestor vo vydaní JDK 8. Ak teda použijeme tieto ladiace príznaky v prostredí Java 8 a novších verziách, zobrazí sa nasledujúce upozornenie:

>> java -XX: PermSize = 100m -XX: MaxPermSize = 200m -verzia OpenJDK 64-Bit Server VM warning: Ignorovanie možnosti PermSize; podpora bola odstránená vo verzii 8.0 OpenJDK 64-Bit Server VM warning: Ignorovanie možnosti MaxPermSize; podpora bola odstránená v 8.0 ...

Vďaka svojej obmedzenej veľkosti pamäte sa PermGen podieľa na generovaní slávneho OutOfMemoryError. Zjednodušene povedané, nakladače triedy neboli zhromažďované odpadky správne a v dôsledku toho generovali únik pamäte.

Preto dostávame chybu miesta v pamäti; deje sa to väčšinou vo vývojovom prostredí pri vytváraní nových zavádzačov tried.

3. Metaspace

Zjednodušene povedané, Metaspace je nový pamäťový priestor - počnúc verziou Java 8; nahradil starší pamäťový priestor PermGen. Najvýznamnejším rozdielom je to, ako narába s alokáciou pamäte.

Konkrétne táto oblasť natívnej pamäte sa predvolene automaticky zväčšuje.

Máme tiež nové vlajky na vyladenie pamäte:

  • MetaspaceSize a MaxMetaspaceSize - môžeme nastaviť horné hranice Metaspace.
  • MinMetaspaceFreeRatio - je minimálne percento kapacity metadát triedy zdarma po odstránení odpadu
  • MaxMetaspaceFreeRatio - je maximálne percento kapacity metadát triedy zdarma po odstránení odpadu, aby sa zabránilo zmenšeniu priestoru

Proces zberu odpadu navyše z tejto zmeny tiež prináša niektoré výhody. Zberač odpadu teraz automaticky spustí čistenie mŕtvych tried, akonáhle využitie metaúdajov triedy dosiahne svoju maximálnu veľkosť metaspace.

Preto s týmto vylepšením JVM znižuje šancu získať Nedostatok pamäte chyba.

Napriek všetkým týmto vylepšeniam stále musíme monitorovať a vyladiť metaspace, aby sme zabránili úniku pamäte.

4. Zhrnutie

V tomto rýchlom zápise sme predstavili stručný popis pamäťových oblastí PermGen a Metaspace. Ďalej sme vysvetlili kľúčové rozdiely medzi každou z nich.

PermGen stále existuje s JDK 7 a staršími verziami, ale Metaspace ponúka flexibilnejšie a spoľahlivejšie využitie pamäte pre naše aplikácie.


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