回答
通常情況下,當你完成它們時,你不需要處理對象(儘管將對它們的引用設置爲null可能會使它們更快地被GCed)。但是,AWT和Swing對象會分配一些需要釋放的本地資源。此外,AWT線程將窗口視爲頂級對象,阻止它們被垃圾收集並終止JVM。
因此,當你完成了你的窗口,你需要處理它,這釋放了它分配的本地資源。一種方法是調用Window.dispose()。但是,更好的選擇是在初始化每個根窗口時調用JFrame.setDefaultCloseOperation()。如果您通過DISPOSE_ON_CLOSE它將會在用戶關閉窗口時處理自身。當最後一個這樣的窗口關閉時,AWT線程將停止阻塞並允許JVM關閉(假設你沒有任何其他異常線程在運行)。或者,您可以傳遞它EXIT_ON_CLOSE,這會導致您的窗口調用System.exit(),它告訴JVM您的應用程序已完成並正常終止。
如果沒有對它們的引用,則會自動收集垃圾對象。您不必像處理外部資源一樣對待Swing組件。然而,如果你有一個你以後不需要的組件,你可以將該組件的任何引用設置爲null。
JPanel p = new JPanel();
p = null;
設置p來空不刪除對象,但它消除了,因此下一次垃圾收集器通過它就會拿起對象的任何引用。
雖然對組件的其他引用不存在,但您必須小心。
有一次,它被告知,你必須斷開所有的監聽器,否則它們將作爲Swing組件的引用。但我被告知這不再是一個問題。
這取決於。如果您的組件在與您註冊偵聽器的組件同時死亡或始終死亡,則不需要任何特殊操作,不可訪問的引用循環會自動進行GC'd。但是,如果您的組件可能被關閉/丟棄,並且組件或服務仍然活着,那麼您的監聽器將成爲內存泄漏,並且可能會阻止視圖,模型以及其他任何由活動引用保持活動狀態的對象的GC那個聽衆。將聽衆註冊到比您自己的使用壽命更長的服務或組件非常重要。 – 2016-08-09 20:28:16
Windows(包括對話框和框架)應該被丟棄。如果你創建(AWT)Graphics
對象,那麼它們也應該被處置掉(但通常在本地內,例如,paintComponent
方法)。
如果您有偵聽者從長壽命的源更新短期目標,那麼您應該在丟棄目標之前將其移除。聽衆使用WeakReference
到目標,這樣它可以在參考消失(並且發生事件)時取消註冊。
- 1. 垃圾收集:需要更多解釋
- 2. 評估之前應該對垃圾收集功能進行垃圾收集嗎?
- 3. -verbose垃圾收集解釋
- 4. 垃圾收集
- 5. Android的RAM釋放/垃圾收集
- 6. 這會收集垃圾嗎?
- 7. 垃圾收集 - 是否需要?
- 8. 垃圾收集java
- 9. DoctrineCommonCache垃圾收集?
- 10. Java垃圾收集
- 11. 垃圾收集器
- 12. C#垃圾收集
- 13. Java垃圾收集
- 14. WeakEvent垃圾收集
- 15. GWT垃圾收集
- 16. 當垃圾收集垃圾時,Haskell是否放棄了火花?
- 17. Swing Timer不會垃圾收集
- 18. Java Swing JTree不是垃圾收集
- 19. 垃圾收集事件
- 20. 垃圾收集YGCT和垃圾收集時間不斷上升
- 21. 使用垃圾收集時,我需要保留屬性嗎?
- 22. 在ColdFusion CFC收集垃圾
- 23. 垃圾收集在CGO
- 24. 組件不會被垃圾收集
- 25. 垃圾收集器只需要在堆中工作嗎?
- 26. 代表不要讓垃圾回收
- 27. 垃圾收集是由
- 28. 垃圾收集提交git
- 29. 從垃圾收集日誌
- 30. 垃圾收集緩存WeakMaps
p = null很少需要。見http://stackoverflow.com/questions/271530/cross-references-and-garbage-collection – VonC 2008-11-26 13:33:22
但擺動組件使用外部資源(例如窗口句柄我猜),他們呢? – 2008-11-26 14:07:58