了解visualvm的堆图
问题描述:
我有一个程序,它从磁盘上读取许多文件(混合PDF通常低于10 MB + Kb的XML大小),并将它们一次上传到旧版系统中。周末时,我让它在visualvm下运行,今天早上我回到了一个图表,显示在程序运行的小时内,堆的使用情况非常不均匀。我期望随着时间的推移,堆的使用量大致相当。了解visualvm的堆图
我寻找这个解释。这是在Ubuntu 17.04(桌面,非服务器)下的64位Oracle JVM,在4核i5-2400(无超线程)上具有32 GB RAM。该程序基本上是单线程的,利用了核心的大约50%,并花了预期的时间运行。
我明白,如果内存没有完全使用,它会随着时间的推移而被释放。我不明白随着时间的推移,使用量会下降,因为负载应该是相当均匀分布的。我看到系统闲置时CPU节流的结果吗?某些JVM优化是否在踢?
答
实际的GC日志会更有帮助,但可能只是GC启发式方法调整他们关于年轻堆栈大小和老堆大小的决策,以满足吞吐量和暂停时间目标。
只要您不对JVM设置限制,它就会高兴地使用比最低限度更多的内存来保持程序运行。如果没有,你会遇到非常频繁和低效的GC。换句话说,堆大小= n *实际对象集大小与n> 1.根据使用的收集器,除了可用内存以外,n可能没有上限,因为在G1使用70时,ParallelGC默认MaxHeapFreeRatio
到100。
启发式方法远非完美,它们可以将自己绘制在某些边缘情况下的角落,或在不同平衡点之间不必要地波动。但图表本身并不表示有问题。
我不认为这是一个问题。我正试图了解事物的异常情况(以及为什么)能够识别他们何时不再正常。这是使用JVM的所有默认设置。如果它能得到任何有用的信息,我可以在以后运行gc日志记录。你有链接到讨论这些GC启发式的好资源吗? –
[tag:garbage-collection]标签[wiki](https://stackoverflow.com/tags/garbage-collection/info)有链接到一些资源 – the8472