gpt4 book ai didi

java - 从 VisualVM 理解堆图

转载 作者:行者123 更新时间:2023-12-02 02:45:30 26 4
gpt4 key购买 nike

我有一个程序,它基本上从磁盘读取许多文件(混合 PDF 通常低于 10 MB + XML 大小 Kb),并将它们一次上传到旧系统中。周末时我让它在 VisualVM 下运行,今天早上我回来看到一张图表,显示在程序运行的时间内堆使用情况相当不均匀。我预计随着时间的推移,堆使用量会大致保持在一定水平。

heap graph from visualvm showing an uneven heap pressure over time

我正在寻找对此的解释。这是 Ubuntu 17.04(桌面,不是服务器)下的 64 位 Oracle JVM,4 核 i5-2400(无超线程)上的 32 GB RAM。该程序本质上是单线程,占用了大约 50% 的内核,并花费了预期的运行时间。

我知道如果内存没有被充分使用,它会随着时间的推移而被释放。我不明白使用率会随着时间的推移而下降,因为负载应该相当均匀地分布。当系统处于空闲状态时,我是否看到了 CPU 限制的结果?是否开始进行一些 JVM 优化?

最佳答案

实际的 GC 日志会更有帮助,但这可能只是 GC 启发式调整有关新旧堆大小的决策,以满足吞吐量和暂停时间目标。

只要不对 JVM 设置限制,它就会很乐意使用比最低限度更多的内存来保持程序运行。如果不这样做,您将会遇到非常频繁且低效的 GC。换句话说,堆大小 = n * Activity 对象集大小,其中 n> 1。根据所使用的收集器,除了可用内存之外,n 可能没有上限,因为ParallelGC 默认 MaxHeapFreeRatio 为 100,而 G1 使用 70。

启发式方法远非完美,它们可能会在某些边缘情况下将自己陷入困境,或者在不同的平衡点之间不必要地波动。但图表本身并没有表明有问题。

关于java - 从 VisualVM 理解堆图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44626334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com