我想知道我是否在 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做了一个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");
}
}
}