diff --git a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmService.java b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmService.java index a46443925de03c..01184cd3cd3ade 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmService.java +++ b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmService.java @@ -38,11 +38,8 @@ public class JvmService { private final JvmInfo jvmInfo; - private JvmStats jvmStats; - public JvmService() { this.jvmInfo = JvmInfo.jvmInfo(); - this.jvmStats = JvmStats.jvmStats(); } public JvmInfo info() { @@ -50,8 +47,7 @@ public JvmInfo info() { } public synchronized JvmStats stats() { - jvmStats = JvmStats.jvmStats(); - return jvmStats; + return JvmStats.jvmStats(); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java index d3c16bb6c58087..fba1aa489d69a5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java +++ b/fe/fe-core/src/main/java/org/apache/doris/monitor/jvm/JvmStats.java @@ -17,9 +17,13 @@ package org.apache.doris.monitor.jvm; +import org.apache.doris.common.util.JdkUtils; import org.apache.doris.monitor.unit.ByteSizeValue; import org.apache.doris.monitor.unit.TimeValue; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import java.lang.management.BufferPoolMXBean; import java.lang.management.ClassLoadingMXBean; import java.lang.management.GarbageCollectorMXBean; @@ -30,6 +34,7 @@ import java.lang.management.RuntimeMXBean; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -38,17 +43,35 @@ import java.util.concurrent.TimeUnit; public class JvmStats { - + private static final Logger LOG = LogManager.getLogger(JvmStats.class); private static final RuntimeMXBean runtimeMXBean; private static final MemoryMXBean memoryMXBean; private static final ThreadMXBean threadMXBean; private static final ClassLoadingMXBean classLoadingMXBean; + private static final Method dumpThreadInfos; + static { runtimeMXBean = ManagementFactory.getRuntimeMXBean(); memoryMXBean = ManagementFactory.getMemoryMXBean(); threadMXBean = ManagementFactory.getThreadMXBean(); classLoadingMXBean = ManagementFactory.getClassLoadingMXBean(); + dumpThreadInfos = getDumpThreadInfosMethod(); + } + + private static Method getDumpThreadInfosMethod() { + try { + String javaRuntimeVersionStr = System.getProperty("java.version"); + int javaVersionAsInteger = JdkUtils.getJavaVersionAsInteger(javaRuntimeVersionStr); + if (javaVersionAsInteger >= 10) { + return ThreadMXBean.class.getDeclaredMethod( + "dumpAllThreads", boolean.class, boolean.class, int.class + ); + } + } catch (Throwable t) { + LOG.warn("failed to get jdk version, ignore it", t); + } + return null; } public static JvmStats jvmStats() { @@ -90,8 +113,8 @@ public static JvmStats jvmStats() { int threadsWaiting = 0; int threadsTimedWaiting = 0; int threadsTerminated = 0; - long[] threadIds = threadMXBean.getAllThreadIds(); - for (ThreadInfo threadInfo : threadMXBean.getThreadInfo(threadIds, 0)) { + + for (ThreadInfo threadInfo : getThreadInfos()) { if (threadInfo == null) { continue; // race protection } @@ -252,6 +275,19 @@ static final class Fields { static final String TOTAL_UNLOADED_COUNT = "total_unloaded_count"; } + + private static ThreadInfo[] getThreadInfos() { + if (dumpThreadInfos != null) { + try { + return (ThreadInfo[]) dumpThreadInfos.invoke(threadMXBean, false, false, 0); + } catch (Throwable t) { + return threadMXBean.dumpAllThreads(false, false); + } + } else { + return threadMXBean.dumpAllThreads(false, false); + } + } + public static class GarbageCollectors implements Iterable { private final GarbageCollector[] collectors;