gpt4 book ai didi

java - 为什么 JTable 滚动占用这么多内存?

转载 作者:太空宇宙 更新时间:2023-11-04 08:25:13 26 4
gpt4 key购买 nike

您好,我正在用 java 编写双面板文件管理器,我遇到了一个问题。

每当我滚动 JTable 时,它都会多占用大约 8M 内存...有办法解决这个问题吗?每次消耗40-60M内存后就会停止。这是 Swing 组件问题吗?

感谢您的回复。

编辑

我试图理解为什么它需要这么多内存。现在我知道问题的根源了。我用这个 Action 制作了一个小按钮:jScrollPane1.repaint();

当我点击它 10 次时,任务管理器和 VisualVM 中的内存消耗都很大。但在 VisualVM 中,GC 开始收集 50 MB 并将其降低到 8 Mb。但Windows任务管理器的值(value)仍在不断增加。

重绘方法在 Windows 中造成大量内存泄漏。有什么解决办法吗?

编辑2

对这个问题的进一步研究给了我这个。我尝试在Linux平台上运行这个程序,没有泄漏。该程序使用了大约 20 M 内存。所以我编写了一个小线程,它在两个 JScrollPanes 上调用方法重绘。令我惊讶的是,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的兼容性?正如trashgod所说,任务管理器在获取内存消耗方面并不精确,但内存确实被java进程使用了​​。

最佳答案

调用FileSystemView.getFileSystemView()重复可能是一个问题,如建议的here和异形here 。编辑您的问题以包含 sscce 可能会有所帮助。这说明了问题所在。使用分析器可能会提示问题的范围和严重性; Java VisualVM可能已经安装。

Windows task manager is still increasing its value.

Windows 任务管理器可能并不完全具有决定性,如建议的 here 。在这种情况下,jvisualvm 结果可能更可靠。

关于java - 为什么 JTable 滚动占用这么多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com