ThreadMXBean 操作会导致 JVM STW 吗?定期调用 findDeadlockedThreads 是否有意义?

问题描述 投票:0回答:0

我想知道我是否在 JVM 中定期调用

findDeadlockedThreads
,由于 JVM STW(世界停止),在 pos <1> 或 <2> 处存在性能问题?

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.
    }
}

我检查了一些帖子,例如哪种方法在 java 中生成线程转储最不突兀?。看起来“来自 JVM 内部的 JMX”是一项繁重的操作。

所以我的问题是:

  1. “findDeadlockedThreads”或“getThreadInfo”等ThreadMXBean操作会导致JVM STW吗?
  2. 如果我在运行业务的普通Java进程中定期调用ThreadMXBean“findDeadlockedThreads”或“getThreadInfo”是否有意义?

更新:

我针对问题1做了一个demo,发现“findDeadlockedThreads”导致STW而“getStackTrace”没有。我添加了 jvm 选项“-XX:+PrintGCApplicationStoppedTime”来验证 STW 事件并安排了一个时间任务来调用“findDeadlockedThreads”和“getStackTrace”。有意义吗?

findDeadlockedThreads 演示:

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());
                    }
                }
            }
        }
    }

getStackTrace 演示:

    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 + "\n");
            }
        }
    }

java jvm javaagents
© www.soinside.com 2019 - 2024. All rights reserved.