该方法返回 double 类型的 1 分钟系统平均负载值,表示过去 60 秒内平均处于可运行或不可中断睡眠状态的进程数;在 linux/unix 上有效,在 windows/macos 上可能返回 -1.0。

OperatingSystemMXBean.getSystemLoadAverage() 返回的是系统最近 1 分钟的平均负载(load average),单位为“可运行任务数”,不是 CPU 使用率,也不是百分比。
它返回什么值?
该方法返回一个 double 类型数值,代表 Linux/Unix 系统中 uptime 或 top 命令显示的 “1-minute load average”。它反映的是:在过去 60 秒内,平均有多少个进程处于 可运行状态(running)或不可中断睡眠状态(uninterruptible sleep,如等待 I/O)。
- 值为 1.0 表示系统平均有 1 个任务在争抢 CPU(对单核 CPU 来说接近满载)
- 值为 4.0 在 4 核机器上大致表示 CPU 资源被充分利用
- 值持续显著高于 CPU 核心数,通常意味着系统过载(排队任务多、响应变慢)
- 在 Windows 和 macOS 上,该方法可能返回 -1.0(不支持),需提前判断
怎么安全调用?
不是所有平台都支持该指标,直接调用可能返回 -1 或抛异常。推荐写法:
- 先获取
OperatingSystemMXBean实例:ManagementFactory.getOperatingSystemMXBean() - 检查是否为
com.sun.management.OperatingSystemMXBean(JDK 特有扩展接口) - 调用前判断
getSystemLoadAverage() > 0,否则忽略或记录为“不可用” - 避免高频调用(如每毫秒),该值本身是内核周期性计算的平滑值,每秒取一次足够
和 CPU 使用率的区别
这是最容易混淆的点:
- load average 是队列长度指标(含等待 I/O 的进程),反映系统整体承压能力
-
CPU usage(如
getProcessCpuLoad())是时间占比,只看 CPU 时间片消耗 - 高 load + 低 CPU usage → 可能是大量进程卡在磁盘/网络 I/O(I/O wait 高)
- 高 load + 高 CPU usage → 真正的 CPU 密集型过载
实际监控建议
单独看一个 load 值意义有限,应结合其他指标一起分析:
- 同时采集
getAvailableProcessors(),用于归一化(load / core count) - 搭配 JVM 内存使用率、GC 频次、线程数等,判断瓶颈是否在 Java 层
- 设置告警阈值时,建议按核心数倍数设(如 4 核机器 load > 12 持续 5 分钟再告警)
- 注意容器环境:Docker/K8s 中该值反映的是宿主机负载,不是容器限制内的视图










