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.