如何分析JVM垃圾回收?

How to Analyze JVM Garbage Collection?

我的任务是分析垃圾收集。我已经配置了用于记录 GC 的服务器,并且统计信息已正确传递。现在我有了 GC 信息,我有一个关于调优的问题。将我的 GC 文件插入分析工具后,我发现没有 Full GC 只有 minor GC。这是个问题吗?
另外,如果您查看以下行...

[PSYoungGen: 454784K->14336K(450688K)] 685884K->258421K(1761408K), 8.6630322 secs] [Times: user=30.25 sys=1.20, real=8.66 secs]

这是否意味着……

454784K->14336K = Usage of Young generation before and after collection 

对我来说,这看起来在收集之前比收集之后有更多年轻的 GC。在这种情况下,我应该创建一个新比率吗?还是我在倒着看这个?

685884K->258421K = Total used heap before and after collection

此外,我在 运行 JMeter 测试后的最长时间是...

[Times: user=30.25 sys=1.20, real=8.66 secs]

我最短的时间是

[Times: user=0.73 sys=0.29, real=0.16 secs]

这是否意味着我需要专注于代码以了解为什么特定任务如此之高?也许是 threading/DB 的问题?

我是否应该尝试让这些数字尽可能接近 454784K->14336K? 我需要 Full GC 吗?

有什么想法吗?

这取决于你的 objective 是什么。您的 GC 时间会因多种因素而异,最重要的是

  • 执行了 Full GC。
  • 年轻一代保留了多少数据。

恕我直言,提高性能的最佳方法是降低分配率。这将使您的代码在 GC 暂停之间更快,减少 GC 暂停的次数,并使您的应用程序更易于调整。我建议尝试使用 Flight Recorder 来监控您的内存分配。