2013-06-13 13 views
7

Ich habe eine sehr einfache 'Hallo Welt' Typ Web-Anwendung (Frühling 3.2.1, Hibernate 4.1.9) auf Stoppen/Neustart der Web-App Tomcat 7.0.26permgen, aber Java VisualVM sagt "No GC root found"

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 

nahm ich die folgenden Schritte: gestartet jvisualvm Rechts auf Tomcat klicken und 'Heap Dump' klickte auf 'OQL Console' auf der [heapdump] Ran diese Abfrage ausgewählt:

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

Gefunden 4 Fälle von:

org.apache.catalina.loader.WebappClassLoader 

Ausgewählte, das „gestartet“ Feld war „false“ Direkt am „diese“ Referenz geklickt und „Show Nächsten GC Root“ geklickt Ein Dialog „No GC Wurzel gefunden“ angezeigt sagen.

Was fehlt mir? jede Hilfe wird sehr geschätzt. Danke.

+0

Irgendwelche Updates zu diesem Thema?Ich habe mit diesem Problem zu kämpfen. Etwas zu teilen? – ggarciao

+0

@ggarciao, noch keine Atempause. – kmansoor

+0

Ich habe auf Stackoverflow Thread mit meinem Fall http://stackoverflow.com/questions/19470328/webappclassloader-memory-leak-even-with-no-gc-roots erstellt – ggarciao

Antwort

-3

Versuchen Sie die javaw.exe von den Task-Manager-Prozessen zu schließen.

+0

Was ist, wenn die env. Ist Tomcat auf Linux bereitgestellt? Was ist, wenn andere Anwendungen für t/c bereitgestellt werden? Außerdem kann das Herunterfahren keine Option sein. – kmansoor

4

Mit allen Tutorials im Internet aus, zeigt den genauen Prozess, den Sie beschreiben,

  1. Verwendung VisualVM,
  2. Suche nach WebappClassLoader,
  3. Look für diejenigen, die mit 'gestartet' gleich falsch.
  4. Klicken Sie auf ‚Zeige nächste GC-Stamm‘

Es kann verwirrend sein, wenn es keine GC-Stamm 'zurückgibt.

Aber das ist eine gute Sache

Diese Tutorials einen Schritt verpasst haben, wenn die Liste der WebappClassLoader klicken Sie auf den Link sehen ‚Compute Retained Size‘ auf der rechten Seite

visualVM showing link to compute retained sizes

Nach ein wenig (abhängig von der Gesamtgröße Ihres Heap) wird dies etwa so aussehen:

visualVM showing retained sizes

Die Zeilen mit einem beibehaltenen Wert von 0 sind auch die ClassLoaders, die den Status false und keine GC Root haben.

Dies bedeutet nur, dass sie für den nächsten GC-Lauf bereit sind, den die JVM ausführt.

Zusammenfassung: Obwohl "Tomcat Leak Detection" das Leck anzeigt, ist die zurückgehaltene Größe 0, es ist nicht geleakt, es wartet nur darauf, dass GC es entfernt.

Hinweis: Das Auslösen eines GC in VisualVM wird nicht immer entfernt. Obwohl es durch einen von der JVM selbst ausgelösten GC entfernt wird.