VisualVM堆大小不遵循使用的大小

时间:2015-07-10 11:47:48

标签: java performance memory-management javafx-8 visualvm

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

enter image description here

1 个答案:

答案 0 :(得分:6)

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

一个原因是从操作系统分配内存有点昂贵,而且一旦编写,数据实际上可能会碎片化。垃圾收集可能会释放大量内存,因此使用的大小会减少,但仍然使用的块可能会遍布整个堆内存。

我不确定JVM实际上是如何处理的(事实上不同的JVM可能会以不同的方式处理)但你可能会查找在这种情况下使用的免费列表,伙伴系统等。

有人可能会说JVM可以"整理碎片"垃圾收集后的内存,然后释放多余的堆内存,但这将是一个性能损失,特别是如果必须在RAM或甚至虚拟/交换内存中移动大量数据。与许多计算问题一样,它是空间和CPU使用之间的权衡。