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

时间:2013-04-01 21:19:01

标签: java garbage-collection visualvm

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

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

interesting garbage collector behaviour

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

该计划的表现并未受到影响,我只是好奇。

1 个答案:

答案 0 :(得分:2)

查看图表是一个很好的事情来概述GC运行,但如果你想研究GC在特定时刻运行的原因,你需要深入研究GC日志

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

  • 是完整还是次要GC?
  • 什么是伊甸园,烫发,老人,幸存者空间等的职业?
  • 这些时间间隔内的分配率,实时数据集大小,促销率是多少?

回答这些问题可能会导致GC运行原因的问题。

更新:您可以找到有关如何调整GC的技术细节,例如在:Is there a cookbook guide for GC problems?