Permgen vs Metaspace in Java

1. Introduzione

In questo breve tutorial, esamineremo le differenze tra le regioni di memoria PermGen e Metaspace nell'ambiente Java.

È importante tenere presente che, a partire da Java 8, Metaspace sostituisce PermGen, apportando alcune modifiche sostanziali.

2. PermGen

PermGen (Permanent Generation) è uno spazio di heap speciale separato dall'heap di memoria principale .

La JVM tiene traccia dei metadati della classe caricati in PermGen. Inoltre, la JVM memorizza tutto il contenuto statico in questa sezione di memoria. Ciò include tutti i metodi statici, le variabili primitive e i riferimenti agli oggetti statici.

Inoltre, contiene dati su bytecode, nomi e informazioni JIT . Prima di Java 7, anche lo String Pool faceva parte di questa memoria. Gli svantaggi della dimensione fissa del pool sono elencati nel nostro articolo.

La dimensione di memoria massima predefinita per JVM a 32 bit è 64 MB e 82 MB per la versione a 64 bit.

Tuttavia, possiamo modificare la dimensione predefinita con le opzioni JVM:

  • -XX: PermSize = [size] è la dimensione iniziale o minima dello spazio PermGen
  • -XX: MaxPermSize = [size] è la dimensione massima

Ancora più importante, Oracle ha rimosso completamente questo spazio di memoria nella versione JDK 8. Pertanto, se utilizziamo questi flag di ottimizzazione in Java 8 e versioni successive, riceveremo i seguenti avvisi:

>> 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 ...

Con la sua dimensione di memoria limitata, PermGen è coinvolto nella generazione del famoso OutOfMemoryError . In poche parole, i caricatori di classi non sono stati raccolti correttamente e, di conseguenza, hanno generato una perdita di memoria.

Pertanto, riceviamo un errore di spazio di memoria; questo accade principalmente nell'ambiente di sviluppo durante la creazione di nuovi caricatori di classi.

3. Metaspace

In poche parole, Metaspace è un nuovo spazio di memoria - a partire dalla versione Java 8; ha sostituito il vecchio spazio di memoria PermGen . La differenza più significativa è il modo in cui gestisce l'allocazione della memoria.

In particolare, questa regione di memoria nativa cresce automaticamente per impostazione predefinita .

Abbiamo anche nuovi flag per ottimizzare la memoria:

  • MetaspaceSize e MaxMetaspaceSize: possiamo impostare i limiti superiori di Metaspace.
  • MinMetaspaceFreeRatio: è la percentuale minima di capacità dei metadati della classe libera dopo la raccolta dei rifiuti
  • MaxMetaspaceFreeRatio : è la percentuale massima di capacità dei metadati della classe libera dopo una raccolta di dati inutili per evitare una riduzione della quantità di spazio

Inoltre, anche il processo di Garbage Collection ottiene alcuni vantaggi da questa modifica. Il garbage collector ora attiva automaticamente la pulizia delle classi morte una volta che l'utilizzo dei metadati della classe raggiunge la dimensione massima del metaspace.

Pertanto, con questo miglioramento, JVM riduce la possibilità di ottenere l' errore OutOfMemory .

Nonostante tutti questi miglioramenti, dobbiamo ancora monitorare e ottimizzare il metaspace per evitare perdite di memoria.

4. Riepilogo

In questo breve articolo, abbiamo presentato una breve descrizione delle regioni di memoria di PermGen e Metaspace. Inoltre, abbiamo spiegato le principali differenze tra ciascuno di essi.

PermGen è ancora disponibile con JDK 7 e versioni precedenti, ma Metaspace offre un utilizzo della memoria più flessibile e affidabile per le nostre applicazioni.