我们如何使用 VisualVM 或任何其他工具知道我的 Java 程序中当前正在执行哪种类型的 GC(young/full)?

How do we know which type of GC(young/full) is currently being executed in my Java Program using VisualVM or any other tool?

我正在使用 VisualVM 工具对程序进行性能分析。我能够检查程序的 CPU 使用情况和堆使用情况,但无法确定当前正在执行哪种类型的 GC(年轻 GC/full GC)。无论如何可以使用 VisualVM 找到它,或者有任何其他工具吗?

我不是 VisualVM 专家,所以我不知道如何使用。但我可以为您提供几个替代方案

JSTAT

你可以使用jstat

查看正在执行哪种gc

首先我们需要发现您的 Java 运行 进程的 PID。为此,我们可以使用 jps。在此示例中,运行 Eclipse IDE.

jps
10156 org.eclipse.equinox.launcher_1.5.700.v20200207-2156.jar

现在使用下面的命令jstat -gc 10156 1s

1s指的是采样间隔。您可以使用适合您需要的任何一种。

这个命令输出一个table,有很多列,我发现很难格式化(抱歉),所以请关注这两个

  • YGC:新生代垃圾回收 (GC) 事件的数量。
  • FGC:完整 GC 事件的数量。

观察这两个计数器可以让您大致了解正在执行的收集类型。

JVM 标志

此外,您可以使用 JVM 标志

  • -Xlog:gc* 对于 java 11
  • -XX:+PrintGCDetails 对于 java 8

这将在控制台打印所有 GC 详细信息:内存占用 before/after 每个收集、花费的时间、人体工程学...

这个标志的输出有点难以理解,因为它取决于您的 JVM 实现、选择的 GC、JVM 标志...