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

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

内容的提问来源于stack exchange,提问作者Stone
相关产品推荐
相关产品推荐

