ist Speicherleck? Warum java.lang.ref.Finalizer so viel Speicher essen
Lief ich einen heap dump auf meinem Programm. Wenn ich öffnete es in der memory analyzer, fand ich, dass die java.lang.ref.Finalizer
für org.logicalcobwebs.proxool.ProxyStatement
war dabei viel Speicher. Warum ist das so?
InformationsquelleAutor der Frage fuyou001 | 2011-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Klassen implementieren die
Object.finalize()
Methode. Objekte, die diese Methode überschreiben, müssen durch einen hintergrund-thread-Aufruf finalizer, und Sie können nicht gereinigt werden, bis dies geschieht. Wenn diese Aufgaben sind kurz, und Sie nicht verwerfen viele dieser es funktioniert alles gut. Allerdings, wenn Sie es schaffen, viele dieser Objekte und/oder Ihren Finalizer eine lange Zeit dauern, die Schlange der Objekte fertig gestellt werden, aufbaut. Es ist möglich, für diese Warteschlange zu verwenden, bis alle Speicher.Die Lösung ist
Die Letzte Möglichkeit ist wahrscheinlich am besten für Sie, wie Sie mit Hilfe einer vorhandenen Bibliothek.
InformationsquelleAutor der Antwort Peter Lawrey
Aus, was ich damit machen kann, Proxool ist ein connection pool von JDBC-verbindungen. Dies lässt mich vermuten, dass das problem ist, dass Ihre Anwendung missbraucht, den connection pool. Anstelle von aufrufen
close
auf die statement-Objekte, Ihren code wahrscheinlich fallen Ihnen und/oder Ihrer übergeordneten verbindungen. Die Proxool setzt auf Finalizer zu schließen, die zugrunde liegenden Treiber-Objekte implementiert ... aber dies erfordert, dass diejenigen, die Finalizer-Instanzen. Es könnte auch bedeuten, dass Sie sind, was die Verbindung zu öffnen /schließen (echte) Datenbank-verbindungen häufiger als nötig, und das wäre schlecht für die performance.Daher schlage ich vor, Sie überprüfen Sie Ihren code für die geleckt ResultSet, Statement und/oder Connection-Objekte, und stellen Sie sicher, dass Sie Sie in der Nähe in
finally
Blöcke.Blick auf die Speicher-dump, erwarte ich, dass Sie besorgt sind, wo die 898,527,228 bytes gehen. Die überwiegende Mehrheit bleibt im Finalizer Objekt, dessen id ist
2aab07855e38
. Wenn Sie immer noch die dump-Datei, nehmen Sie einen Blick an, was dassFinalizer
bezieht. Es sieht eher problematisch als die Proxool Objekte.InformationsquelleAutor der Antwort Stephen C