我正在使用 VisualVM 来分析 javafx 8 应用程序,该应用程序执行一些绘图操作,并且使用的内存比我想要的多得多。它似乎没有泄漏,但由于某种原因,我的总堆永远不会减少,即使当我选择不同的文件来绘制图表时,我使用的堆会上下波动。所有的峰值都是在我绘制一个新文件时出现的,然后在我退出该屏幕时回落的,但总堆只是猛增并保持不变。这正常吗?
是的,这很正常。 JVM 从操作系统分配更多堆内存并且不会将其返还,但实际使用情况可能会有所不同,即堆中当前未使用的部分可能会发生变化。
一个原因是从操作系统分配内存成本较高,而且数据一旦写入实际上可能会碎片化。垃圾收集可能会释放内存块,因此已使用的大小会减少,但仍然使用的块可能会分布在整个堆内存中。
我不确定 JVM 实际上如何详细处理该问题(事实上,不同的 JVM 可能会以不同的方式处理该问题),但您可能会查找在这种情况下使用的空闲列表、伙伴系统等。
有人可能会争辩说,JVM 可以在垃圾收集后对内存进行“碎片整理”,然后释放多余的堆内存,但这会对性能造成相当大的影响,特别是当大量数据必须在 RAM 甚至虚拟/交换内存中移动时。与许多计算问题一样,这是空间和 CPU 使用率之间的权衡。
如何阻止这个问题,因为我将其部署为 kubernetes pod,堆大小占用了 pod 的利用率,正如我使用 kubectl get pods 看到的那样。