Java 使用oshi获取当前服务器状态cpu、内存、存储等核心信息

文章目录

简介

OSHI 是基于 JNA 的(本地)操作系统和硬件信息库。它不需要安装任何其他额外的本地库,旨在提供一种跨平台的实现来检索系统信息,例如操作系统版本、进程、内存和 CPU 使用率、磁盘和分区、设备、传感器等。

使用 OSHI 可以对应用程序进行监控,可以对应用程序所在的服务器资源进行监控,还可以监控到其他许多指标,如下:

1、计算机系统和固件,底板

2、操作系统和版本 / 内部版本

3、物理(核心)和逻辑(超线程)CPU,处理器组,NUMA 节点

4、系统和每个处理器的负载百分比和滴答计数器

5、CPU 正常运行时间,进程和线程

6、进程正常运行时间,CPU,内存使用率,用户 / 组,命令行

7、已使用 / 可用的物理和虚拟内存

8、挂载的文件系统(类型,可用空间和总空间)

9、磁盘驱动器(型号,序列号,大小)和分区

10、网络接口(IP,带宽输入 / 输出)

11、电池状态(电量百分比,剩余时间,电量使用情况统计信息)

12、连接的显示器(带有 EDID 信息)

13、USB 设备

14、传感器(温度,风扇速度,电压)

支持的平台:

Windows

Linux

macOS

UNIX (AIX, FreeBSD, OpenBSD, Solaris)

相关资料

github 地址:https://github.com/oshi/oshi

API 文档:http://oshi.github.io/oshi/apidocs/

maven依赖

maven 复制代码
       <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
            <version>6.3.2</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.12.1</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna-platform</artifactId>
            <version>5.12.1</version>
        </dependency>

oshi-官方示例

此外,该oshi-demo模块包括一个OshiGui类,它实现了一个基本的 Swing GUI,为在 UI、监控或警报应用程序中使用 OSHI 的潜在可视化提供建议,如下所示。有关基于此方法的更高级 GUI,请参阅MooInfo 项目。

获取CUP信息代码

获取时与windows窗口等查看CUP利用率的信息有差异,本身CUP利用率存在很大的波动。

java 复制代码
public static CpuEntity getCpu() throws InterruptedException {
        SystemInfo systemInfo = new SystemInfo();
        GlobalConfig.set(GlobalConfig.OSHI_OS_WINDOWS_CPU_UTILITY, Boolean.TRUE);
        CentralProcessor processor = systemInfo.getHardware().getProcessor();
        long[] prevTicks = processor.getSystemCpuLoadTicks();
        // 睡眠1s
        TimeUnit.SECONDS.sleep(1);
        long[] ticks = processor.getSystemCpuLoadTicks();
        long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
        long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
        long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
        long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
        long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
        long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
        long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
        long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
        long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
        CpuEntity cpuEntity = new CpuEntity();
        cpuEntity.setSys(new DecimalFormat("#.##").format(cSys * 1.0 / totalCpu));
        cpuEntity.setUser(new DecimalFormat("#.##").format(user * 1.0 / totalCpu));
        cpuEntity.setWait(new DecimalFormat("#.##").format(iowait * 1.0 / totalCpu));
        cpuEntity.setWait(new DecimalFormat("#.##").format(idle * 1.0 / totalCpu));
        //  user + system + nice + iowait + irq + softirq + steal
        long cpuUtilization = user + nice + cSys + iowait + irq + softirq + steal;
        cpuEntity.setCombined(new DecimalFormat("#.##").format((cpuUtilization * 1.0 / totalCpu)*100));
        return cpuEntity;
    }

获取内存信息

java 复制代码
    public static MemoryEntity getMemory() {
        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        MemoryEntity memoryEntity = new MemoryEntity();
        memoryEntity.setMemTotal(osmxb.getTotalPhysicalMemorySize() / 1024 / 1024 / 1024);
        memoryEntity.setMemUsed((osmxb.getTotalPhysicalMemorySize() - osmxb.getFreePhysicalMemorySize()) / 1024 / 1024 / 1024);
        return memoryEntity;
    }

获取磁盘信息

java 复制代码
  			File[] roots = File.listRoots();
            Long useSum = 0l;
            Long totalSum = 0l;
            for (File file : roots) {
                long free = file.getFreeSpace();
                long total = file.getTotalSpace();
                long use = total - free;
                useSum += change(use);
                totalSum += change(total);
            }
相关推荐
数聚天成DeepSData11 小时前
数聚天成 DeepSData 数据价值落地实战指南
java·maven·devops
小小小米粒11 小时前
阿姆达尔定律(Amdahl‘s Law)
java·开发语言
知彼解己11 小时前
Java 版本演进
java·开发语言·spring boot
极客先躯11 小时前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
朱容zr33313312 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
知彼解己12 小时前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse
朱容zr33313312 小时前
请解释“回表”的概念。
java·前端·数据库
不吃辣49012 小时前
vibe coding | 如何做一个 AI 音乐生成工具?
java·人工智能·后端·ai·ai编程
NWU_LK12 小时前
【WebFlux】第八篇 —— 自定义调度器
java
AI人工智能+电脑小能手12 小时前
【大白话说Java面试题 第210题】【10_网络协议篇】第1题:说说 TCP/IP 网络五层模型
java·网络协议·tcp/ip·计算机网络·网络五层模型