执行jcmd GC.class_stats时会导致STW吗?
Can cause STW when execute jcmd GC.class_stats?
我要在我的 tomcat 进程上执行 jcmd $PID GC.class_stats -csv=true
命令,以加载 class 状态。
我担心命令对 tomcat 进程的影响,比如创建堆转储。
执行命令时会导致世界停止或其他效果吗?
我找不到它。
谢谢。
是的,GC.class_stats
是一个高开销诊断命令,它运行在全局安全点(STW 暂停)。除其他事项外,此操作遍历整个堆以计算所有已加载 类.
的所有实例消耗的内存
此外,该操作会导致Full GC。见 the source code:
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
还警告该命令对虚拟机影响很大:
GC.class_stats
Provide statistics about Java class meta data.
Impact: High: Depends on Java heap size and content.
顺便说一下,GC.class_stats
has been removed 在 JDK 15.
我要在我的 tomcat 进程上执行 jcmd $PID GC.class_stats -csv=true
命令,以加载 class 状态。
我担心命令对 tomcat 进程的影响,比如创建堆转储。
执行命令时会导致世界停止或其他效果吗?
我找不到它。
谢谢。
是的,GC.class_stats
是一个高开销诊断命令,它运行在全局安全点(STW 暂停)。除其他事项外,此操作遍历整个堆以计算所有已加载 类.
此外,该操作会导致Full GC。见 the source code:
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
还警告该命令对虚拟机影响很大:
GC.class_stats
Provide statistics about Java class meta data.
Impact: High: Depends on Java heap size and content.
顺便说一下,GC.class_stats
has been removed 在 JDK 15.