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

marklau99 pushed a commit to branch fix-compaction-tmp-error
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/fix-compaction-tmp-error by 
this push:
     new 238e9873aa8 optimize jvm thread metrics
238e9873aa8 is described below

commit 238e9873aa89b8065015eff6fac158615bb426a7
Author: Liu Xuxin <[email protected]>
AuthorDate: Fri Apr 28 16:55:38 2023 +0800

    optimize jvm thread metrics
---
 .../metrics/metricsets/jvm/JvmThreadMetrics.java   | 30 +++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/jvm/JvmThreadMetrics.java
 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/jvm/JvmThreadMetrics.java
index 5c4731de384..193cab6bd86 100644
--- 
a/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/jvm/JvmThreadMetrics.java
+++ 
b/metrics/interface/src/main/java/org/apache/iotdb/metrics/metricsets/jvm/JvmThreadMetrics.java
@@ -25,11 +25,19 @@ import org.apache.iotdb.metrics.utils.MetricLevel;
 import org.apache.iotdb.metrics.utils.MetricType;
 
 import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
 import java.lang.management.ThreadMXBean;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /** This file is modified from 
io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics */
 public class JvmThreadMetrics implements IMetricSet {
+  private static long lastUpdateTime = 0L;
+  private static final long UPDATE_INTERVAL = 10_000L;
+  private static Map<Thread.State, Integer> threadStateCountMap = new 
HashMap<>();
+
   @Override
   public void bindTo(AbstractMetricService metricService) {
     ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
@@ -85,9 +93,25 @@ public class JvmThreadMetrics implements IMetricSet {
 
   // VisibleForTesting
   static long getThreadStateCount(ThreadMXBean threadBean, Thread.State state) 
{
-    return 
Arrays.stream(threadBean.getThreadInfo(threadBean.getAllThreadIds()))
-        .filter(threadInfo -> threadInfo != null && 
threadInfo.getThreadState() == state)
-        .count();
+    checkAndUpdate(threadBean);
+    return threadStateCountMap.getOrDefault(state, 0);
+  }
+
+  private static void checkAndUpdate(ThreadMXBean threadBean) {
+    if (System.currentTimeMillis() - lastUpdateTime < UPDATE_INTERVAL) {
+      return;
+    }
+    lastUpdateTime = System.currentTimeMillis();
+    threadStateCountMap.clear();
+    List<ThreadInfo> infoList =
+        Arrays.asList(threadBean.getThreadInfo(threadBean.getAllThreadIds()));
+    infoList.forEach(
+        info -> {
+          if (info != null) {
+            Thread.State state = info.getThreadState();
+            threadStateCountMap.put(state, 
threadStateCountMap.getOrDefault(state, 0) + 1);
+          }
+        });
   }
 
   private static String getStateTagValue(Thread.State state) {

Reply via email to