Java一鍵獲取(CPU、內(nèi)存、硬盤、操作系統(tǒng))系統(tǒng)信息
Java 中獲取系統(tǒng)信息(CPU、內(nèi)存、硬盤、操作系統(tǒng))主要有以下幾種方式:
- 使用 Java 原生 API(
java.lang.management包) - 使用第三方庫(如 OSHI)
- 使用 Runtime 執(zhí)行系統(tǒng)命令
下面詳細介紹每種方法。
一、使用 Java 原生 API
Java 自帶的 ManagementFactory 可以獲取部分系統(tǒng)信息,但功能有限。
1. 獲取操作系統(tǒng)信息
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
public class SystemInfo {
public static void main(String[] args) {
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
System.out.println("操作系統(tǒng)名稱: " + osBean.getName());
System.out.println("操作系統(tǒng)版本: " + osBean.getVersion());
System.out.println("操作系統(tǒng)架構(gòu): " + osBean.getArch());
System.out.println("可用處理器核心數(shù): " + osBean.getAvailableProcessors());
System.out.println("系統(tǒng)平均負載: " + osBean.getSystemLoadAverage());
}
}2. 獲取內(nèi)存信息(有限)
import com.sun.management.OperatingSystemMXBean;
import java.lang.management.ManagementFactory;
public class MemoryInfo {
public static void main(String[] args) {
OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
// 獲取總物理內(nèi)存(字節(jié))
long totalMemory = osBean.getTotalPhysicalMemorySize();
// 獲取可用物理內(nèi)存(字節(jié))
long freeMemory = osBean.getFreePhysicalMemorySize();
System.out.println("總物理內(nèi)存: " + formatBytes(totalMemory));
System.out.println("可用物理內(nèi)存: " + formatBytes(freeMemory));
System.out.println("已用物理內(nèi)存: " + formatBytes(totalMemory - freeMemory));
}
private static String formatBytes(long bytes) {
return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0));
}
}注意:com.sun.management.OperatingSystemMXBean 不是標準 API,在不同 JDK 實現(xiàn)中可能不可用。
二、使用 OSHI 庫(推薦)
OSHI(Operating System and Hardware Information)是一個跨平臺的 Java 庫,功能最全面。
1. 添加 Maven 依賴
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.4.0</version>
</dependency>2. 獲取 CPU 信息
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;
public class CpuInfo {
public static void main(String[] args) {
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
CentralProcessor cpu = hal.getProcessor();
System.out.println("CPU 名稱: " + cpu.getProcessorIdentifier().getName());
System.out.println("CPU 物理核心數(shù): " + cpu.getPhysicalProcessorCount());
System.out.println("CPU 邏輯核心數(shù): " + cpu.getLogicalProcessorCount());
System.out.println("CPU 最大頻率: " + cpu.getMaxFreq() / 1_000_000 + " MHz");
// 獲取 CPU 使用率
long[] prevTicks = cpu.getSystemCpuLoadTicks();
try {
Thread.sleep(1000); // 等待1秒計算使用率
} catch (InterruptedException e) {
e.printStackTrace();
}
double cpuLoad = cpu.getSystemCpuLoadBetweenTicks(prevTicks) * 100;
System.out.printf("CPU 使用率: %.2f%%\n", cpuLoad);
}
}3. 獲取內(nèi)存信息
import oshi.SystemInfo;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
public class MemoryInfo {
public static void main(String[] args) {
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
GlobalMemory memory = hal.getMemory();
long total = memory.getTotal();
long available = memory.getAvailable();
System.out.println("總內(nèi)存: " + formatBytes(total));
System.out.println("可用內(nèi)存: " + formatBytes(available));
System.out.println("已用內(nèi)存: " + formatBytes(total - available));
System.out.println("內(nèi)存使用率: " +
String.format("%.2f%%", (total - available) * 100.0 / total));
// 獲取交換空間(虛擬內(nèi)存)
System.out.println("總交換空間: " + formatBytes(memory.getVirtualMemory().getSwapTotal()));
System.out.println("可用交換空間: " + formatBytes(memory.getVirtualMemory().getSwapFree()));
}
private static String formatBytes(long bytes) {
return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0));
}
}4. 獲取硬盤信息
import oshi.SystemInfo;
import oshi.hardware.HWDiskStore;
import oshi.hardware.HardwareAbstractionLayer;
import java.util.List;
public class DiskInfo {
public static void main(String[] args) {
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
List<HWDiskStore> diskStores = hal.getDiskStores();
for (HWDiskStore disk : diskStores) {
System.out.println("硬盤名稱: " + disk.getName());
System.out.println("硬盤型號: " + disk.getModel());
System.out.println("硬盤序列號: " + disk.getSerial());
System.out.println("硬盤大小: " + formatBytes(disk.getSize()));
System.out.println("讀取次數(shù): " + disk.getReads());
System.out.println("寫入次數(shù): " + disk.getWrites());
System.out.println("讀取字節(jié)數(shù): " + formatBytes(disk.getReadBytes()));
System.out.println("寫入字節(jié)數(shù): " + formatBytes(disk.getWriteBytes()));
System.out.println("----------------------------");
}
// 獲取文件系統(tǒng)信息(分區(qū))
hal.getFileSystem().getFileStores().forEach(fileStore -> {
System.out.println("分區(qū): " + fileStore.getVolume());
System.out.println("掛載點: " + fileStore.getMount());
System.out.println("總空間: " + formatBytes(fileStore.getTotalSpace()));
System.out.println("可用空間: " + formatBytes(fileStore.getUsableSpace()));
System.out.println("已用空間: " + formatBytes(fileStore.getTotalSpace() - fileStore.getUsableSpace()));
System.out.println("----------------------------");
});
}
private static String formatBytes(long bytes) {
return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0));
}
}5. 獲取操作系統(tǒng)信息
import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;
public class OsInfo {
public static void main(String[] args) {
SystemInfo si = new SystemInfo();
OperatingSystem os = si.getOperatingSystem();
System.out.println("操作系統(tǒng): " + os.toString());
System.out.println("操作系統(tǒng)家族: " + os.getFamily());
System.out.println("操作系統(tǒng)制造商: " + os.getManufacturer());
System.out.println("操作系統(tǒng)版本: " + os.getVersionInfo());
System.out.println("進程數(shù): " + os.getProcessCount());
System.out.println("線程數(shù): " + os.getThreadCount());
System.out.println("系統(tǒng)啟動時間: " + new java.util.Date(os.getSystemBootTime() * 1000));
}
}6. 完整示例:獲取所有信息
import oshi.SystemInfo;
import oshi.hardware.*;
import oshi.software.os.OperatingSystem;
public class AllSystemInfo {
public static void main(String[] args) {
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
OperatingSystem os = si.getOperatingSystem();
System.out.println("========== 操作系統(tǒng)信息 ==========");
System.out.println("操作系統(tǒng): " + os.toString());
System.out.println("系統(tǒng)啟動時間: " + new java.util.Date(os.getSystemBootTime() * 1000));
System.out.println("\n========== CPU信息 ==========");
CentralProcessor cpu = hal.getProcessor();
System.out.println("CPU: " + cpu.getProcessorIdentifier().getName());
System.out.println("物理核心: " + cpu.getPhysicalProcessorCount());
System.out.println("邏輯核心: " + cpu.getLogicalProcessorCount());
// CPU 使用率
long[] prevTicks = cpu.getSystemCpuLoadTicks();
try { Thread.sleep(1000); } catch (InterruptedException e) { }
System.out.printf("CPU使用率: %.2f%%\n", cpu.getSystemCpuLoadBetweenTicks(prevTicks) * 100);
System.out.println("\n========== 內(nèi)存信息 ==========");
GlobalMemory memory = hal.getMemory();
long totalMem = memory.getTotal();
long availMem = memory.getAvailable();
System.out.println("總內(nèi)存: " + formatBytes(totalMem));
System.out.println("可用內(nèi)存: " + formatBytes(availMem));
System.out.printf("內(nèi)存使用率: %.2f%%\n", (totalMem - availMem) * 100.0 / totalMem);
System.out.println("\n========== 硬盤信息 ==========");
hal.getFileSystem().getFileStores().forEach(fs -> {
System.out.println("分區(qū): " + fs.getMount());
System.out.println("總空間: " + formatBytes(fs.getTotalSpace()));
System.out.println("可用空間: " + formatBytes(fs.getUsableSpace()));
System.out.println("-------------------");
});
}
private static String formatBytes(long bytes) {
String[] units = {"B", "KB", "MB", "GB", "TB"};
int unitIndex = 0;
double size = bytes;
while (size >= 1024 && unitIndex < units.length - 1) {
size /= 1024;
unitIndex++;
}
return String.format("%.2f %s", size, units[unitIndex]);
}
}三、使用 Runtime 執(zhí)行系統(tǒng)命令
如果不想引入第三方庫,可以通過執(zhí)行系統(tǒng)命令來獲取信息。
Windows 示例
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class CommandInfo {
public static void main(String[] args) {
// 獲取 CPU 信息
executeCommand("wmic cpu get name");
// 獲取內(nèi)存信息
executeCommand("wmic memorychip get capacity");
// 獲取硬盤信息
executeCommand("wmic logicaldisk get size,freespace,caption");
}
private static void executeCommand(String command) {
try {
Process process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream(), "GBK"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}Linux 示例
// CPU 信息
executeCommand("cat /proc/cpuinfo | grep 'model name' | head -1");
// 內(nèi)存信息
executeCommand("cat /proc/meminfo | grep MemTotal");
// 硬盤信息
executeCommand("df -h");總結(jié)
| 方法 | 優(yōu)點 | 缺點 |
|---|---|---|
| Java 原生 API | 無需額外依賴 | 信息有限,部分 API 非標準 |
| OSHI 庫 | 跨平臺,信息全面,易于使用 | 需要引入第三方依賴 |
| 執(zhí)行系統(tǒng)命令 | 能獲取任意信息 | 平臺相關(guān),解析復雜,性能較差 |
推薦使用 OSHI 庫,它封裝了底層細節(jié),提供了統(tǒng)一的跨平臺 API,能獲取最全面的系統(tǒng)信息。
到此這篇關(guān)于Java一鍵獲取(CPU、內(nèi)存、硬盤、操作系統(tǒng))系統(tǒng)信息的文章就介紹到這了,更多相關(guān)Java獲取系統(tǒng)信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud之服務注冊與發(fā)現(xiàn)Spring Cloud Eureka實例代碼
這篇文章主要介紹了SpringCloud之服務注冊與發(fā)現(xiàn)Spring Cloud Eureka實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
spring-session簡介及實現(xiàn)原理源碼分析
這篇文章主要介紹了spring-session簡介及實現(xiàn)原理源碼分析,具有一定參考價值,需要的朋友可以了解下。2017-11-11
Java程序順序結(jié)構(gòu)中邏輯控制語句詳解流程
在程序開發(fā)的過程之中一共會存在有三種程序邏輯:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),對于之前所編寫的代碼大部分都是順序結(jié)構(gòu)的定義,即:所有的程序?qū)凑斩x的代碼順序依次執(zhí)行2021-10-10
springboot-mongodb的多數(shù)據(jù)源配置的方法步驟
這篇文章主要介紹了springboot-mongodb的多數(shù)據(jù)源配置的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
Maven Profile多環(huán)境構(gòu)建實戰(zhàn)指南
在現(xiàn)代企業(yè)級Java項目開發(fā)中,面對開發(fā)(dev)、測試(test)、預發(fā)布(staging)、生產(chǎn)(prod)等多套環(huán)境的差異化配置管理,本文將從實戰(zhàn)角度深入剖析Maven Profile的多環(huán)境構(gòu)建體系,需要的朋友可以參考下2025-05-05
java基本教程之常用的實現(xiàn)多線程的兩種方式 java多線程教程
下面開始學習“常用的實現(xiàn)多線程的2種方式”:Thread 和 Runnable。之所以說是常用的,是因為通過還可以通過java.util.concurrent包中的線程池來實現(xiàn)多線程2014-01-01
POI導出之Excel實現(xiàn)單元格的背景色填充問題
這篇文章主要介紹了POI導出之Excel實現(xiàn)單元格的背景色填充問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

