1

我将jcmd $PID GC.class_stats -csv=true在我的 tomcat 进程上执行命令,以获取加载的类状态。

我担心命令对 tomcat 进程的影响,比如创建堆转储。

执行命令时会导致停止世界或其他效果吗?

我找不到它。

谢谢。

4

1 回答 1

1

是的,GC.class_stats是一个开销很大的诊断命令,它在全局安全点(STW 暂停)中运行。除其他外,此操作遍历整个堆以计算所有已加载类的所有实例消耗的内存。

此外,该操作会导致 Full GC。查看源代码

void ClassStatsDCmd::execute(DCmdSource source, TRAPS) {
  VM_GC_HeapInspection heapop(output(),
                              true /* request_full_gc */);
  heapop.set_csv_format(_csv.value());
  heapop.set_print_help(_help.value());
  heapop.set_print_class_stats(true);

  ...

  VMThread::execute(&heapop);  <-- VM_GC_HeapInspection runs in a global safepoint
}

jcmd <pid> help GC.class_stats还警告该命令对 VM 有很大影响:

GC.class_stats
Provide statistics about Java class meta data.

Impact: High: Depends on Java heap size and content.

顺便说一句,GC.class_stats 在 JDK 15 中删除。

于 2020-07-15T11:18:02.033 回答