【发布时间】:2023-06-02 02:30:02
【问题描述】:
您好,我正在用 java 编程双面板文件管理器,我遇到了一个问题。
每当我滚动JTable 时,它会多占用大约 8M 内存...有没有办法解决这个问题?每次消耗 40 - 60M 内存后它都会停止。是Swing 组件问题吗?
感谢您的回复。
编辑
我试图理解为什么它需要这么多内存。现在我知道问题的根源了。我用这个actionPerformed做了一个小按钮:
jScrollPane1.repaint();。
当我点击它 10 次时,我在任务管理器和 VisualVM 中都消耗了大量内存。但是在 VisualVM 中,GC 开始收集 50 MB 并将其降低到 8 Mb。但是windows taskmanager的价值还在不断增加。
repaint 方法在 windows 中造成很大的内存泄漏。有什么解决办法吗?
编辑2
对这个问题的进一步研究给了我这个。我试图在 Linux 平台上运行这个程序而没有泄漏。该程序使用了大约 20 M 的内存。所以我编写了一个小线程,它在JScrollPanes 上调用repaint 方法。令我惊讶的是,Windows 机器内存一直上升到 110 M,但随后操作系统开始更加努力地推动内存。
主题:
@Override
public void run() {
while (true) {
jScrollPane1.repaint();
jScrollPane2.repaint();
try {
this.sleep(10);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
我正在执行正常的复制/重命名/删除操作,也正在浏览目录而没有内存上升。我注意到内存也减少到 99M。
在监控线程上:
@Override
public void run() {
while (true) {
aLabel.setText("Memory consumption: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
try {
this.sleep(200);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
数字从 8M 到 50M,然后又是 8M。所以垃圾收集成功了。那么真正的问题是windows平台还是JVM的兼容性? 正如垃圾神所建议的那样,任务管理器在获取内存消耗方面并不精确,但内存正在被 java 进程真正使用。
【问题讨论】:
-
是否有可能打开文件/目录而不关闭它们?
-
请问你的 JTable 为什么要...,你能解释一下吗,发一个sscce.org,其他的一切都是黑暗的
-
8K 不算什么。它可能来自必须更新的图形,来自渲染器创建的临时对象,你不应该关心。
-
60-80K?还是别在意。您是否对此进行了分析以了解内存的消耗位置,还是只是假设它是 JTable?
-
垃圾收集器可能会在它认为应该回收这些内存时,这可能意味着一段时间后,或者永远不会,因为有足够的内存可用并且不需要 GC。
标签: java swing components scroll jtable