Bessere Möglichkeiten, um Objekte zu identifizieren, die keinen Müll sammeln?

8

Auf den Punkt gebracht

Ich habe ein Programm, das nach und nach mehr und mehr Speicher verwendet. Ich benutze jmap und jhat, um es zu diagnostizieren, bin aber immer noch nicht ganz da.

Hintergrund

Das Programm ist ein lang laufender Server, der von einem hbase-Datenspeicher unterstützt wird, der vielen anderen Dingen einen Secondhand-Service bietet. Nach einer Laufzeit von einigen Tagen wird es jedoch irgendwann das zugewiesene Heap-Limit erreichen und mit fast der gesamten Zeit, die für die Garbage Collection aufgewendet wurde, hin- und herwechseln. Es scheint so, als würden Referenzen zu vielen Daten gespeichert werden

Was ich bisher gemacht habe

Nachdem ich mit jstat und jconsole herumgespielt habe, habe ich am Ende Heapdumps mit jmap des laufenden Prozesses genommen und jhat ausgeführt, und die Zahlen simple addieren sich nicht in der Nähe der Speicherauslastung

jmap -F -dump:live,format=b,file=heap.dump 12765

jmap -F -dump:format=b,file=heap.all 12765

Einige Dinge oben im Histogramm

%Vor%

Obwohl die Summen hier nicht zusammengerechnet werden, verwendete der Prozess an dem Punkt, an dem der Heapspeicherauszug erstellt wurde, mehr als 1 GB Speicher.

Der unmittelbare scheinbare Täter scheint, als würde ich HBase Result und KeyValue Einträge überallhin hinterlassen. Beim Versuch, die Referenzen zu verfolgen, habe ich schließlich

getroffen %Vor%

Hilfe benötigt:

Es scheint keine Verweise auf dieses letzte HBaseClient $ Call-Objekt (oder eines der anderen ähnlichen Objekte zu geben, die jeweils etwa tausend Schlüsselwerte mit all ihren internen Daten enthalten). Sollte es nicht GCed werden? Verkenne ich nur, wie das GC funktioniert oder in welchem ​​Umfang jhat Verweise verifizieren wird? Was kann ich noch tun, um meine "fehlende" Erinnerung aufzuspüren? Welche anderen Schritte kann ich unternehmen, um dies nachzuverfolgen?

    
juhanic 21.12.2010, 02:39
quelle

3 Antworten

3

Überprüfen Sie diesen Java Memory Monitoring-Artikel Link

Dies kann Ihnen helfen, Ihr Problem zu überwinden Ссылка

    
gmhk 21.12.2010 02:54
quelle
1

Sie können den JProfiler 10 Tage kostenlos testen. Mit JProfiler lösen Sie dieses Problem in wenigen Minuten.

    
Dave 21.12.2010 08:29
quelle
0

Ich empfehle zuerst, JVisualVM zu versuchen, das mit dem neuesten JDK verbreitet wird.

Auch wenn Sie die Kosten rechtfertigen können, habe ich festgestellt, dass JProfiler im Laufe der Jahre ein ausgezeichnetes Werkzeug ist.

    
Lawrence Dol 21.12.2010 02:47
quelle