我有一个相当大的Java应用程序,它创建描述绘图的复杂数据结构,从原始时间戳数据点开始,显示绘图,分析它等等。
当我尝试处理一系列这些图纸时,我显然以JScrollPane的形式挂在记忆中,用于保存图纸,但我无法弄清楚原因。保存滚动窗格的变量将在加载每个新文件时重新分配,但我注意到,swing RepaintManager正在其invalidComponents列表中维护以前显示的窗格的列表。这似乎是挂在每个绘图的存储上,不久之后,当我正在连续处理文件时,我有1GB的内存在使用,因此应该永远不会有多个绘图的内存使用。
我有一个内存转储,并使用Eclipse内存分析器和YourKit分析。
这就是我认为是Eclipse记忆分析仪所显示的吸烟枪:
花了很长时间试图深入研究这个问题。对于我的错误可能存在的位置或如何解决问题的任何建议,我将非常感激。
我意识到在不能深入研究代码的情况下很难说,但如果有任何关于在哪里寻找的一般性建议/警告,那就太棒了。
答案 0 :(得分:2)
作为@MadProgrammer suggests,您当前的代码可能会替换现有的JScrollPane
实例:
scrollPane = new JScrollPane(view);
而是通过setViewportView()
更新视口组件:
scrollPane. setViewportView(view);
更好的是,直接更新view
的内容。详细信息取决于您的实施,但validate()
和repaint()
代表一种方法。