Permgen vs Metaspace u Javi

1. Uvod

U ovom brzom vodiču, ispitat ćemo razlike između memorijskih regija PermGen i Metaspace u Java okruženju.

Važno je imati na umu da, počevši od Jave 8, Metaspace zamjenjuje PermGen - donoseći neke značajne promjene.

2. PermGen

PermGen (Permanent Generation) je poseban prostor hrpe odvojen od hrpe glavne memorije.

JVM prati učitane metapodatke klase u PermGenu. Uz to, JVM pohranjuje sav statički sadržaj u ovaj odjeljak memorije. To uključuje sve statičke metode, primitivne varijable i reference na statičke objekte.

Nadalje, sadrži podatke o bajt kodu, imenima i JIT informacijama. Prije Jave 7, String Pool je također bio dio ove memorije. Nedostaci fiksne veličine bazena navedeni su u našem opisu.

Zadana maksimalna veličina memorije za 32-bitni JVM je 64 MB i 82 MB za 64-bitnu verziju.

Međutim, zadanu veličinu možemo promijeniti pomoću JVM opcija:

  • -XX: PermSize = [veličina] je početna ili minimalna veličina prostora PermGen
  • -XX: MaxPermSize = [veličina] je maksimalna veličina

Najvažnije, Oracle je u potpunosti uklonio ovaj memorijski prostor u izdanju JDK 8. Stoga, ako koristimo ove zastavice za podešavanje u Javi 8 i novijim verzijama, dobit ćemo sljedeća upozorenja:

>> java -XX: PermSize = 100m -XX: MaxPermSize = 200m -verzija OpenJDK 64-bitni poslužitelj VM upozorenje: ignoriranje opcije PermSize; podrška je uklonjena u 8.0 OpenJDK 64-bitnom poslužitelju VM upozorenje: ignoriranje opcije MaxPermSize; podrška je uklonjena za 8.0 ...

Sa svojom ograničenom veličinom memorije, PermGen je uključen u stvaranje slavnih OutOfMemoryError. Jednostavno rečeno, učitavači klasa nisu pravilno sakupljali smeće i kao rezultat toga generirali su curenje memorije.

Stoga primamo pogrešku u memorijskom prostoru; to se uglavnom događa u razvojnom okruženju tijekom stvaranja novih učitavača klase.

3. Metaprostor

Jednostavno rečeno, Metaspace je novi memorijski prostor - počevši od verzije Java 8; zamijenio je stariji prostor memorije PermGen. Najvažnija je razlika u načinu na koji postupa s dodjelom memorije.

Posebno, ovo područje izvorne memorije automatski raste prema zadanim postavkama.

Imamo i nove zastavice za podešavanje memorije:

  • MetaspaceSize i MaxMetaspaceSize - možemo postaviti gornje granice Metaspacea.
  • MinMetaspaceFreeRatio - je minimalni postotak slobodnog kapaciteta metapodataka klase nakon odvoza smeća
  • MaxMetaspaceFreeRatio - je maksimalan postotak slobodnog kapaciteta metapodataka klase nakon odvoza smeća kako bi se izbjeglo smanjenje prostora

Uz to, postupak odvoza smeća također donosi neke koristi od ove promjene. Sakupljač smeća sada automatski pokreće čišćenje mrtvih klasa kada upotreba metapodataka klase dosegne maksimalnu veličinu metaprostora.

Stoga, ovim poboljšanjem JVM smanjuje šansu za dobivanje Bez memorije pogreška.

Unatoč svim tim poboljšanjima, još uvijek moramo nadzirati i podesiti metaprostor kako bismo izbjegli curenje memorije.

4. Sažetak

U ovom kratkom opisu predstavili smo kratki opis memorijskih regija PermGen i Metaspace. Dodatno, objasnili smo ključne razlike između svake od njih.

PermGen je još uvijek prisutan s JDK 7 i starijim verzijama, ali Metaspace nudi fleksibilnije i pouzdanije korištenje memorije za naše aplikacije.