1. 为什么选择OSHI进行系统监控?
当需要在 Java 中获取 CPU 使用率、内存状态或磁盘空间时,你可能会纠结:“难道要调用系统命令或使用 JNI 吗?” 完全不用!OSHI(Operating System and Hardware Information)就是为解决这类问题而生的。
OSHI 是一个纯 Java 库,无需任何原生依赖就能获取系统级信息。 它作为 Java 应用与系统 API 之间的桥梁,以跨平台方式提供操作系统、硬件和网络等关键数据。
✅ 核心优势
- 跨平台支持:兼容 Windows、macOS、Linux 等主流操作系统
- 深度系统洞察:提供 CPU、内存、磁盘、传感器、网络等详细信息
- 零原生依赖:纯 Java 实现,无需安装额外组件
- 轻量易用:只需添加一个依赖即可快速集成
❌ 传统方案的局限
System.getProperty()
只能获取操作系统名称和版本Runtime.exec()
需要编写平台特定的系统命令
2. 核心特性与优势
使用 OSHI 可以轻松获取以下系统信息:
- 操作系统详情:名称、版本、架构、运行时间
- CPU 监控:使用率、核心数、处理器速度
- 内存统计:总内存、可用内存、交换分区使用情况
- 磁盘信息:分区详情、读写速度
- 网络数据:接口信息、IP 地址、带宽使用
- 传感器数据:CPU 温度、风扇转速、电压(需硬件支持)
3. 在Java项目中设置OSHI
集成 OSHI 非常简单,只需添加 Maven 依赖:
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.4.2</version>
</dependency>
添加后即可开始使用所有功能!
4. 获取基础系统信息
4.1. 获取操作系统详情
想知道当前运行的操作系统版本和架构?OSHI 让这变得异常简单:
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
System.out.println("操作系统: " + os.toString());
System.out.println("版本: " + os.getVersionInfo());
System.out.println("架构: " + os.getArch());
System.out.println("运行时间: " + os.getSystemUptime() + "秒");
4.2. 动态测量CPU负载
实时监控 CPU 使用率是系统监控的核心需求:
@Test
void givenSystem_whenUsingOSHI_thenExtractCPULoad() throws InterruptedException {
SystemInfo si = new SystemInfo();
CentralProcessor processor = si.getHardware().getProcessor();
long[] prevTicks = processor.getSystemCpuLoadTicks();
TimeUnit.SECONDS.sleep(1);
double cpuLoad = processor.getSystemCpuLoadBetweenTicks(prevTicks) * 100;
assertTrue(cpuLoad >= 0 && cpuLoad <= 100, "CPU负载应在0%-100%之间");
}
这段代码的工作原理:
- 获取初始 CPU 时间片数据 (
prevTicks
) - 等待 1 秒
- 计算时间片间的 CPU 负载百分比
- 验证结果在合理范围内(0%-100%)
⚠️ 注意:百分比越低表示 CPU 越空闲,越高表示负载越重
5. 内存监控
5.1. 获取总内存和可用内存
内存监控是系统健康检查的关键指标:
@Test
void givenSystem_whenUsingOSHI_thenExtractMemoryDetails() {
SystemInfo si = new SystemInfo();
GlobalMemory memory = si.getHardware().getMemory();
assertTrue(memory.getTotal() > 0, "总内存应为正数");
assertTrue(memory.getAvailable() >= 0, "可用内存不能为负数");
assertTrue(memory.getAvailable() <= memory.getTotal(), "可用内存不能超过总内存");
}
代码验证了三个关键点:
- 系统确实有内存(总内存 > 0)
- 可用内存数据有效(非负数)
- 逻辑一致性(可用内存 ≤ 总内存)
5.2. 存储和磁盘信息
OSHI 同样能提供磁盘存储的详细信息,包括分区布局和读写性能。这部分功能特别适合:
- 容量规划
- 性能瓶颈分析
- 存储健康监控
6. OSHI的局限性
尽管功能强大,OSHI 仍有以下限制:
- 传感器数据依赖硬件支持:并非所有设备都提供温度/电压读数
- 只读访问:仅能获取系统信息,无法修改系统配置
- 平台差异:部分信息在不同操作系统间可能存在细微差异
7. 总结
OSHI 是一个功能强大且轻量级的 Java 系统监控库,它彻底消除了处理原生系统命令、JNI 或平台特定依赖的麻烦。对于需要跨平台系统监控的开发者来说,这是一个绝佳选择。
本文所有代码示例均可在 GitHub 获取。