This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 0a6bb54e47d branch-2.1: [opt](metrics) optimize performance of metrics 
endpoint #49380 (#49455)
0a6bb54e47d is described below

commit 0a6bb54e47dbf66e47b61b4ee55c8b3bb6d24910
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Mar 26 11:31:06 2025 +0800

    branch-2.1: [opt](metrics) optimize performance of metrics endpoint #49380 
(#49455)
    
    Cherry-picked from #49380
    
    Co-authored-by: 924060929 <lanhuaj...@selectdb.com>
---
 .../org/apache/doris/monitor/jvm/JvmService.java   |  6 +---
 .../org/apache/doris/monitor/jvm/JvmStats.java     | 42 ++++++++++++++++++++--
 2 files changed, 40 insertions(+), 8 deletions(-)

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 a46443925de..01184cd3cd3 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 class JvmService {
     }
 
     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 d3c16bb6c58..fba1aa489d6 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.MemoryUsage;
 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.List;
 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 class 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 @@ public class JvmStats {
         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<GarbageCollector> {
 
         private final GarbageCollector[] collectors;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to