2014-11-25 10 views
69

Fino Java 7 C'era un'area in memoria JVM chiamato PermGen, dove JVM utilizzata per mantenere le sue classi. In Java 8 è stato rimosso e sostituito da un'area chiamata Metaspace.Qual è la differenza tra PermGen e Metaspace?

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

L'unica differenza che so è che java.lang.OutOfMemoryError: PermGen space non può più essere gettato e il parametro VM MaxPermSize viene ignorato.

+0

primo risultato di Google: http://www.infoq.com/articles/Java-PERMGEN-Removed – the8472

+0

@ 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

risposta

77

La principale differenza da un punto di vista dell'utente - che credo che la risposta precedente non sottolineare abbastanza - è che Metaspace da aumenti auto predefinite sua dimensione (fino a ciò che fornisce il sistema operativo sottostante), mentre PermGen ha sempre una dimensione massima fissa. È possibile impostare un valore massimo fisso per Metaspace con i parametri JVM, ma non è possibile aumentare automaticamente PermGen.

In larga misura si tratta solo di un cambiamento di nome. Ai tempi in cui è stato introdotto PermGen, non vi era alcuna Java EE o classe dinamica (non) di carico, quindi una volta che una classe è stata caricata era bloccato in memoria fino a quando la JVM chiuso - così permanente Generation. Oggigiorno le classi possono essere caricate e scaricate durante la vita della JVM, quindi Metaspace ha più senso per l'area in cui sono conservati i metadati.

Entrambe contengono le istanze java.lang.Class ed entrambe soffrono di ClassLoader leaks. L'unica differenza è che con le impostazioni predefinite di Metaspace, ci vuole più tempo fino a quando non si notano i sintomi (dal momento che aumenta automaticamente il più possibile), cioè si spinge il problema più lontano senza risolverlo. OTOH Immagino che l'effetto dell'esaurimento della memoria del sistema operativo possa essere più severo di un semplice esaurimento del PermGen di JVM, quindi non sono sicuro che si tratti di un miglioramento.

Se si sta utilizzando una JVM con PermGen o con Metaspace, se si sta eseguendo lo scaricamento dinamico della classe, è necessario prendere misure contro perdite di classloader, ad esempio utilizzando il mio ClassLoader Leak Prevention library.

+3

Né Permgen, né Metaspace contengono istanze della classe Class. Mantengono solo le meta informazioni sulle classi caricate. Le istanze della classe Le classi sono mantenute nell'heap regolare, come le istanze di altre classi. –

+0

Bel confronto. Grazie – Sandeep

23

Bye, Bye PermGen, Ciao Metaspace

PermGen è stato completamente rimosso.

Metaspace raccolta dei rifiuti - Immondizia raccolta delle classi morti e classloader viene attivato una volta l'utilizzo di metadati di classe raggiunge il MaxMetaspaceSize.

Lo spazio Metadata è tenuta non è più contiguo alla Java heap, il metadata ha ora spostato memoria nativo di una zona conosciuta come Metaspace.

in parole semplici,

Poiché i metadati di classe è allocata la memoria nativa, lo spazio massimo disponibile è la memoria totale disponibile di sistema. Pertanto, non incontrerai più OOM errors e potresti finire fuoriuscire nello spazio di swap.

La rimozione di PermGen non significa che i vostri problemi di perdita di class loader sono andati. Quindi, sì, dovrai comunque monitorare il tuo consumo e pianificare di conseguenza, poiché una perdita finirebbe per consumare tutta la tua memoria nativa.

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

+6

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

5

In breve, Metaspace automatico delle dimensioni aumenta in memoria nativo necessario per caricare i metadati di classe se non ristretta con -XX:MaxMetaspaceSize

Problemi correlati