为什么Java垃圾收集器在执行不太激进的操作后不久会出现激进的运行?

Gor*_*ley 8 java garbage-collection visualvm

在使用VisualVM监视java程序时,我注意到垃圾收集器的行为中有一个有趣的模式.看起来很常见,在执行"正常"垃圾收集运行之后,GC会执行第二次,更多的cpu密集运行,这似乎没有额外的影响(更积极的运行之后使用的堆与它是在打火机之后).

我已经在VisualVM的输出上指出了你可以看到垃圾收集器运行和相应的堆使用变化.

有趣的垃圾收集器行为

我的问题基本上是垃圾收集器在这里做什么以及为什么?当有足够的可用内存时,是什么导致它尝试这些真正的cpu密集型运行,并且与较轻的运行相比没有可观察到的好处?或者我是否误解了图表?

该计划的表现并没有真正受到影响,我只是好奇.

Ale*_*leš 2

查看图表对于了解 GC 运行情况是一件好事,但如果您想研究 GC 在特定时刻运行的原因,则需要深入研究 GC 日志

启用完整的GC日志记录,并开始收集jstat。重点关注您看到意外 GC 周期的那些时间,并在日志中追溯它们。你在那里看到什么?尝试看看:

  • 是 Full GC 还是 Minor GC?
  • eden、perm、oldGen、survivor 空间等的占用是什么?
  • 这些时间间隔内的分配率、实时数据集大小、升级率是多少?
  • ETC。

回答这些问题可能会让您陷入 GC 运行原因的问题。

更新:您可以找到有关如何调整 GC 的技术详细信息,例如:是否有针对 GC 问题的食谱指南?