【问题标题】:Can cause STW when execute jcmd GC.class_stats?执行 jcmd GC.class_stats 时会导致 STW 吗?
【发布时间】:2020-11-04 20:14:16
【问题描述】:

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

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

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

我找不到它。

谢谢。

【问题讨论】:

    标签: java performance monitoring jcmd


    【解决方案1】:

    是的,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 &lt;pid&gt; help GC.class_stats 还警告该命令对虚拟机影响很大:

    GC.class_stats
    Provide statistics about Java class meta data.
    
    Impact: High: Depends on Java heap size and content.
    

    顺便说一句,JDK 15 中的 GC.class_stats has been removed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2012-01-08
      • 2012-09-12
      相关资源
      最近更新 更多