2008-12-04 7 views
9

Ich habe ein Java-Applet (ein tatsächlich <APPLET>) geerbt, der nach ca. 4 Tagen der Laufzeit eine OutOfMemory Ausnahme auslöst. Die Art des Applets ist so, dass die Leute es wirklich für längere Zeit offen lassen.constantPoolClass in Java-Heap?

Nach fast zwei Tage laufen, jmap -histo zeigt die Top-Heap-Verbraucher:

 
    num #instances #bytes class name 
    --- ---------- ------ ---------- 
     1:  14277 7321880 <constantPoolKlass> 
     2:  59626 5699968 <constMethodKlass> 
     3:  14047 5479424 <constantPoolCacheKlass> 
     4:  14277 5229744 <instanceKlassKlass> 
     5:  59626 4778944 <methodKlass> 
     6:  71026 3147624 <symbolKlass> 

Das Problem ist, ich verstehe nicht, was alle diese Dinge sind. Es gibt mindestens zwei Dinge: constantPoolKlass + constantPoolCacheKlass + instanceKlassKlass erscheinen ähnlich wie constMethodKlass + methodKlass. Von den Namen erscheinen sie mit einem Klassenlader verwandt.

Wenn ich raten müsste, würde ich sagen, dass das Applet ungefähr 14.277 Objekte erzeugt, wobei jedes Objekt ungefähr 4 Methoden hat, für ungefähr 59626 Methoden insgesamt. Doch die jmap-Ausgabe zeigt keine Klasse mit einer so großen Anzahl von Instanzen an, noch sieht es so aus, als ob die Summe aller anderen Klassenobjekte zu 14277 addiert würde. Also bin ich vielleicht falsch, was diese Objekte tun. Kann jemand das erklären?

Antwort

4

Yup, sieht aus wie Sie Klasse Lader auslaufen. Wenn Sie tatsächlich keine Klassenladeprogramme in Ihrem eigenen Code erstellen (normalerweise über URLClassLoader.newInstance oder XSLT), kann dies mit dem erneuten Laden des Applets zusammenhängen (obwohl Sie normalerweise denselben Klassenlader zurückbekommen würden). Mögliche Ursachen für Lecks sind ThreadLocal, JDBC-Treiber und java.beans.

2

Spot on - offensichtlich ein Problem Classloader. Sehr seltsam, das in einem Applet zu sehen. Normalerweise ist es nur ein Problem mit Appservern oder IDEs.

2 Möglichkeiten, dies zu debuggen: entweder einen echten Heap-Profiler erhalten, die Sie, wo Ihre Ausreißer Klassendaten verwiesen wird zeigen können, oder die API-Klassen Patch wie hier beschrieben: http://www.onjava.com/pub/a/onjava/2004/06/30/classloader2.html?page=2