本文目录导读:

我来为您提供几个Java获取系统信息的实用案例,包括CPU、内存、磁盘、操作系统等信息的获取方法。
基础系统属性获取
import java.util.Properties;
import java.util.Map;
public class SystemInfoDemo {
public static void main(String[] args) {
// 获取系统属性
Properties props = System.getProperties();
System.out.println("===== 系统基本信息 =====");
System.out.println("操作系统名称: " + System.getProperty("os.name"));
System.out.println("操作系统版本: " + System.getProperty("os.version"));
System.out.println("操作系统架构: " + System.getProperty("os.arch"));
System.out.println("Java版本: " + System.getProperty("java.version"));
System.out.println("Java虚拟机版本: " + System.getProperty("java.vm.version"));
System.out.println("Java厂商: " + System.getProperty("java.vendor"));
System.out.println("用户名称: " + System.getProperty("user.name"));
System.out.println("用户主目录: " + System.getProperty("user.home"));
System.out.println("当前工作目录: " + System.getProperty("user.dir"));
System.out.println("文件分隔符: " + System.getProperty("file.separator"));
System.out.println("路径分隔符: " + System.getProperty("path.separator"));
System.out.println("行分隔符: " + System.getProperty("line.separator"));
}
}
内存信息获取
public class MemoryInfoDemo {
public static void main(String[] args) {
// 获取运行时对象
Runtime runtime = Runtime.getRuntime();
// 设置最大内存(可选)
// runtime.maxMemory();
System.out.println("===== 内存信息 =====");
// 最大可用内存
long maxMemory = runtime.maxMemory();
System.out.println("最大可用内存: " + formatSize(maxMemory));
// 已分配内存
long totalMemory = runtime.totalMemory();
System.out.println("已分配内存: " + formatSize(totalMemory));
// 已分配内存中的空闲空间
long freeMemory = runtime.freeMemory();
System.out.println("空闲内存: " + formatSize(freeMemory));
// 已使用内存
long usedMemory = totalMemory - freeMemory;
System.out.println("已使用内存: " + formatSize(usedMemory));
// 内存使用率
double usageRatio = (double) usedMemory / maxMemory * 100;
System.out.printf("内存使用率: %.2f%%%n", usageRatio);
// 可用的处理器核心数
int processors = runtime.availableProcessors();
System.out.println("CPU核心数: " + processors);
}
// 格式化内存大小
private static String formatSize(long bytes) {
if (bytes < 1024) return bytes + " B";
int exp = (int) (Math.log(bytes) / Math.log(1024));
String pre = "KMGTPE".charAt(exp-1) + "";
return String.format("%.2f %sB", bytes / Math.pow(1024, exp), pre);
}
}
使用第三方库获取详细系统信息
1 OSHI库(推荐)
首先添加Maven依赖:
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.4.0</version>
</dependency>
import oshi.SystemInfo;
import oshi.hardware.*;
import oshi.software.os.*;
import java.util.List;
public class OSHISystemInfo {
public static void main(String[] args) {
SystemInfo si = new SystemInfo();
// 获取硬件信息
HardwareAbstractionLayer hal = si.getHardware();
OperatingSystem os = si.getOperatingSystem();
System.out.println("===== 操作系统信息 =====");
System.out.println("操作系统: " + os.toString());
System.out.println("系统版本: " + os.getVersionInfo());
System.out.println("系统架构: " + System.getProperty("os.arch"));
// CPU信息
CentralProcessor processor = hal.getProcessor();
System.out.println("\n===== CPU信息 =====");
System.out.println("CPU型号: " + processor.getProcessorIdentifier().getName());
System.out.println("物理核心数: " + processor.getPhysicalProcessorCount());
System.out.println("逻辑核心数: " + processor.getLogicalProcessorCount());
// CPU使用率
double[] load = processor.getSystemLoadAverage(1);
System.out.println("系统负载: " + load[0]);
// 内存信息
GlobalMemory memory = hal.getMemory();
System.out.println("\n===== 内存信息 =====");
System.out.println("总内存: " + formatBytes(memory.getTotal()));
System.out.println("可用内存: " + formatBytes(memory.getAvailable()));
System.out.println("已使用内存: " + formatBytes(memory.getTotal() - memory.getAvailable()));
// 磁盘信息
List<HWDiskStore> diskStores = hal.getDiskStores();
System.out.println("\n===== 磁盘信息 =====");
for (HWDiskStore disk : diskStores) {
System.out.println("磁盘名称: " + disk.getName());
System.out.println("磁盘大小: " + formatBytes(disk.getSize()));
System.out.println("读取速率: " + disk.getReadBytes() + " bytes");
System.out.println("写入速率: " + disk.getWriteBytes() + " bytes");
System.out.println("---");
}
// 网络信息
List<NetworkIF> networkIFs = hal.getNetworkIFs();
System.out.println("\n===== 网络信息 =====");
for (NetworkIF net : networkIFs) {
System.out.println("网卡名称: " + net.getName());
System.out.println("显示名称: " + net.getDisplayName());
System.out.println("MAC地址: " + net.getMacaddr());
System.out.println("IPv4地址: " + String.join(", ", net.getIPv4addr()));
System.out.println("IPv6地址: " + String.join(", ", net.getIPv6addr()));
System.out.println("---");
}
}
private static String formatBytes(long bytes) {
if (bytes < 1024) return bytes + " B";
int exp = (int) (Math.log(bytes) / Math.log(1024));
String pre = "KMGTPE".charAt(exp-1) + "";
return String.format("%.2f %sB", bytes / Math.pow(1024, exp), pre);
}
}
2 SIGAR库
添加依赖:
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>sigar</artifactId>
<version>1.6.4</version>
</dependency>
import org.hyperic.sigar.*;
import org.hyperic.sigar.cpu.CpuInfo;
import org.hyperic.sigar.cpu.CpuPerc;
import org.hyperic.sigar.mem.Mem;
public class SigarSystemInfo {
private static Sigar sigar;
public static void main(String[] args) {
try {
sigar = new Sigar();
getSystemInfo();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void getSystemInfo() throws Exception {
// CPU信息
System.out.println("===== CPU信息 =====");
CpuInfo[] cpuInfos = sigar.getCpuInfoList();
for (CpuInfo cpuInfo : cpuInfos) {
System.out.println("CPU型号: " + cpuInfo.getModel());
System.out.println("主频: " + cpuInfo.getMhz() + " MHz");
System.out.println("核心数: " + cpuInfo.getTotalCores());
}
// CPU使用率
CpuPerc cpuPerc = sigar.getCpuPerc();
System.out.println("CPU使用率: " + (cpuPerc.getCombined() * 100) + "%");
// 内存信息
System.out.println("\n===== 内存信息 =====");
Mem mem = sigar.getMem();
System.out.println("总内存: " + formatSize(mem.getTotal()));
System.out.println("已使用: " + formatSize(mem.getUsed()));
System.out.println("可用: " + formatSize(mem.getFree()));
System.out.println("内存使用率: " + (mem.getUsedPercent()) + "%");
// 交换分区
System.out.println("\n===== 交换分区 =====");
Swap swap = sigar.getSwap();
System.out.println("总交换空间: " + formatSize(swap.getTotal()));
System.out.println("已使用: " + formatSize(swap.getUsed()));
System.out.println("可用: " + formatSize(swap.getFree()));
// 文件系统信息
System.out.println("\n===== 文件系统 =====");
FileSystem[] fileSystems = sigar.getFileSystemList();
for (FileSystem fs : fileSystems) {
System.out.println("文件系统: " + fs.getDevName());
System.out.println("挂载点: " + fs.getDirName());
System.out.println("类型: " + fs.getSysTypeName());
System.out.println("---");
}
}
private static String formatSize(long size) {
if (size < 1024) return size + " B";
int exp = (int) (Math.log(size) / Math.log(1024));
String pre = "KMGTPE".charAt(exp-1) + "";
return String.format("%.2f %sB", size / Math.pow(1024, exp), pre);
}
}
获取网络和运行时信息
import java.net.*;
import java.util.Enumeration;
public class NetworkInfoDemo {
public static void main(String[] args) {
try {
System.out.println("===== 网络信息 =====");
// 获取本机IP地址
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("主机名: " + localHost.getHostName());
System.out.println("本机IP: " + localHost.getHostAddress());
// 获取所有网络接口
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface ni = interfaces.nextElement();
System.out.println("\n网络接口: " + ni.getName());
System.out.println("显示名称: " + ni.getDisplayName());
System.out.println("是否启用: " + ni.isUp());
System.out.println("是否回环: " + ni.isLoopback());
// 获取MAC地址
byte[] mac = ni.getHardwareAddress();
if (mac != null) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
System.out.println("MAC地址: " + sb.toString());
}
// 获取IP地址
Enumeration<InetAddress> addresses = ni.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
System.out.println("IP地址: " + addr.getHostAddress());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置文件示例
import java.io.*;
import java.util.Properties;
public class SystemConfigUtil {
private Properties props;
public SystemConfigUtil(String configPath) {
props = new Properties();
try (InputStream input = new FileInputStream(configPath)) {
props.load(input);
} catch (IOException e) {
e.printStackTrace();
}
}
public void printSystemConfig() {
System.out.println("===== 系统配置信息 =====");
System.out.println("应用名称: " + props.getProperty("app.name"));
System.out.println("应用版本: " + props.getProperty("app.version"));
System.out.println("运行环境: " + props.getProperty("env"));
System.out.println("数据库地址: " + props.getProperty("db.url"));
System.out.println("数据库用户: " + props.getProperty("db.username"));
// 获取环境变量
System.out.println("\n===== 环境变量 =====");
System.getenv().forEach((key, value) -> {
System.out.println(key + ": " + value);
});
}
}
完整的系统监控类
import java.lang.management.*;
import java.util.Map;
public class SystemMonitor {
public static void main(String[] args) throws Exception {
SystemMonitor monitor = new SystemMonitor();
while (true) {
monitor.printSystemStatus();
Thread.sleep(5000); // 每5秒刷新一次
System.out.println("--------------------------------");
}
}
public void printSystemStatus() {
// 内存使用
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
System.out.println("===== 系统状态监控 =====");
System.out.printf("堆内存: 已用 %d MB / 最大 %d MB%n",
heapUsage.getUsed() / 1024 / 1024,
heapUsage.getMax() / 1024 / 1024);
// 线程信息
ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
System.out.println("线程数: " + threadBean.getThreadCount());
System.out.println("峰值线程数: " + threadBean.getPeakThreadCount());
System.out.println("守护线程数: " + threadBean.getDaemonThreadCount());
// CPU使用率
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
System.out.println("CPU核心数: " + osBean.getAvailableProcessors());
System.out.println("系统负载: " + osBean.getSystemLoadAverage());
// 类加载信息
ClassLoadingMXBean classBean = ManagementFactory.getClassLoadingMXBean();
System.out.println("已加载类数: " + classBean.getLoadedClassCount());
System.out.println("已卸载类数: " + classBean.getUnloadedClassCount());
// GC信息
for (GarbageCollectorMXBean gcBean : ManagementFactory.getGarbageCollectorMXBeans()) {
System.out.println("GC " + gcBean.getName() + " 次数: " + gcBean.getCollectionCount());
System.out.println("GC " + gcBean.getName() + " 时间: " + gcBean.getCollectionTime() + "ms");
}
}
}
使用建议
- 简单场景:使用
System.getProperty()和Runtime类 - 详细硬件信息:使用 OSHI 库
- 跨平台兼容:注意不同操作系统的差异
- 性能监控:使用
java.lang.management包 - 生产环境:建议封装成服务,定时采集数据
这些示例覆盖了大多数系统信息获取的需求,您可以根据具体场景选择合适的方案。