Skip to content

Instantly share code, notes, and snippets.

@brainbaking
Last active September 4, 2025 13:01
Show Gist options
  • Select an option

  • Save brainbaking/8ee45ad3baf4c42e0884c58aa0a76a33 to your computer and use it in GitHub Desktop.

Select an option

Save brainbaking/8ee45ad3baf4c42e0884c58aa0a76a33 to your computer and use it in GitHub Desktop.
Java mxbean getProcessCpuLoad parallel test
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import static java.util.Objects.requireNonNull;
public class CpuTest {
private static MBeanServer platformMBeanServer;
private static OperatingSystemMXBean operatingSystemMXBean;
private static ObjectName objectName;
private static OperatingSystemMXBean operatingSystemBean;
private static Class<?> operatingSystemBeanClass;
private static Method systemCpuUsage;
// trying caching from ProcessorMetrics
private static Method processCpuUsage;
private static final List<String> OPERATING_SYSTEM_BEAN_CLASS_NAMES = Arrays.asList(
"com.ibm.lang.management.OperatingSystemMXBean", // J9
"com.sun.management.OperatingSystemMXBean" // HotSpot
);
public static void main(String[] args) {
DoubleSummaryStatistics doubleSummaryStatistics = new DoubleSummaryStatistics();
Runnable cpuLoadUsingMxBean = () -> {
Double processCpuLoad = invoke(processCpuUsage);
doubleSummaryStatistics.accept(processCpuLoad);
System.out.println(Thread.currentThread().getName() + " cpu load: " + String.format("%.2f", processCpuLoad) + " / " + doubleSummaryStatistics.getAverage());
};
/*
platformMBeanServer = getPlatformMBeanServer();
operatingSystemMXBean = getOperatingSystemMXBean();
objectName = operatingSystemMXBean.getObjectName();
*/
operatingSystemBean = ManagementFactory.getOperatingSystemMXBean();
operatingSystemBeanClass = getFirstClassFound(OPERATING_SYSTEM_BEAN_CLASS_NAMES);
processCpuUsage = detectMethod("getProcessCpuLoad");
var executorService = Executors.newScheduledThreadPool(10);
executorService.scheduleAtFixedRate(cpuLoadUsingMxBean, 0, 5, TimeUnit.SECONDS);
// executorService.scheduleAtFixedRate(cpuLoadUsingMxBean, 0, 1, TimeUnit.SECONDS);
// executorService.scheduleAtFixedRate(cpuLoadUsingMxBean, 0, 1, TimeUnit.SECONDS);
}
private static double invoke( Method method) {
try {
return method != null ? toDouble((Number) method.invoke(operatingSystemBean)) : Double.NaN;
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
return Double.NaN;
}
}
private static double toDouble(Number number) {
return number != null ? number.doubleValue() : Double.NaN;
}
private static Class<?> getFirstClassFound(List<String> classNames) {
for (String className : classNames) {
try {
return Class.forName(className);
}
catch (ClassNotFoundException ignore) {
}
}
return null;
}
private static Method detectMethod(String name) {
requireNonNull(name);
if (operatingSystemBeanClass == null) {
return null;
}
try {
// ensure the Bean we have is actually an instance of the interface
Object ignored = operatingSystemBeanClass.cast(operatingSystemBean);
return operatingSystemBeanClass.getMethod(name);
}
catch (ClassCastException | NoSuchMethodException | SecurityException e) {
return null;
}
}
public static Double getProcessCpuLoad() {
return getMXBeanValueAsDouble("ProcessCpuLoad");
}
private static Double getMXBeanValueAsDouble(String name) {
double value = ((Number) getMXBeanValue(name)).doubleValue();
if (!Double.isNaN(value)) {
return value;
}
return -1D;
}
private static OperatingSystemMXBean getOperatingSystemMXBean() {
try {
return ManagementFactory.getOperatingSystemMXBean();
} catch (ExceptionInInitializerError | NoClassDefFoundError e) {
return null;
}
}
private static MBeanServer getPlatformMBeanServer() {
try {
return ManagementFactory.getPlatformMBeanServer();
} catch (ExceptionInInitializerError | NoClassDefFoundError e) {
return null;
}
}
static <O> O getMXBeanValue(String name) {
try {
final Object attribute = platformMBeanServer.getAttribute(objectName, name);
return (O) attribute;
} catch (Throwable ex) {
throw new IllegalStateException(ex);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment