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 吗?如果是,它们是什么?
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)