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

2024-02-15

当我跑步时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标志,其行为与GC.heap_dump:

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

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

我尝试在几个环境中运行此命令,但未调用完整 GC。然而,自从它“取决于 Java 堆大小和内容”我不能确定。

So can jcmd PID GC.class_histogram在某些情况下调用完整GC?如果有,它们是什么?


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

然而,随着-all选项将不会有 Full GCGC.class_histogram,完全就像GC.heap_dump。找到证明热点来源 http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/ff3b27e6bcc2/src/share/vm/services/diagnosticCommand.cpp#l385:

void ClassHistogramDCmd::execute(DCmdSource source, TRAPS) {
  VM_GC_HeapInspection heapop(output(),
                              !_all.value() /* request full gc if false */);
  VMThread::execute(&heapop);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐