如何确定 Java 应用程序的年轻 gc 的原因

How to determine the cause of young gc of a Java application

最近我发现它在我的 java 应用程序中有一个频繁的年轻 gc。由于我有一个 1600M 的新生代,而且它每 10 秒进行一次新生代 gc,我认为是有太多不必要的对象导致了这些 gcs。

我知道我可以使用 jmap 进行 heapdump 以找出导致 full gc 的原因。但是我怎样才能找出年轻一代中的内容(因为堆转储应该清理年轻一代并且年轻一代一直在变化)

还有一个问题:jstat -gcutil 会增加 gc 频率吗?

选项 1 - SJK's hh command 它正在使用 jmap underhood。如果你 运行 它与 --dead-young 它将执行以下操作。

  • 执行完全 GC
  • 等待 10 秒(产生新鲜垃圾)
  • 在没有 GC 的情况下获取堆直方图
  • 立即执行 GC 并获取直方图(如 jmap --live)
  • 比较两个直方图和 return 差异 - 在最后 10 秒内创建并被收集的对象。

选项 2 - Java Mission Control 它是 Java 8 JDK 的一部分。它可以对 TLAB 分配失败时的对象分配进行采样。虽然不完全准确,但在实践中非常适合检测垃圾点。

jstat -gc不执行GC,它是通过内存映射文件使用信息。 JVM 将一些指标转储到该文件并 jstat 对其进行轮询。