OSHI 系统信息获取实战:CPU 使用率实时监控方案
你是否还在为如何实时监控服务器 CPU 使用率而烦恼?是否觉得现有工具要么太重,要么不够灵活?本文将带你使用 OSHI(Operating System and Hardware Information)这个轻量级 Java 库,快速实现一套 CPU 使用率实时监控方案。读完本文,你将掌握从环境搭建到代码实现,再到数据可视化的完整流程,轻松解决系统监控中的 CPU 数据采集难题。
准备工作:环境搭建与依赖配置
OSHI 作为一款强大的系统信息获取库,支持 Windows、Linux、macOS 等多种操作系统。要使用 OSHI,首先需要在你的项目中引入相关依赖。
如果你使用 Maven 构建项目,可以在 pom.xml 中添加以下依赖:
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.9.1-SNAPSHOT</version>
</dependency>
依赖配置文件路径:pom.xml
OSHI 的核心功能都封装在 oshi-core 模块中,通过引入该依赖,你就可以使用 OSHI 提供的各种 API 来获取系统信息了。
核心实现:CPU 使用率获取原理与代码示例
OSHI 获取 CPU 使用率的核心是通过 CentralProcessor 类。该类提供了丰富的方法来获取 CPU 的各种信息,包括系统 CPU 使用率和每个逻辑处理器的使用率。
系统 CPU 使用率获取
以下是一个简单的示例代码,展示如何使用 OSHI 获取系统 CPU 使用率:
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
public class CpuMonitor {
public static void main(String[] args) {
SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = systemInfo.getHardware().getProcessor();
// 获取系统 CPU 使用率,采样间隔 1 秒
double cpuLoad = processor.getSystemCpuLoad(1000);
System.out.printf("系统 CPU 使用率: %.2f%%\n", cpuLoad * 100);
}
}
CPU 信息处理核心类:CentralProcessor.java
getSystemCpuLoad(long delay) 方法会先记录当前的 CPU 时间片数据,然后等待指定的时间(单位毫秒),再次获取 CPU 时间片数据,通过计算两次数据的差值来得到这段时间内的 CPU 使用率。
逻辑处理器使用率获取
除了系统整体的 CPU 使用率,OSHI 还支持获取每个逻辑处理器的使用率:
// 获取每个逻辑处理器的使用率
double[] processorCpuLoads = processor.getProcessorCpuLoad(1000);
for (int i = 0; i < processorCpuLoads.length; i++) {
System.out.printf("逻辑处理器 %d 使用率: %.2f%%\n", i, processorCpuLoads[i] * 100);
}
实时监控:定时任务实现持续采集
要实现 CPU 使用率的实时监控,我们可以使用定时任务来定期采集数据。以下是一个使用 ScheduledExecutorService 实现的简单定时监控示例:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class CpuRealTimeMonitor {
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = systemInfo.getHardware().getProcessor();
// 定时任务,每隔 1 秒执行一次
scheduler.scheduleAtFixedRate(() -> {
double cpuLoad = processor.getSystemCpuLoad(1000);
System.out.printf("[%tT] 系统 CPU 使用率: %.2f%%\n", System.currentTimeMillis(), cpuLoad * 100);
}, 0, 1, TimeUnit.SECONDS);
}
}
数据可视化:集成图表展示
为了更直观地展示 CPU 使用率的变化趋势,我们可以集成图表库进行数据可视化。OSHI 的 demo 模块中提供了一个使用 JFreeChart 实现的 CPU 使用率监控面板 ProcessorPanel。
以下是 ProcessorPanel 的核心代码片段:
// 创建动态时间序列数据集
DynamicTimeSeriesCollection sysData = new DynamicTimeSeriesCollection(1, 60, new Second());
sysData.setTimeBase(new Second(date));
sysData.addSeries(floatArrayPercent(cpuData(processor)), 0, "All cpus");
// 创建图表
JFreeChart systemCpu = ChartFactory.createTimeSeriesChart("System CPU Usage", "Time", "% CPU", sysData, true, true, false);
// 使用定时器定时更新数据
Timer timer = new Timer(Config.REFRESH_FAST, e -> {
sysData.advanceTime();
sysData.appendData(floatArrayPercent(cpuData(processor)));
});
timer.start();
CPU 监控面板实现:ProcessorPanel.java
通过这个面板,你可以实时看到系统 CPU 和每个逻辑处理器的使用率变化曲线,非常直观。
注意事项:跨平台兼容性与性能影响
OSHI 虽然支持多种操作系统,但在不同系统上获取 CPU 使用率的实现方式可能有所不同。例如,在 Windows 系统上,OSHI 使用 WMI 或性能计数器来获取数据;在 Linux 系统上,则通过读取 /proc 文件系统来获取。
不同系统的 CPU 信息实现:
- Linux:LinuxCentralProcessor.java
- macOS:MacCentralProcessor.java
- Windows:WindowsCentralProcessor.java
另外,CPU 使用率的采集本身也会消耗一定的系统资源。为了减少对系统的影响,建议合理设置采样间隔,避免过于频繁地采集数据。一般来说,1-5 秒的采样间隔对于大多数监控场景已经足够。
总结与展望
通过本文的介绍,你已经了解了如何使用 OSHI 实现 CPU 使用率的实时监控。从环境搭建、核心 API 使用,到定时任务实现和数据可视化,我们覆盖了整个流程。
OSHI 不仅可以获取 CPU 使用率,还能提供内存、磁盘、网络等丰富的系统信息。你可以基于本文介绍的方法,进一步扩展监控范围,构建一个全面的系统监控解决方案。
如果你对 OSHI 的其他功能感兴趣,可以查阅官方文档或参考 demo 模块中的示例代码。希望本文对你有所帮助,祝你在系统监控的道路上越走越远!
官方文档与示例:
- 项目 README:README.md
- 示例代码:oshi-demo/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



