Permgen vs Metaspace i Java

1. Introduktion

I denna snabba handledning ska vi undersöka skillnaderna mellan PermGen- och Metaspace-minnesregionerna i Java-miljön.

Det är viktigt att komma ihåg att Metaspace, från och med Java 8, ersätter PermGen - vilket medför några betydande förändringar.

2. PermGen

PermGen (Permanent Generation) är ett speciellt högutrymme åtskilt från huvudminneshög .

JVM håller reda på laddade klassmetadata i PermGen. Dessutom lagrar JVM allt det statiska innehållet i detta minnesavsnitt. Detta inkluderar alla statiska metoder, primitiva variabler och referenser till de statiska objekten.

Dessutom innehåller den data om bytkod, namn och JIT-information . Innan Java 7 var strängpoolen också en del av detta minne. Nackdelarna med den fasta poolstorleken anges i vår uppskrivning.

Standard maximal minnesstorlek för 32-bitars JVM är 64 MB och 82 MB för 64-bitarsversionen.

Vi kan dock ändra standardstorleken med JVM-alternativen:

  • -XX: PermSize = [storlek] är den ursprungliga eller minsta storleken på PermGen-utrymmet
  • -XX: MaxPermSize = [storlek] är den maximala storleken

Viktigast av allt tog Oracle bort detta minnesutrymme i JDK 8-versionen. Om vi ​​använder dessa tuningflaggor i Java 8 och nyare versioner får vi därför följande varningar:

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0 ...

Med sin begränsade minnesstorlek är PermGen inblandad i att skapa den berömda OutOfMemoryError . Enkelt uttryckt, klasslastarna samlade inte in skräp ordentligt och genererade därför minnesläckage.

Därför får vi ett minnesutrymmesfel; detta händer mestadels i utvecklingsmiljön samtidigt som nya klasslastare skapas.

3. Metaspace

Enkelt uttryckt är Metaspace ett nytt minnesutrymme - med början från Java 8-versionen; den har ersatt det äldre PermGen-minnesutrymmet . Den viktigaste skillnaden är hur den hanterar minnestilldelning.

Specifikt växer denna inbyggda minnesregion automatiskt som standard .

Vi har också nya flaggor för att ställa in minnet:

  • MetaspaceSize och MaxMetaspaceSize - vi kan ställa in Metaspace övre gränser.
  • MinMetaspaceFreeRatio - är den minsta procentandelen av klassens metadata kapacitet fri efter skräpsamling
  • MaxMetaspaceFreeRatio - är den maximala procentandelen av klass metadata kapacitet ledig efter en skräpsamling för att undvika en minskning av mängden utrymme

Dessutom får sopuppsamlingsprocessen också några fördelar med denna förändring. Sopsamlaren utlöser nu automatiskt rengöringen av de döda klasserna när klassens metadataanvändning når sin maximala metaspacestorlek.

Därför minskar JVM chansen att få OutOfMemory- felet med denna förbättring .

Trots alla dessa förbättringar behöver vi fortfarande övervaka och ställa in metaspace för att undvika minnesläckor.

4. Sammanfattning

I denna snabbskrivning presenterade vi en kort beskrivning av PermGen- och Metaspace-minnesregionerna. Dessutom förklarade vi de viktigaste skillnaderna mellan var och en av dem.

PermGen finns fortfarande kvar med JDK 7 och äldre versioner, men Metaspace erbjuder mer flexibel och pålitlig minnesanvändning för våra applikationer.