Permgen versus Metaspace in Java

1. Inleiding

In deze korte tutorial, we gaan de verschillen tussen de PermGen- en Metaspace-geheugengebieden onderzoeken in de Java-omgeving.

Het is belangrijk om in gedachten te houden dat, beginnend met Java 8, de Metaspace de PermGen vervangt, wat een aantal substantiële veranderingen met zich meebrengt.

2. PermGen

PermGen (permanente generatie) is een speciale heapruimte die is gescheiden van de heap van het hoofdgeheugen.

De JVM houdt de geladen klasse-metadata bij in de PermGen. Bovendien slaat de JVM alle statische inhoud op in dit geheugengedeelte. Dit omvat alle statische methoden, primitieve variabelen en verwijzingen naar de statische objecten.

Verder het bevat gegevens over bytecode, namen en JIT-informatie. Vóór Java 7 maakte ook de String Pool deel uit van dit geheugen. De nadelen van de vaste zwembadgrootte worden vermeld in ons artikel.

De standaard maximale geheugengrootte voor 32-bits JVM is 64 MB en 82 MB voor de 64-bits versie.

We kunnen de standaardgrootte echter wijzigen met de JVM-opties:

  • -XX: PermSize = [maat] is de initiële of minimale grootte van de PermGen-ruimte
  • -XX: MaxPermSize = [maat] is de maximale grootte

Het allerbelangrijkste, Oracle heeft deze geheugenruimte volledig verwijderd in de JDK 8-release. Als we deze afstemmingsvlaggen gebruiken in Java 8 en nieuwere versies, krijgen we daarom de volgende waarschuwingen:

>> java -XX: PermSize = 100m -XX: MaxPermSize = 200m -versie OpenJDK 64-bits server VM waarschuwing: Negeer optie PermSize; ondersteuning is verwijderd in 8.0 OpenJDK 64-Bit Server VM waarschuwing: Negeer optie MaxPermSize; ondersteuning is verwijderd in 8.0 ...

Met zijn beperkte geheugengrootte is PermGen betrokken bij het genereren van de beroemde Onvoldoende geheugen fout. Simpel gezegd, de klasse-laders werden niet op de juiste manier verzameld en genereerden als gevolg daarvan een geheugenlek.

Daarom ontvangen we een geheugenruimtefout; dit gebeurt meestal in de ontwikkelomgeving tijdens het maken van nieuwe class-laders.

3. Metasruimte

Simpel gezegd, Metaspace is een nieuwe geheugenruimte - vanaf de Java 8-versie; het heeft de oudere PermGen-geheugenruimte vervangen. Het belangrijkste verschil is hoe het omgaat met geheugentoewijzing.

Specifiek, dit native geheugengebied groeit standaard automatisch.

We hebben ook nieuwe vlaggen om het geheugen af ​​te stemmen:

  • MetaspaceSize en MaxMetaspaceSize - we kunnen de bovengrenzen van de Metaspace instellen.
  • MinMetaspaceFreeRatio - is het minimumpercentage van de metadatacapaciteit van de klas dat vrij is na garbagecollection
  • MaxMetaspaceFreeRatio - is het maximale percentage van de klasse metadata-capaciteit die vrij is na een garbagecollection om een ​​vermindering van de hoeveelheid ruimte te voorkomen

Bovendien profiteert het garbage collection-proces ook van deze verandering. De garbage collector activeert nu automatisch het opschonen van de dode klassen zodra het metagegevensgebruik van de klas de maximale metasruimtegrootte heeft bereikt.

Daarom met deze verbetering verkleint JVM de kans om het OutOfMemory fout.

Ondanks al deze verbeteringen moeten we de metasruimte nog steeds controleren en afstemmen om geheugenlekken te voorkomen.

4. Samenvatting

In dit korte artikel hebben we een korte beschrijving gegeven van de geheugengebieden van PermGen en Metaspace. Bovendien hebben we de belangrijkste verschillen tussen elk van hen uitgelegd.

PermGen bestaat nog steeds met JDK 7 en oudere versies, maar Metaspace biedt een flexibeler en betrouwbaarder geheugengebruik voor onze applicaties.