You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ThreadMXBean操作是否引发JVM STW?定期调用findDeadlockedThreads是否合理?

关于ThreadMXBean操作与JVM STW的疑问

我想了解在JVM内部定期调用findDeadlockedThreads时,如下代码中标注<1>和<2>的位置是否会因JVM STW(Stop of The World)产生性能问题:

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long[] threadIds = bean.findDeadlockedThreads(); // <1>

if (threadIds != null) {
    ThreadInfo[] infos = bean.getThreadInfo(threadIds); // <2>

    for (ThreadInfo info : infos) {
        StackTraceElement[] stack = info.getStackTrace();
        // Log or store stack trace information.
    }
}

查阅相关资料后,发现JVM内部通过JMX的操作属于高开销操作,因此提出以下问题:

  • ThreadMXBean的findDeadlockedThreads、getThreadInfo等操作是否会引发JVM STW?
  • 在运行业务的常规Java进程中,定期调用ThreadMXBean的findDeadlockedThreads或getThreadInfo是否合理?

更新说明

我针对问题1制作了验证Demo,通过添加JVM参数-XX:+PrintGCApplicationStoppedTime来检测STW事件,并定时调用findDeadlockedThreads和getStackTrace,发现findDeadlockedThreads会引发STW,而getStackTrace不会,请问该验证方式是否合理?

findDeadlockedThreads验证Demo

static class DeadLockCheckTask extends TimerTask {
        @Override
        public void run() {
            ThreadMXBean bean = ManagementFactory.getThreadMXBean();
            long[] threadIds = bean.findDeadlockedThreads(); // <1>
            System.out.println("dead lock checker task running...");
            if (threadIds != null) {
                ThreadInfo[] infos = bean.getThreadInfo(threadIds); // <2>

                for (ThreadInfo info : infos) {
                    StackTraceElement[] stack = info.getStackTrace();
                    // Log or store stack trace information.
                    for(StackTraceElement e : stack) {
                        System.out.println("threadName:" + info.getThreadName() + "-----" + e.toString());
                    }
                }
            }
        }
    }

findDeadlockedThreads验证结果

getStackTrace验证Demo

static class ThreadDumpTask extends TimerTask {

        @Override
        public void run() {
            System.out.println("thread dump task running...");
            for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
                System.out.println(ste);
            }
        }
    }

getStackTrace验证结果


内容的提问来源于stack exchange,提问作者Stone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:05:35