Fehlerbehebung ein java memory leak: Finalisierung?
Habe ich eine fehlerhafte Anwendung, die scheint zu lecken. Nach einer kurzen profiler Untersuchung, die meisten memory (80%) wird gehalten von java.lang.ref.Finalizer
Instanzen. Ich vermute, dass Finalizer nicht ausgeführt werden.
Eine häufige Ursache scheint zu sein, Ausnahmen von den finalizer. Doch die javadoc für die finalize
Methode der Object
Klasse (siehe hier zum Beispiel) scheint dem zu widersprechen sich selbst: es besagt
Wenn eine nicht abgefangene exception geworfen wird, indem Sie die finalize-Methode, die Ausnahme wird ignoriert und die Fertigstellung dieses Objekts beendet.
aber später, es sagt auch, dass
Jede Ausnahme, die ausgelöst durch die finalize-Methode bewirkt, dass die Fertigstellung dieses Objekts angehalten werden, ist ansonsten aber ignoriert.
Was soll ich glauben (d.h., ist die Fertigstellung gestoppt oder nicht?), und haben Sie irgendwelche Tipps, wie Sie zu untersuchen, eine solche offensichtliche Undichtigkeiten?
Dank
Sehen Sie, welche Arten gehalten werden, durch diese Instanzen? Ist es nur einer begrenzten Gruppe von Klassen, oder ist es alles über Ihr Projekt?
Das Geheime Leben der Finalizer fasterj.com/articles/finalizer1.shtml,
InformationsquelleAutor Rom1 | 2011-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mein Erster Schritt wäre, um festzustellen, ob dies ist ein echter memory leak oder nicht.
Angesprochenen Punkte in den vorherigen Antworten beziehen sich alle auf die Geschwindigkeit an, welche Objekte gesammelt werden, nicht die Frage, ob Ihre Objekte erfasst werden alle. Nur die letztere ist ein echter memory leak.
Hatten wir ein ähnliches Dilemma auf mein Projekt, und lief die Anwendung in "slow-motion" Modus, um herauszufinden, wenn wir hatten ein richtiges Leck. Wir waren in der Lage, dies zu tun durch die Verlangsamung der Strom von Eingabedaten.
Wenn das problem verschwindet, wenn Sie laufen in "slow-motion" Modus, dann das problem ist wahrscheinlich einer von denen vorgeschlagen, die bisherigen Antworten, also die Finalizer-thread kann nicht verarbeiten, die finalizer-Warteschlange schnell genug.
Wenn das ist das problem, es klingt wie Sie möglicherweise tun müssen, einige nicht-triviale refactoring, wie beschrieben in der Seite Bringer128 verbunden, z.B.
Das ist zunächst, was wir vermutet, aber es stellte sich heraus, etwas anderes zu sein ("home-grown-task-queue, die nicht mithalten konnte mit hoher Frequenz Daten). Wir hatten den Luxus, in der Lage zu entfernen unsere Finalizer Prüfung unserer Theorien, ohne tödlich zu beeinflussen system Verhalten.
InformationsquelleAutor Phil Harvey
Beide Zitate sagen:
Beiden Zitate auch sagen:
So, dass die Antworten der ersten Hälfte Ihrer Frage. Ich weiß nicht genug über Finalizer Ihnen Ratschläge geben, tracking down your memory leak obwohl.
EDIT: ich fand auf dieser Seite, die von nutzen sein könnten. Es wurde beraten, wie die Einstellung der Felder auf null manuell in Finalizer zu ermöglichen, um die GC, um Sie zurückzugewinnen.
EDIT2: Einige interessante links und Zitate:
Vom Anatomie eines Java-Finalizer
und auch
EDIT3: Nach der Lektüre mehr von der Anatomie der link, es scheint, dass das werfen von Ausnahmen in der Finalizer-thread wirklich verlangsamt, fast so viel wie der Aufruf von Thread.yield(). Sie scheinen Recht zu sein, dass der Finalizer-thread schließlich fahne das Objekt, wie in der Lage zu sein, die GC würde, selbst wenn eine Ausnahme ausgelöst wird. Da jedoch die Verlangsamung signifikante es ist möglich, dass in Ihrem Fall die Finalizer-thread ist nicht zu halten mit der Objekt-Erstellung-und-fallen-aus-dem-Rahmen-rate.
Für mich hier aufgehalten Mittel gestoppt
Ich aktualisiert meine Antwort enthält einen link, der erscheint, um zu erklären es ganz gut.
InformationsquelleAutor Bringer128
Den Tagesordnungspunkt 7 Wirksam Java-second edition ist: "Vermeiden Sie Finalizer". Ich empfehle Ihnen dringend, es zu Lesen. Hier ist ein Auszug, die Ihnen helfen können:
"Explizite Kündigung Methoden werden in der Regel in Kombination mit try-finally-Konstrukt, um sicherzustellen Kündigung"
Diese werden nicht direkt die Antwort auf deine Frage butI bin davon überzeugt, dass es ist der Weg zu gehen, auch wenn Sie ändern müssen, um eine andere große code-Basis.
Damit wird die Frage beantwortet, ob Finalizer sind gut für die Fehlerbehebung... was Sie nicht sind.
InformationsquelleAutor Manuel Selva
Ich habe das gleiche Problem mit Ihnen (Bild unten). Für unseren Fall, weil es ein Objekt hat
wait(0)
in seiner abzuschließen und es auch nie mitgeteilt bekommen, in welchem block der java.lang.ref.Finalizer$FinalizerThread. Mehr ReferenzInformationsquelleAutor leef
habe ich mal ein ähnliches problem, das ist der finalizer-thread kann nicht aufholen mit der rate der Erzeugung von beendbar Objekte.
meine Lösung ist, die eine closed-loop-Kontrolle, die durch die Nutzung der MemoryMXBean .getObjectPendingFinalizationCount(), PD( proportional-und diffrential) algo control zur Steuerung der Geschwindigkeit, die wir generieren, die beendbar Objekte, da haben wir einen einzelnen Eintrag zu erstellen, einfach nur schlafen Anzahl der Sekunden, mit dem Ergebnis, pd algo. es funktioniert gut, obwohl Sie benötigen, Stimmen Sie die Parameter für die pd-algo.
hoffe, es hilft.
InformationsquelleAutor samuel.song