Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,16 @@ public class JvmService {

private final JvmInfo jvmInfo;

private JvmStats jvmStats;

public JvmService() {
this.jvmInfo = JvmInfo.jvmInfo();
this.jvmStats = JvmStats.jvmStats();
}

public JvmInfo info() {
return this.jvmInfo;
}

public synchronized JvmStats stats() {
jvmStats = JvmStats.jvmStats();
return jvmStats;
return JvmStats.jvmStats();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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() {
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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<GarbageCollector> {

private final GarbageCollector[] collectors;
Expand Down
Loading