2010-09-26 8 views
33

Ho letto che lo spazio Perm gen (o Permanent Generation) non è garbage collection. Tuttavia, nella raccolta CMS posso vedere alcune classi di scarico nel mio registro GC. Quindi la raccolta di perm è raccolta durante la raccolta completa o la raccolta CMS?In Java è raccolta spazio immondizia di generazione permanente?

+0

Eventuali duplicati di http://stackoverflow.com/questions/88235/how-to-deal-with -java-lang-outofmemoryerror-permgen-space-error? In ogni caso controlla che filo aiuterà sicuramente. –

+1

no, non è affatto duplicato. Questa è una domanda di concetto che richiede la risposta Sì/No, non una domanda alla ricerca di una soluzione per un errore. – YudhiWidyatama

risposta

32

PermGen è garbage collection come le altre parti dell'heap.

La cosa da notare qui è che PermGen contiene metadati delle classi e degli oggetti, ovvero puntatori nel resto dell'heap in cui sono allocati gli oggetti. PermGen contiene anche caricatori di classi che devono essere distrutti manualmente alla fine del loro utilizzo altrimenti rimangono in memoria e continuano a contenere riferimenti ai loro oggetti nell'heap. L'articolo "Presenting the Permanent Generation" di Jon Masamitsu sul sito di blog Sun/Oracle potrebbe aiutarti.

+0

Qual'era il blog del sole? Link non funziona ... –

+2

corretto. Era un blog di Sun quindi ora è un blog Oracle :) –

+4

Ho delineato il titolo e l'autore in modo che le persone possano trovarlo se il collegamento si interrompe nuovamente. –

27

Nelle JVM di generazione corrente, la permgen viene effettivamente raccolta come altre parti dell'heap. La pagina visualgc afferma che viene raccolta insieme alla vecchia generazione.

Nelle JVM più vecchie questo apparentemente non è sempre stato così. Ad esempio, in Java 5 il collector CMS apparentemente non ha raccolto permGen per impostazione predefinita: è possibile abilitarlo con -XX:+CMSPermGenSweepingEnabled. Ricordo anche di aver sentito che alcune JVM molto vecchie non implementavano affatto la collezione di permgen, anche se non riesco a trovare una fonte attendibile per questo ... ermm ... "factoid".

L'altro punto, è che un sacco di persone hanno in modo non corretto attribuite "OutOfMemoryError: PermGen" eccezioni alla PermGen mancata riscossione affatto. La realtà è diversa La causa più comune di questi OOME è un tipo insidioso di perdita di memoria che si manifesta quando si carica codice in una JVM in esecuzione. La perdita si verifica perché quando un'istanza di una vecchia classe che è stata sostituita rimane raggiungibile. Questo fa sì che la classe dell'oggetto sia raggiungibile, il che rende il classloader delle classi raggiungibile, il che fa sì che tutte le delle vecchie classi siano raggiungibili insieme ai loro oggetti di codice, ai loro letterali di stringa e ai loro frame statici e statici. Molti di questi oggetti trapelati vivono nello spazio permgen.


UPDATE

Come di Java 8, PermGen non esiste più: PermGen elimination in JDK 8

Problemi correlati