In Java è raccolta la spazzatura spaziale di generazione permanente?

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?

Il PermGen è garbage collection come le altre parti dell’heap.

La cosa da notare qui è che PermGen contiene meta-dati 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 “Presentare la generazione permanente” di Jon Masamitsu sul sito del blog Sun / Oracle potrebbe aiutarti.

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

Nelle vecchie JVM questo apparentemente non è sempre stato così. Ad esempio, in Java 5 il collector CMS apparentemente non ha raccolto permGen per impostazione predefinita: è ansible 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 molte persone hanno attribuito erroneamente le eccezioni “OutOfMemoryError: permgen” alla permgen che non viene affatto raccolta. 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 class che è stata sostituita rimane raggiungibile. Ciò fa sì che la class dell’object sia raggiungibile, il che fa sì che il classloader delle classi sia raggiungibile, il che fa sì che tutte le 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.


AGGIORNARE

A partire da Java 8, permgen non esiste più: eliminazione di PermGen in JDK 8