在Java中获取服务器硬件信息是系统监控、性能优化和资源管理的重要环节,通过Java程序可以采集CPU、内存、磁盘、网络等硬件数据,帮助运维人员实时掌握服务器状态,以下是详细的实现方法和示例代码。

获取CPU信息
CPU信息包括使用率、核心数、频率等,在Java中,可以通过操作系统命令或第三方库(如OSHI)获取,以下是使用OSHI库的示例:
-
添加OSHI依赖(Maven):
<dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>6.4.0</version> </dependency>
-
代码实现:
import oshi.SystemInfo; import oshi.hardware.CentralProcessor; import oshi.hardware.GlobalMemory;
public class HardwareInfo { public static void main(String[] args) { SystemInfo systemInfo = new SystemInfo(); CentralProcessor processor = systemInfo.getHardware().getProcessor();

// CPU核心数
int logicalProcessors = processor.getLogicalProcessorCount();
int physicalProcessors = processor.getPhysicalProcessorCount();
// CPU使用率(计算5秒内的差异)
double[] cpuLoad = processor.getSystemCpuLoadBetweenTicks(5000);
double systemCpuLoad = processor.getSystemCpuLoad() * 100;
System.out.println("逻辑核心数: " + logicalProcessors);
System.out.println("物理核心数: " + physicalProcessors);
System.out.println("CPU使用率: " + String.format("%.2f%%", systemCpuLoad));
}
### 二、获取内存信息
内存信息包括总内存、已用内存、可用内存等,通过`GlobalMemory`类获取:
```java
GlobalMemory memory = systemInfo.getHardware().getMemory();
long totalMemory = memory.getTotal();
long availableMemory = memory.getAvailable();
long usedMemory = totalMemory - availableMemory;
System.out.println("总内存: " + formatBytes(totalMemory));
System.out.println("已用内存: " + formatBytes(usedMemory));
System.out.println("可用内存: " + formatBytes(availableMemory));
获取磁盘信息
磁盘信息包括分区大小、使用率、IO操作等,通过HWDiskStore类获取:
List<HWDiskStore> diskStores = systemInfo.getHardware().getDiskStores();
for (HWDiskStore disk : diskStores) {
System.out.println("磁盘名称: " + disk.getName());
System.out.println("总大小: " + formatBytes(disk.getSize()));
System.out.println("读取字节数: " + disk.getReadBytes());
System.out.println("写入字节数: " + disk.getWriteBytes());
}
获取网络信息
网络信息包括IP地址、流量统计等,通过NetworkIF类获取:
List<NetworkIF> networkIFs = systemInfo.getNetworkIFs();
for (NetworkIF networkIF : networkIFs) {
System.out.println("网络接口: " + networkIF.getName());
System.out.println("IP地址: " + networkIF.getIPv4addr());
System.out.println("接收字节数: " + networkIF.getBytesRecv());
System.out.println("发送字节数: " + networkIF.getBytesSent());
}
硬件信息汇总表
以下是常见硬件信息的获取方式和输出示例:
| 硬件类型 | 获取方法 | 示例输出 |
|---|---|---|
| CPU核心数 | processor.getLogicalProcessorCount() |
逻辑核心数: 8 |
| 内存使用率 | (1 - availableMemory/totalMemory) * 100 |
内存使用率: 65.32% |
| 磁盘使用率 | 计算已用空间/总空间 | C盘使用率: 78.5% |
| 网络接收流量 | networkIF.getBytesRecv() |
接收字节数: 1024000 |
注意事项
- 权限问题:部分系统命令需要管理员权限,如Windows的
wmic命令。 - 跨平台兼容性:不同操作系统(Linux/Windows/macOS)的命令和API可能不同,OSHI库已封装跨平台实现。
- 性能影响:频繁获取硬件信息可能影响系统性能,建议合理设置采集间隔。
相关问答FAQs
Q1: 为什么使用OSHI库而不是直接执行系统命令?
A1: OSHI库是纯Java实现,跨平台兼容性更好,且避免了命令注入风险,直接执行系统命令(如Runtime.getRuntime().exec())需要处理不同操作系统的命令差异,且可能因权限问题失败。

Q2: 如何获取CPU的实时温度?
A2: OSHI库通过CentralProcessor.getSystemCpuLoad()获取使用率,但温度信息依赖于硬件传感器,可通过com.sun.management.OperatingSystemMXBean(JDK专属)或读取/sys/class/thermal/thermal_zone*(Linux)获取,但需要额外处理权限和传感器差异。
