我有一个相当大的 Java 应用程序,它创建描述绘图的复杂数据结构,从原始时间戳数据点开始,显示绘图、分析绘图等。
当我尝试处理一系列这些绘图时,我显然以用于保存绘图的 JScrollPane 形式保留在内存中,但我不明白为什么。保存滚动 Pane 的变量会在加载每个新文件时重新分配,但我注意到 swing RepaintManager 正在其 invalidComponents 列表中维护先前显示的 Pane 的列表。这似乎会占用每张绘图的存储空间,不久之后,当我连续处理文件时,我就会使用 1GB 内存,因此永远不会使用超过一张绘图的内存。
我得到了内存转储,并使用 Eclipse 内存分析器和 YourKit 进行了分析。
这是我认为 Eclipse 内存分析器显示的确凿证据:
花了相当长的时间试图深入研究这个问题。对于任何有关我的错误可能出在哪里或如何解决该问题的建议,我将不胜感激。
我意识到如果不深入研究代码就很难判断,但如果有任何关于在哪里查看的一般建议/注意事项,那就太好了。
最佳答案
作为@MadProgrammer suggests ,您当前的代码可能会替换现有的 JScrollPane
实例:
scrollPane = new JScrollPane(view);
相反,通过 setViewportView()
更新视口(viewport)组件:
scrollPane. setViewportView(view);
更好的是,直接更新view
的内容。详细信息取决于您的实现,但 validate()
和 repaint()
代表了一种方法。
关于java - 尝试在我的 java swing 代码中查找内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33403139/