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.