Questo è perdita di memoria di classe loader. Ogni volta che si ridistribuisce l'applicazione, viene creato un nuovo classloader per esso e tutte le classi dell'applicazione vengono caricate nuovamente. Questo consuma memoria nello spazio dei perm gen.
Il vecchio classloader e tutte le sue classi caricate devono essere raccolte da dati inutili, altrimenti alla fine si verificherà uno spazio PermGen OOME dopo la distribuzione di più volte. Questo non funziona se un oggetto caricato da un classloader esterno contiene un riferimento a qualsiasi oggetto caricato dal vecchio classloader. This article fornisce una buona spiegazione del problema.
Generalmente, le perdite di classloader sono difficili da analizzare e talvolta difficili da risolvere. Per scoprire perché i vecchi classloader non sono raccolti, devi usare un profiler. In JProfiler, utilizzare il walker dell'heap, selezionare gli oggetti del classloader glassfish e utilizzare la vista dei riferimenti in entrata per verificare i percorsi delle root del garbage collector.
La classe del caricatore classe è denominata org.apache.servlet.jasper.JasperLoader
. Ecco uno screenshot di una situazione normale, in cui il caricatore di classi viene tenuto solo da istanze live di oggetti caricati.
Nella tua situazione, si dovrebbe vedere i riferimenti da oggetti esterni. Un'altra causa comune di perdita di un classloader nei contenitori Web è un thread in background non arrestato. Google Guice, ad esempio, ha un tale bug in 3.0.
(Disclaimer: la mia azienda sviluppa JProfiler)
fonte
2011-10-07 09:54:45
È questo che stai cercando: http://stackoverflow.com/questions/1996088/java-class-permgen-memory-leak-web-applications-generic-solution – Raedwald