我在我們的應用程序中發現的一個內存泄漏是java.awt.Window.allWindows
私有靜態字段,它跟蹤實例化的每個窗口。我們有創建,使用和遺忘的對話框,期望這些對話框會消失並被垃圾收集。這個私人領域將無限期地保持在範圍內,直到他們調用dispose()
方法。而根據定義,當他們超出範圍時,我們不能這樣做。爲什麼你必須處理()一個java.awt.Window超出範圍?
我不明白爲什麼這是這樣設計的。這似乎違背了垃圾回收的精神,當我完成一個Window對象時,必須明確讓系統知道。很明顯,我已經完成了它,因爲它超出了範圍。
我明白dispose()
方法在做什麼:擺脫系統對等對象。我明白,這是在Java之外,你需要一些方法來做到這一點,Swing不應該失去對這些對象的追蹤,否則它會有內存泄漏。但是,當我永遠不會再使用它時,通過永久保留對我的Window的引用可以實現什麼?
有人可以解釋爲什麼這是必要的嗎?
當調用removeNotify時,窗口將從allWindows中移除。 '窗口'包含本地資源,因此應該像處理數據庫連接一樣以相同的方式處理。 – 2009-09-11 00:53:05
我的印象是,當我的數據庫連接超出範圍時,它們會自動關閉。我可能是錯的。 :)但現在,除了短程序之外,所有這些都是由服務器管理的。 – skiphoppy 2009-09-11 20:07:51