4 Stimmen

Wie bringe ich AppContext dazu, AWT-Komponenten freizugeben, damit sie garbage collected werden können?

Mein Team arbeitet daran, unsere Swing-Anwendung zu analysieren, um sicherzustellen, dass alles in den Müll geworfen wird, wenn es nicht mehr verwendet wird. Dabei stoßen wir auf ein merkwürdiges Problem.

Wir öffnen einfach ein neues Fenster ( JFrame ) und schließt sie. Dieser Rahmen enthält eine EmptyPanel Klasse (die eine kurze Nachricht enthält, dass keine Daten vorhanden sind) und eine benutzerdefinierte JMeunBar Klasse. Wir interagieren überhaupt nicht damit - wir schließen das Fenster einfach sofort.

Dann erzwingen wir eine Garbage Collection und machen einen Heap Dump.

Bei der Analyse der Haldenablage wurde die JMenuBar wird nicht in den Müll geworfen. Es wird von der GC Root offen gehalten sun.awt.AppContext .

Wie können wir das bereinigen? Oder ist das etwas, worüber wir uns aus irgendeinem Grund keine Sorgen machen müssen? Wir wollen sorgfältig darauf achten, dass unsere Anwendung hinter sich aufräumt, aber wir wollen uns auch nicht verzetteln.

AppContext.mainAppContext enthält eine HashMap, die eine BasicPopupMenuUI.MenuKeyboardHelper Beispiel. Innerhalb dieser Instanz befindet sich eine ComponentInputMapUIResource.menuInputMap die folgendes enthält JMenuBar als eine Komponente.

4voto

trashgod Punkte 199887

Wie erörtert aquí gibt es eine Reihe von Systemressourcen, die im normalen Verlauf des JVM-Betriebs explizit freigegeben werden müssen. Der Grafikkontext der dispose() Methode ist ein Beispiel dafür; die übergeordnete dispose() Methode ist eine andere. In beiden Fällen kann die Ressource korrekt freigegeben werden, aber Sie können den Heap beobachten, bevor er abgeschlossen ist.

Es ist schwer zu verallgemeinern, was sicher ignoriert werden kann, aber ein empirischer Ansatz besteht darin, das Ziel in einem Profiler zu testen. Die ersten beiden Diagramme in diesem Vergleich zeigen einen kleinen, aber stetigen Anstieg des Speicherverbrauchs einer bestimmten Methode, die im Verdacht steht, Ressourcen zu binden. Im Gegensatz dazu zeigt das dritte Diagramm eine gleichmäßige Speichernutzung mit periodischen Spitzen bei der Garbage Collection-Aktivität. Nachfolgend sehen Sie das typische Sägezahnmuster eines visuell "geschäftigen" Programms wie diesem Spiel . Beachten Sie, dass jeder Zyklus zur Grundlinie zurückkehrt.

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X