java - VisualVM 堆大小不遵循已用大小

标签 java performance memory-management javafx-8 visualvm

我正在使用 VisualVM 来分析 javafx 8 应用程序,该应用程序执行一些绘图操作,并且使用的内存比我想要的多得多。它似乎没有泄漏,但由于某种原因,我的总堆永远不会减少,即使当我选择不同的文件来绘制图表时,我使用的堆会上下波动。所有的峰值都是在我绘制一个新文件时出现的,然后在我退出该屏幕时回落的,但总堆只是猛增并保持不变。这正常吗?

enter image description here

最佳答案

是的,这很正常。 JVM 从操作系统分配更多堆内存并且不会将其返还,但实际使用情况可能会有所不同,即堆中当前未使用的部分可能会发生变化。

一个原因是从操作系统分配内存的成本较高,而且数据一旦写入实际上可能会碎片化。垃圾收集可能会释放内存块,因此已使用的大小会减少,但仍然使用的 block 可能会分布在整个堆内存中。

我不确定 JVM 实际上如何详细处理该问题(事实上,不同的 JVM 可能会以不同的方式处理该问题),但您可能会查找在这种情况下使用的空闲列表、伙伴系统等。

有人可能会说,JVM 可以在垃圾收集后对内存进行“碎片整理”,然后释放多余的堆内存,但这会对性能造成相当大的影响,特别是如果大量数据必须在 RAM 甚至虚拟/中移动时交换内存。与许多计算问题一样,这是空间和 CPU 使用率之间的权衡。

关于java - VisualVM 堆大小不遵循已用大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31339999/

相关文章:

java - Spring security 中的 matches 函数如何返回 false?

java - 是否可以反编译和调试 Java 应用程序?

java - 手动执行 CORS

Java - 寻找比 PriorityQueue 更快的东西

c++ - 为什么保留的虚拟内存会增长而当前正在使用的虚拟内存不会增长?

objective-c - *应该*崩溃的简单 Objective-C 过度发布不会崩溃。为什么?

java - Linux native 可执行文件不包含正确的符号信息

Java:System.out.println() 这么慢的原因是什么?

java - Android 上的谷歌地图是非常慢还是我使用它的方式不对?

c - 如何释放前缀树中的内存? (美国标准 C)