2008-11-26 72 views

回答

5

通常情況下,當你完成它們時,你不需要處理對象(儘管將對它們的引用設置爲null可能會使它們更快地被GCed)。但是,AWT和Swing對象會分配一些需要釋放的本地資源。此外,AWT線程將窗口視爲頂級對象,阻止它們被垃圾收集並終止JVM。

因此,當你完成了你的窗口,你需要處理它,這釋放了它分配的本地資源。一種方法是調用Window.dispose()。但是,更好的選擇是在初始化每個根窗口時調用JFrame.setDefaultCloseOperation()。如果您通過DISPOSE_ON_CLOSE它將會在用戶關閉窗口時處理自身。當最後一個這樣的窗口關閉時,AWT線程將停止阻塞並允許JVM關閉(假設你沒有任何其他異常線程在運行)。或者,您可以傳遞它EXIT_ON_CLOSE,這會導致您的窗口調用System.exit(),它告訴JVM您的應用程序已完成並正常終止。

0

如果沒有對它們的引用,則會自動收集垃圾對象。您不必像處理外部資源一樣對待Swing組件。然而,如果你有一個你以後不需要的組件,你可以將該組件的任何引用設置爲null。

JPanel p = new JPanel(); 
p = null; 

設置p來空不刪除對象,但它消除了,因此下一次垃圾收集器通過它就會拿起對象的任何引用。

雖然對組件的其他引用不存在,但您必須小心。

+0

p = null很少需要。見http://stackoverflow.com/questions/271530/cross-references-and-garbage-collection – VonC 2008-11-26 13:33:22

+0

但擺動組件使用外部資源(例如窗口句柄我猜),他們呢? – 2008-11-26 14:07:58

2

有一次,它被告知,你必須斷開所有的監聽器,否則它們將作爲Swing組件的引用。但我被告知這不再是一個問題。

+1

這取決於。如果您的組件在與您註冊偵聽器的組件同時死亡或始終死亡,則不需要任何特殊操作,不可訪問的引用循環會自動進行GC'd。但是,如果您的組件可能被關閉/丟棄,並且組件或服務仍然活着,那麼您的監聽器將成爲內存泄漏,並且可能會阻止視圖,模型以及其他任何由活動引用保持活動狀態的對象的GC那個聽衆。將聽衆註冊到比您自己的使用壽命更長的服務或組件非常重要。 – 2016-08-09 20:28:16

0

Windows(包括對話框和框架)應該被丟棄。如果你創建(AWT)Graphics對象,那麼它們也應該被處置掉(但通常在本地內,例如,paintComponent方法)。

如果您有偵聽者從長壽命的源更新短期目標,那麼您應該在丟棄目標之前將其移除。聽衆使用WeakReference到目標,這樣它可以在參考消失(並且發生事件)時取消註冊。