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.
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
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%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?
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.
Tags und Links java garbage-collection debugging jvm jhat