Mar*_*ark 0 java performance memory-management visualvm javafx-8
我正在使用VisualVM来分析一个javafx 8应用程序,该应用程序执行一些绘图并使用比我想要的更多的内存.它似乎没有泄漏,但由于某种原因,我的总堆永远不会减少,即使我使用的堆上升和下降,因为我选择不同的文件来图形.所有的峰值都是当我绘制一个新文件然后在我退出该屏幕时退回时,但总堆刚刚开始并保持不变.这是正常的吗?
是的,这是正常的.JVM从操作系统分配更多的堆内存,但不会将其返回,但实际使用情况可能会有所不同,即堆的当前未使用部分可能会发生变化.
一个原因是从OS分配内存有些昂贵,并且一旦写入数据实际上可能会碎片化.垃圾收集可能会释放内存块,因此使用的大小会减少,但仍然使用的块可能会遍布整个堆内存.
我不确定JVM实际上是如何处理的(实际上不同的JVM可能会以不同的方式处理)但你可能会查找在这种情况下使用的免费列表,伙伴系统等.
有人可能会争辩说,JVM可以在垃圾收集后对内存进行"碎片整理",然后释放多余的堆内存,但这会造成很大的性能损失,特别是如果需要在RAM甚至虚拟/交换内存中移动大量数据.与许多计算问题一样,它是空间和CPU使用之间的权衡.
归档时间: |
|
查看次数: |
1676 次 |
最近记录: |