`jcmd PID GC.class_histogram` 会在收集数据之前调用完整的 GC 吗?

Kir*_* S. 3 java performance garbage-collection jvm

当我运行时jcmd PID help GC.heap_dump,帮助明确指出将调用 full GC,除非-all指定了标志:

GC.heap_dump ... 影响:高:取决于 Java 堆大小和内容。除非指定了“-all”选项,否则请求完整 GC。<...>

-all : [可选] 检查所有对象,包括无法访问的对象 (BOOLEAN, false)

如果我运行jcmd PID help GC.class_histogram,帮助并没有说明强制执行完整 GC 的任何内容,但是“影响”仍然被称为“高”,并且该选项仍然有一个-all标志,其行为与 for 完全相同GC.heap_dump

GC.class_histogram ... 影响:高:取决于 Java 堆大小和内容。

-all : [可选] 检查所有对象,包括无法访问的对象 (BOOLEAN, false)

我试图在几个环境中运行这个命令,但没有调用 full GC。但是,由于它“取决于 Java 堆大小和内容”,我无法确定。

那么jcmd PID GC.class_histogram在某些情况下可以调用完整的 GC 吗?如果是,它们是什么?

apa*_*gin 8

jcmd PID GC.class_histogram 默认情况下会导致 Full GC。

如果目标 JVM 是用 启动的-XX:+PrintGC,您将看到一条日志消息,如

// JDK 8:
[Full GC (Heap Inspection Initiated GC)  1397K->331K(126720K), 0.0023298 secs]

// JDK 9:
[15.503s][info   ][gc] GC(0) Pause Full (Heap Inspection Initiated GC) 2M->0M(8M) 8.107ms
Run Code Online (Sandbox Code Playgroud)

但是,使用-alloption 将不会有 Full GC for GC.class_histogram,就像 for 一样GC.heap_dump。在HotSpot 来源中找到证明:

void ClassHistogramDCmd::execute(DCmdSource source, TRAPS) {
  VM_GC_HeapInspection heapop(output(),
                              !_all.value() /* request full gc if false */);
  VMThread::execute(&heapop);
}
Run Code Online (Sandbox Code Playgroud)