Qual è la differenza tra PermGen e Metaspace?


118

Fino a Java 7 c'era un'area nella memoria JVM chiamata PermGen , dove JVM era solita mantenere le sue classi. In Java 8 è stato rimosso e sostituito da un'area chiamata Metaspace .

Quali sono le differenze più importanti tra PermGen e Metaspace?

L'unica differenza che so è che java.lang.OutOfMemoryError: PermGen spacenon può più essere lanciato e il parametro VM MaxPermSizeviene ignorato.



@ the8472 Sì, ma questo (e molti altri) risultati di Google descrivono solo il meccanismo Metaspace, senza menzionare nulla sulle differenze esatte tra questo e PermGen.
Kao

Risposte:


137

La principale differenza dal punto di vista dell'utente - che penso che la risposta precedente non sottolinei abbastanza - è che Metaspace per impostazione predefinita aumenta automaticamente le sue dimensioni (fino a ciò che fornisce il sistema operativo sottostante), mentre PermGen ha sempre una dimensione massima fissa. È possibile impostare un massimo fisso per Metaspace con i parametri JVM, ma non è possibile aumentare automaticamente PermGen.

In larga misura è solo un cambio di nome. Quando è stato introdotto PermGen, non c'era il caricamento di Java EE o di una classe dinamica, quindi una volta che una classe è stata caricata, è rimasta bloccata in memoria fino allo spegnimento della JVM, quindi la generazione permanente . Al giorno d'oggi le classi possono essere caricate e scaricate durante il ciclo di vita della JVM, quindi Metaspace ha più senso per l'area in cui sono conservati i metadati.

Entrambi contengono le java.lang.Classistanze ed entrambi soffrono di perdite di ClassLoader . L'unica differenza è che con le impostazioni predefinite di Metaspace, ci vuole più tempo prima di notare i sintomi (poiché aumenta automaticamente il più possibile), cioè si allontana il problema senza risolverlo. OTOH Immagino che l'effetto dell'esaurimento della memoria del sistema operativo possa essere più grave del semplice esaurimento di JVM PermGen, quindi non sono sicuro che sia un gran miglioramento.

Sia che tu stia utilizzando una JVM con PermGen o con Metaspace, se stai eseguendo lo scaricamento dinamico della classe, dovresti prendere misure contro le perdite di classloader, ad esempio utilizzando la mia libreria ClassLoader Leak Prevention .


17
Né Permgen, né Metaspace contengono istanze della classe Class. Conservano solo le meta informazioni sulle classi caricate. Le istanze della classe Class vengono mantenute in un mucchio regolare, come le istanze di altre classi.
Media Joe

Bel confronto. Grazie
Sandeep

1
A proposito, OTOH significa "Dall'altra parte"
sofs1

43

Ciao, ciao PermGen, ciao Metaspace

PermGen è stato completamente rimosso.

Metaspace Garbage Collection : la Garbage Collection delle classi morte e dei classloader viene attivata una volta che l'utilizzo dei metadati della classe raggiunge il MaxMetaspaceSize.

Lo spazio è Metadatastato tenuto non è più contiguo al Java heap, metadataora si è spostato nella memoria nativa in un'area nota come il Metaspace.

In parole semplici ,

Poiché i metadati della classe vengono allocati fuori dalla memoria nativa, lo spazio disponibile massimo è la memoria di sistema disponibile totale. Pertanto, non incontrerai più OOM errorse potresti finire per riversarsi nello spazio di scambio.

La rimozione di PermGennon significa che i problemi di perdita del caricatore di classe siano spariti. Quindi, sì, dovrai comunque monitorare i tuoi consumi e pianificare di conseguenza, poiché una perdita finirebbe per consumare l'intera memoria nativa.

Alcuni altri articoli, con analisi: Link1 , Link2 e this


6
Invece di MaxPermGen hai MaxMetaspaceSize, quindi non c'è motivo per cui userà più o meno memoria o hai meno controllo.
Peter Lawrey,

2
di che ricordo stiamo parlando qui? Memoria RAM o memoria HDD.
Dinesh

1
@Dinesh RAM (memoria interna)
Aditya Gupta

10

In breve, le dimensioni di Metaspace aumentano automaticamente nella memoria nativa come richiesto per caricare i metadati della classe se non limitati con -XX:MaxMetaspaceSize

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.