2009-08-06 5 views
4

Ich habe eine Java-Anwendung, die Speicher verliert. Ich weiß, welche Objekte während der Speicherbereinigung nicht freigegeben werden, aber ich kann nicht herausfinden, was sie referenziert.Ist es möglich, das Objektdiagramm für die Garbage Collection zu "sehen"?

Ist es überhaupt möglich, eine Art Sichtbarkeit des Objektgraphen zu haben, das intern von der JVM gehalten wird?

Ist es überhaupt möglich herauszufinden, welche Objekte auf ein anderes Objekt verweisen?

+0

Warum können Sie nicht auf sie verweisen, wenn Sie wissen, welche Objekte sie sind? –

+0

Es ist eine J2ME App. Der Speicher-Profiler des Emulators sagt mir, dass es 2 Instanzen einer Klasse gibt, wenn es nur 1 sein sollte. Leider sagt es mir nicht viel mehr. – izb

Antwort

4

Auf einer wirklich grundlegenden Ebene können Sie die Befehle jhat und jmap verwenden, um eine Heap-Datei aus einem laufenden Java-Prozess zu lesen und dann zu verarbeiten - es startet einen kleinen Webserver auf einem lokalen Port. Es ist nicht einfach zu lesen, aber Sie müssen keinen Profiler kaufen, um es zu benutzen.

+0

Wow. Das ist großartig. – izb

1

Profiler tun dies. JProfiler zum Beispiel. Damals habe ich Optimizeit benutzt (die scheint jetzt tot zu sein).

Die Schlussfolgerung war, dass Zuhörer an einige Sammlung übergeben wurden und nicht aus dieser Sammlung entfernt wurden. Die Listener waren anonyme innere Klassen, die in einem Frame definiert sind, oder eine entsprechende Steuerelementklasse, die das Frame referenzierte, und eine anonyme innere Klasse hat einen impliziten Verweis auf ihre äußere Klasse. Der kleine Zuhörer hielt also den gesamten Rahmen und alle zugehörigen Objekte im aktiven Speicher.