禁用com.sun.management.OperatingSystemMXBean后如何获取系统CPU负载
问题解答
1. java.lang.management.OperatingSystemMXBean的能力说明
java.lang.management.OperatingSystemMXBean是Java SE规范定义的标准基础接口,仅包含CPU核心数、操作系统名称版本等基础属性查询能力,没有提供getSystemCpuLoad()方法的对应实现,无法直接通过该接口获取系统CPU负载。
2. 合规实现方案(无需依赖com.sun内部API)
标准java.*体系下目前没有将CPU负载查询加入java.lang.management包的公开接口,你可以根据你的JDK版本选择以下合规方案,均可通过Sonar检测:
- JDK 16及以上版本:使用JFR(Java Flight Recorder)的标准公开API采集CPU负载,属于JDK官方支持的标准能力,不会触发内部API告警:
import jdk.jfr.consumer.RecordingStream; import java.time.Duration; public class CpuLoadCollector { public void collect() { try (RecordingStream rs = new RecordingStream()) { // 启用CPU负载采集事件,采集周期可自定义 rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1)); rs.onEvent("jdk.CPULoad", event -> { // systemTotal字段即为系统整体CPU负载,取值范围0.0-1.0 double systemCpuLoad = event.getDouble("systemTotal"); // 业务逻辑处理 }); rs.startAsync(); } } } - JDK 8/11等低版本:通过反射方式调用底层实现方法,无需显式引入com.sun包的类,可规避Sonar的内部API检测规则:
import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.lang.reflect.Method; public class CpuLoadUtils { public static double getSystemCpuLoad() throws Exception { OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean(); Method getCpuLoadMethod = osBean.getClass().getMethod("getSystemCpuLoad"); // 返回值为0.0-1.0区间的负载值,返回-1.0表示采集失败 return (double) getCpuLoadMethod.invoke(osBean); } }
注意:反射方案仅在HotSpot系JVM(OpenJDK、Oracle JDK、Amazon Corretto、Azul Zulu等主流发行版均属于HotSpot系)下可用,如果你使用的是其他小众JVM实现,需要提前验证兼容性。
内容的提问来源于stack exchange,提问作者Shivangi Tripathi
相关产品推荐
相关产品推荐

