2015-10-28 54 views
0

我有一個可觀的Java應用程序,可以創建描述圖形的複雜數據結構,從原始時間戳數據點開始並顯示繪圖,分析它等。試圖找到我的java swing代碼中的內存泄漏

當我嘗試處理一系列這些繪圖時,我清楚地以JScrollPane的形式掛在內存上,用於保存繪圖,但我無法弄清楚原因。保存滾動窗格的變量會被重新分配,每個新文件都會被加載,但是我注意到RepaintManager正在維護其invalidComponents列表中先前顯示的窗格的列表。這看起來好像掛在每個圖形的存儲器上,不久我就有1GB的內存在使用,當我連續處理文件時,應該永遠不會有超過一個圖形的內存使用。

我得到了內存轉儲,並用Eclipse內存分析器和YourKit進行了分析。

這就是我認爲的鐵證Eclipse的內存分析器顯示:

enter image description here

花了相當長的一段試圖深入到這個問題。我非常感謝任何關於我的錯誤可能在哪裏或如何解決問題的建議。

我意識到如果不能深入研究代碼就很難分辨,但如果有關於在哪裏尋找的一般建議/注意事項,那就太好了。

+2

考慮提供一個[runnable示例](https://stackoverflow.com/help/mcve),它演示了您的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的混淆和更好的響應 – MadProgrammer

+1

您是否刪除舊的滾動條?可能不是創建新的,而應該簡單地重用現有的並改變viewportView組件 – MadProgrammer

回答

2

由於@MadProgrammer suggests,你現在大概的代碼替換現有JScrollPane實例:

scrollPane = new JScrollPane(view); 

相反,通過setViewportView()更新的視域組件:

scrollPane. setViewportView(view); 

更妙的是,更新的view內容直。細節取決於你的實現,但validate()repaint()代表一種方法。