Java一键获取(CPU、内存、硬盘、操作系统)系统信息

 更新时间:2026年03月15日 08:27:30   作者:Full Stack Developme  
这篇文章主要为大家详细介绍了如何使用Java一键获取CPU、内存、硬盘、操作系统等系统信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

Java 中获取系统信息(CPU、内存、硬盘、操作系统)主要有以下几种方式:

  • 使用 Java 原生 APIjava.lang.management 包)
  • 使用第三方库(如 OSHI)
  • 使用 Runtime 执行系统命令

下面详细介绍每种方法。

一、使用 Java 原生 API

Java 自带的 ManagementFactory 可以获取部分系统信息,但功能有限。

1. 获取操作系统信息

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("操作系统名称: " + osBean.getName());
        System.out.println("操作系统版本: " + osBean.getVersion());
        System.out.println("操作系统架构: " + osBean.getArch());
        System.out.println("可用处理器核心数: " + osBean.getAvailableProcessors());
        System.out.println("系统平均负载: " + osBean.getSystemLoadAverage());
    }
}

2. 获取内存信息(有限)

import com.sun.management.OperatingSystemMXBean;
import java.lang.management.ManagementFactory;

public class MemoryInfo {
    public static void main(String[] args) {
        OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        
        // 获取总物理内存(字节)
        long totalMemory = osBean.getTotalPhysicalMemorySize();
        // 获取可用物理内存(字节)
        long freeMemory = osBean.getFreePhysicalMemorySize();
        
        System.out.println("总物理内存: " + formatBytes(totalMemory));
        System.out.println("可用物理内存: " + formatBytes(freeMemory));
        System.out.println("已用物理内存: " + 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 实现中可能不可用。

二、使用 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 物理核心数: " + cpu.getPhysicalProcessorCount());
        System.out.println("CPU 逻辑核心数: " + 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. 获取内存信息

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("总内存: " + formatBytes(total));
        System.out.println("可用内存: " + formatBytes(available));
        System.out.println("已用内存: " + formatBytes(total - available));
        System.out.println("内存使用率: " + 
            String.format("%.2f%%", (total - available) * 100.0 / total));
        
        // 获取交换空间(虚拟内存)
        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("读取次数: " + disk.getReads());
            System.out.println("写入次数: " + disk.getWrites());
            System.out.println("读取字节数: " + formatBytes(disk.getReadBytes()));
            System.out.println("写入字节数: " + formatBytes(disk.getWriteBytes()));
            System.out.println("----------------------------");
        }
        
        // 获取文件系统信息(分区)
        hal.getFileSystem().getFileStores().forEach(fileStore -> {
            System.out.println("分区: " + 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. 获取操作系统信息

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("操作系统: " + os.toString());
        System.out.println("操作系统家族: " + os.getFamily());
        System.out.println("操作系统制造商: " + os.getManufacturer());
        System.out.println("操作系统版本: " + os.getVersionInfo());
        System.out.println("进程数: " + os.getProcessCount());
        System.out.println("线程数: " + os.getThreadCount());
        System.out.println("系统启动时间: " + 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("========== 操作系统信息 ==========");
        System.out.println("操作系统: " + os.toString());
        System.out.println("系统启动时间: " + 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========== 内存信息 ==========");
        GlobalMemory memory = hal.getMemory();
        long totalMem = memory.getTotal();
        long availMem = memory.getAvailable();
        System.out.println("总内存: " + formatBytes(totalMem));
        System.out.println("可用内存: " + formatBytes(availMem));
        System.out.printf("内存使用率: %.2f%%\n", (totalMem - availMem) * 100.0 / totalMem);
        
        System.out.println("\n========== 硬盘信息 ==========");
        hal.getFileSystem().getFileStores().forEach(fs -> {
            System.out.println("分区: " + 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 执行系统命令

如果不想引入第三方库,可以通过执行系统命令来获取信息。

Windows 示例

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class CommandInfo {
    public static void main(String[] args) {
        // 获取 CPU 信息
        executeCommand("wmic cpu get name");
        
        // 获取内存信息
        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");

// 内存信息
executeCommand("cat /proc/meminfo | grep MemTotal");

// 硬盘信息
executeCommand("df -h");

总结

方法优点缺点
Java 原生 API无需额外依赖信息有限,部分 API 非标准
OSHI 库跨平台,信息全面,易于使用需要引入第三方依赖
执行系统命令能获取任意信息平台相关,解析复杂,性能较差

推荐使用 OSHI 库,它封装了底层细节,提供了统一的跨平台 API,能获取最全面的系统信息。

到此这篇关于Java一键获取(CPU、内存、硬盘、操作系统)系统信息的文章就介绍到这了,更多相关Java获取系统信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java模拟ajax访问另一个项目的controller代码实例

    java模拟ajax访问另一个项目的controller代码实例

    今天小编就为大家分享一篇关于java模拟ajax访问另一个项目的controller代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 通过案例了解静态修饰符static使用场景

    通过案例了解静态修饰符static使用场景

    这篇文章主要介绍了通过案例了解静态修饰符static使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java substring原理及使用方法实例

    Java substring原理及使用方法实例

    这篇文章主要介绍了Java substring原理及使用方法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • idea 实现git rebase操作应用场景

    idea 实现git rebase操作应用场景

    本文结合idea工具进行rebase的各种场景的操作,借助工具更能直观地观察到分支之间地操作差异,方便我们理解rebase的各种操作以及场景的使用,对idea  git rebase操作知识感兴趣的朋友一起看看吧
    2024-01-01
  • springboot序列化和反序列化器配置方法

    springboot序列化和反序列化器配置方法

    这篇文章主要介绍了springboot序列化和反序列化器配置方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • nacos修改druid配置自动刷新后服务异常的问题

    nacos修改druid配置自动刷新后服务异常的问题

    这篇文章主要介绍了nacos修改druid配置自动刷新后服务异常的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Mac电脑安装多个JDK版本的详细图文教程

    Mac电脑安装多个JDK版本的详细图文教程

    目前使用的主流版本还是JDK 8,但偶尔会想体验下新版本(或者旧版本),如果能装多个版本的JDK,而且很方便的切换就好了,这篇文章主要给大家介绍了关于Mac电脑安装多个JDK版本的相关资料,需要的朋友可以参考下
    2024-03-03
  • selenium+java破解极验滑动验证码的示例代码

    selenium+java破解极验滑动验证码的示例代码

    本篇文章主要介绍了selenium+java破解极验滑动验证码的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java中byte输出write到文件的实现方法讲解

    Java中byte输出write到文件的实现方法讲解

    今天小编就为大家分享一篇关于Java中byte输出write到文件的实现方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java程序部署到服务器上,接口请求下载文件失败/文件为空/文件名不对的问题

    Java程序部署到服务器上,接口请求下载文件失败/文件为空/文件名不对的问题

    这篇文章主要介绍了Java程序部署到服务器上,接口请求下载文件失败/文件为空/文件名不对,本文给大家分享错误原因及解决方法,需要的朋友可以参考下
    2020-07-07

最新评论