8

在使用 VisualVM 监视 java 程序时,我注意到垃圾收集器的行为中有一个有趣的模式。似乎很多时候,在执行“正常”垃圾收集运行之后,GC 会执行第二次、更密集的 CPU 运行,这似乎没有额外的影响(在更激进的运行之后使用的堆与这是在较轻的运行之后)。

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

有趣的垃圾收集器行为

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

程序的性能并没有真正受到影响,我只是好奇。

4

1 回答 1

2

查看图表是了解 GC 运行概览的好方法,但如果您想研究 GC 在特定时刻运行的原因,则需要深入挖掘 GC 日志

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

  • 是 Full GC 还是 Minor GC?
  • eden、perm、oldGen、幸存者空间等的职业是什么?
  • 这些间隔内的分配率、实时数据集大小、提升率是多少?
  • 等等

回答这些问题可能会导致您遇到 GC 为何运行的问题。

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

于 2013-04-01T22:21:41.093 回答