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?