2013-06-13 34 views
7

Ho un'applicazione web di tipo "Hello world" molto semplice (Spring 3.2.1, Hibernate 4.1.9) per arrestare/riavviare l'app Web Tomcat 7.0.26permgen, ma Java VisualVM dice "Nessuna radice GC trovata"

The following web applications were stopped (reloaded, undeployed), but their 
classes from previous runs are still loaded in memory, thus causing a memory 
leak (use a profiler to confirm): 
/myapp 

presi i seguenti passaggi: preliminari jvisualvm Fare clic destro su Tomcat e selezionati 'Heap Dump' cliccato su 'OQL Console' sul [heapDump] eseguito questo query:

select x from org.apache.catalina.loader.WebappClassLoader x 

Trovate 4 istanze di:

org.apache.catalina.loader.WebappClassLoader 

quello selezionato la cui "ha iniziato" il campo è stato "false" destro cliccato sul "questo" di riferimento e cliccato su "Mostra GC più vicina Root" una finestra di dialogo che dice "No radice GC trovato" viene visualizzato.

Cosa mi manca? Qualsiasi aiuto sarà molto apprezzato. Grazie.

+0

Qualche aggiornamento su questo?Sono alle prese con questo problema per. Qualcosa da condividere? – ggarciao

+0

@ggarciao, senza tregua. – kmansoor

+0

Ho creato sul thread Stackoverflow con il mio caso http://stackoverflow.com/questions/19470328/webappclassloader-memory-leak-even-with-no-g-roots – ggarciao

risposta

-3

Provare a chiudere javaw.exe dai processi di Task Manager.

+0

E se l'INV. Tomcat è distribuito su Linux? Cosa succede se ci sono altre applicazioni distribuite in t/c? Inoltre, lo spegnimento potrebbe non essere un'opzione. – kmansoor

4

Con tutti i tutorial sul web, che mostra il processo esatto che lei descrive,

  1. uso VisualVM,
  2. ricerca di WebappClassLoader,
  3. cercare quelli con 'iniziato' uguale a false.
  4. Fare clic su 'Visualizza più vicino GC Root'

Può essere confuso quando ritorna 'No GC Root'.

Ma questa è una buona cosa

Quei tutorial hanno perso un passo, quando si visualizza l'elenco dei WebappClassLoader click sul link 'Compute Utili Size' sul lato destro

visualVM showing link to compute retained sizes

Dopo un po '(a seconda della dimensione totale del tuo heap) questo mostrerà qualcosa come il seguente

visualVM showing retained sizes

Le righe con un valore Mantenuto di 0 sono anche i ClassLoaders con stato falso e nessuna radice GC.

Ciò significa semplicemente che sono pronti per la successiva esecuzione del GC eseguita dalla JVM.

Sommario: Anche se 'tomcat leak Detection' mostra la perdita, se la dimensione mantenuta è 0, non ha perso, è solo in attesa che GC la rimuova.

Nota: l'attivazione di un GC in visualVM non la rimuove sempre. Anche se verrà rimosso da un GC attivato dalla JVM stessa.