2015-10-28 37 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()代表一种方法。