2008-09-22 13 views
16

Ich verwende jProfiler, um Speicherlecks in einer Java-Swing-Anwendung zu finden. Ich habe Instanzen eines JFrames identifiziert, der immer mehr zählt.Was ist 'JNI Global reference'?

Dieser Rahmen wird geöffnet und dann geschlossen.

Wenn Sie jProfiler verwenden und die Pfade zu GC Root anzeigen, gibt es nur eine Referenz, 'JNI Global reference'.

Was bedeutet das? Warum hängt es an jeder Instanz des Frames?

Antwort

8

Wikipedia hat einen guten Überblick über Java Native Interface, im Wesentlichen ermöglicht es die Kommunikation zwischen Java und nativen Betriebssystembibliotheken geschrieben in anderen Sprachen.

JNI-globale Referenzen sind anfällig für Speicherlecks, da sie nicht automatisch mit Garbage Collection gesammelt werden und der Programmierer sie explizit freigeben muss. Wenn Sie keinen JNI-Code selbst schreiben, ist es möglich, dass die von Ihnen verwendete Bibliothek ein Speicherleck aufweist.

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

+2

Wikipedia ist eine sekundäre Quelle. Die primäre Quelle und das offizielle Dokument sind die [JNI-Spezifikation] (http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html). – EJP

12

Ein JNI globale Referenz ist eine Referenz von „native“ Code zu einem Java-Objekt, das vom Java-Garbage-Collector verwaltet wird. Sein Zweck besteht darin, das Sammeln eines Objekts zu verhindern, das noch von nativem Code verwendet wird, aber keine Live-Referenzen im Java-Code zu haben scheint.

Ein JFrame ist ein java.awt.Window und ist einem "nativen" Window-Objekt zugeordnet. Wenn Sie mit einer bestimmten JFrame-Instanz vollständig fertig sind, sollten Sie die Methode dispose() zum Bereinigen aufrufen.

Ich bin nicht sicher, ob ein systemeigener Code einen globalen Verweis auf den JFrame erstellt, aber es scheint wahrscheinlich. Wenn dies der Fall ist, verhindert dies, dass der JFrame als Müll gesammelt wird. Wenn Sie viele Windows (oder Unterklassen) erstellen und feststellen, dass sie nie erfasst werden, stellen Sie sicher, dass sie entsorgt werden.

+0

Wenn der Code nur Java ist, ist dies die wahrscheinlichste Erklärung. Ich hatte Probleme mit globalen Zeigern, aber ich habe mit JNI gearbeitet. –

7

Ich hatte dieses genaue Problem, wenn Speicherverluste in einer JavaFX-Anwendung behoben werden. Am Ende stellte sich das Problem heraus, dass ich die Anwendung in Debug-Modus ausgeführt und mehrere Haltepunkte im Code hatte. Dies scheint dazu geführt zu haben, dass Objekte "JNI Global reference" sind und ohne ersichtlichen Grund in Erinnerung bleiben. Als ich den Debug-Modus ausschaltete, funktionierte alles wie es sollte!

+0

Mist, genau das ist mir gerade passiert! – Trejkaz

+0

Ein mehr hier .. haha – BrunoJCM