Frage

Ich bin mit JProfiler zu Speicherlecks in einer Java-Swing-Anwendung zu finden. Ich habe Instanzen eines JFrame identifiziert, die in Zahl wächst.

Dieser Rahmen wird geöffnet und dann geschlossen.

Mit JProfiler, und das Betrachten der Pfade zum GC-Stamm gibt es nur eine Referenz, ‚JNI globale Referenz‘.

Was bedeutet das? Warum hängt es auf jede Instanz des Rahmens auf?

War es hilfreich?

Lösung

Wikipedia einen guten Überblick über Java Native Interface , im Wesentlichen erlaubt es die Kommunikation zwischen Java und nativen Betriebssystembibliotheken in anderen Sprachen writen.

JNI globale Referenzen sind anfällig für Speicherlecks, da sie gesammelt nicht automatisch Müll sind, und der Programmierer muss sie explizit freizugeben. Wenn Sie keine JNI Code schreiben selbst, ist es möglich, dass die Bibliothek Sie verwenden ein Speicherleck hat.

Bearbeiten hier ist ein bisschen mehr Informationen über lokale vs. globale Referenzen und warum globale Referenzen verwendet (und wie sie freigegeben werden sollte)

Andere Tipps

Eine JNI globale Referenz ist eine Referenz von „native“ Code zu einem Java-Objekt von der Java Garbage Collector verwaltet. Sein Zweck ist Sammlung eines Objekts zu verhindern, die durch nativen Code immer noch in Gebrauch ist, aber offenbar keine Live-Referenzen in dem Java-Code haben.

Ein JFrame ist ein java.awt.Window, und ist mit einem „native“ Window-Objekt zugeordnet ist. Wenn Sie vollständig mit einer bestimmten JFrame Instanz fertig sind, sollten Sie seine dispose() Methode aufrufen bis zu reinigen.

Ich bin nicht sicher, ob jeder nativen Code ist ein globalen Verweis auf das JFrame zu schaffen, aber es scheint wahrscheinlich. Ist dies der Fall, wird verhindert, dass dies die JFrame aus wird Müll gesammelt. Wenn Sie viele Fenster (oder Unterklassen) erstellen und zu sehen, dass sie nie gesammelt werden, stellen Sie sicher, dass sie angeordnet sind.

Ich hatte genau dieses Problem, wenn Speicherlecks in einer JavaFX-Anwendung beheben. Am Ende stellte das Problem zu sein, dass ich die Anwendung ausgeführt wurde in Debug-Modus und mehrere Haltepunkte im Code hatte. Dies scheint darauf hinzu Objekte verursacht hat ‚JNI globale Referenz‘ zu sein und ohne ersichtlichen Grund im Speicher gehalten wird. Wenn ich die Debug-Modus alles ausgeschaltet funktionierte, wie es sollte!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top