在Java中获取Linux系统信息
在Java中获取Linux系统信息可以通过多种方式实现,以下是几种常见的方法:

使用Java内置类
import java.lang.management.*;
public class SystemInfo {
public static void main(String[] args) {
// 获取操作系统信息
System.out.println("操作系统名称: " + System.getProperty("os.name"));
System.out.println("操作系统版本: " + System.getProperty("os.version"));
System.out.println("操作系统架构: " + System.getProperty("os.arch"));
// 获取Java虚拟机信息
System.out.println("Java版本: " + System.getProperty("java.version"));
System.out.println("Java供应商: " + System.getProperty("java.vendor"));
// 获取内存信息
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapUsage = memoryMXBean.getHeapMemoryUsage();
System.out.println("JVM堆内存使用: " + heapUsage.getUsed() / 1024 / 1024 + "MB");
}
}
使用Runtime执行系统命令
import java.io.*;
public class LinuxSystemInfo {
public static void main(String[] args) {
try {
// 获取CPU信息
Process process = Runtime.getRuntime().exec("cat /proc/cpuinfo");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 获取内存信息
process = Runtime.getRuntime().exec("free -m");
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 获取磁盘信息
process = Runtime.getRuntime().exec("df -h");
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用第三方库OSHI
OSHI是一个跨平台的Java系统信息库,可以轻松获取各种系统信息。
<!-- 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;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.OperatingSystem;
public class OshiExample {
public static void main(String[] args) {
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
OperatingSystem os = si.getOperatingSystem();
// 操作系统信息
System.out.println("操作系统: " + os.getFamily() + " " + os.getVersionInfo());
// CPU信息
CentralProcessor processor = hal.getProcessor();
System.out.println("处理器: " + processor.getProcessorIdentifier().getName());
System.out.println("逻辑处理器数: " + processor.getLogicalProcessorCount());
System.out.println("物理处理器数: " + processor.getPhysicalProcessorCount());
// 内存信息
GlobalMemory memory = hal.getMemory();
System.out.println("总内存: " + memory.getTotal() / 1024 / 1024 / 1024 + " GB");
System.out.println("可用内存: " + memory.getAvailable() / 1024 / 1024 / 1024 + " GB");
// 磁盘信息
hal.getDiskStores().forEach(disk -> {
System.out.println("磁盘: " + disk.getName() +
", 大小: " + disk.getSize() / 1024 / 1024 / 1024 + " GB");
});
}
}
使用SIGAR工具
SIGAR (System Information Gatherer And Reporter) 是另一个获取系统信息的工具,但需要额外的本地库。
// 需要下载sigar-bin.zip并解压,将sigar-amd64-linux.so等库放在java.library.path中
import org.hyperic.sigar.*;
public class SigarExample {
public static void main(String[] args) throws SigarException {
Sigar sigar = new Sigar();
// CPU信息
CpuPerc cpuList[] = sigar.getCpuPercList();
for (int i = 0; i < cpuList.length; i++) {
System.out.println("CPU " + i + ": " + cpuList[i].getCombined() * 100 + "%");
}
// 内存信息
Mem mem = sigar.getMem();
System.out.println("总内存: " + mem.getTotal() / 1024 / 1024 + " MB");
System.out.println("使用内存: " + mem.getUsed() / 1024 / 1024 + " MB");
System.out.println("空闲内存: " + mem.getFree() / 1024 / 1024 + " MB");
// 磁盘信息
FileSystem fslist[] = sigar.getFileSystemList();
for (int i = 0; i < fslist.length; i++) {
FileSystem fs = fslist[i];
System.out.println("磁盘: " + fs.getDevName() +
", 挂载点: " + fs.getDirName() +
", 总大小: " + sigar.getFileSystemUsage(fs.getDirName()).getTotal() / 1024 / 1024 + " MB");
}
}
}
注意事项
- 使用Runtime执行系统命令需要谨慎,要注意命令注入风险
- 访问/proc文件系统是Linux特有的方法,在其他系统上不可用
- 使用第三方库如OSHI或SIGAR可以提供更全面和跨平台的解决方案
- 在生产环境中使用这些方法时,要考虑性能影响和权限问题
方法可以根据具体需求选择使用,OSHI通常是现代Java应用获取系统信息的最佳选择。

