在使用VisualVM监视java程序时,我注意到垃圾收集器的行为中有一个有趣的模式。看起来很常见,在执行“正常”垃圾收集运行之后,GC执行第二次,更多cpu密集运行,这似乎没有额外的影响(更积极的运行后使用的堆与它是在打火机之后)。
我已经在VisualVM的输出上指出了你可以看到垃圾收集器运行和相应的堆使用变化。
我的问题基本上是垃圾收集器在这里做什么以及为什么?当有足够的可用内存时,是什么导致它尝试这些真正的cpu密集型运行,并且与较轻的运行相比没有可观察到的好处?还是我误解了图表?
该计划的表现并未受到影响,我只是好奇。
答案 0 :(得分:2)
查看图表是一个很好的事情来概述GC运行,但如果你想研究GC在特定时刻运行的原因,你需要深入研究GC日志。
启用完整的GC日志记录,也开始收集jstat。关注那些您看到意外GC循环并在日志中追溯它们的时间。你在那看到什么?试着看看:
回答这些问题可能会导致GC运行原因的问题。
更新:您可以找到有关如何调整GC的技术细节,例如在:Is there a cookbook guide for GC problems?