0

0

OSHI Java库:跨平台系统与硬件信息采集神器

絕刀狂花

絕刀狂花

发布时间:2025-07-01 09:58:29

|

706人浏览过

|

来源于php中文网

原创

oshi java库:跨平台系统与硬件信息采集神器

OSHI(操作系统和硬件信息)是一个免费的开源 Java 库,用于获取系统信息,如 CPU、内存、磁盘、网络和操作系统详情。它作为跨平台的替代方案,替代了特定于平台的监控工具,抽象了底层操作系统级别的 API。让我们深入了解如何使用 Java OSHI 以平台无关的方式收集系统级信息。

1. OSHI 是什么?

OSHI 代表操作系统和硬件信息。它利用 Java 原生访问(JNA)与原生系统 API 交互,使其能够在多个操作系统上无缝运行,而无需编译原生代码。

1.1 主要特点

OSHI 因其便携性、易用性以及对外部二进制文件的零依赖而脱颖而出。以下是一些主要亮点:

立即学习Java免费学习笔记(深入)”;

支持 Windows、macOS、Linux 和 Solaris 等跨平台使用 JNA 的纯 Java 实现,无需原生代码轻量级且易于集成到现有 Java 应用中在 GitHub 上拥有活跃的社区和频繁的更新1.2 优势

对于使用 Java 的开发人员和 DevOps 工程师,OSHI 带来了诸多优势:

无需外部二进制文件或特定于平台的代理 —— 只需添加依赖即可开始使用统一的跨平台 API,抽象了操作系统特定的细微差别非常适合系统监控仪表板、日志代理和健康检查模块内置支持获取 CPU 使用率、内存、磁盘 I/O 和网络接口等指标1.3 限制

尽管功能丰富,但开发人员应了解 OSHI 的一些限制:

性能:由于 JNA 开销,可能比直接使用特定于平台的原生 API 更慢API 可变性:依赖底层原生 API,这些 API 可能因操作系统版本和配置而异只读:OSHI 主要提供对系统数据的只读访问权限(无法执行控制操作,如重启服务)1.4 为何使用 OSHI 进行系统监控?

对于使用 Java 构建跨平台监控解决方案的开发人员,OSHI 是首选。原因如下:

钛投标
钛投标

钛投标 | 全年免费 | 不限字数 | AI标书智写工具

下载
简单性:消除了对特定于操作系统的脚本或工具(如 topvmstatiostat)的需求集成性:可以轻松地嵌入到 Spring Boot 应用、JavaFX 仪表板或基于 CLI 的工具中可扩展性:提供关于 CPU、内存、磁盘、网络接口、进程、传感器等的详细信息2. 代码示例

本部分提供了将 OSHI 库集成到 Java 项目的完整指南,包括依赖设置、系统监控逻辑的实现以及对输出结果的解读。

2.1 添加依赖(pom.xml)

要在项目中开始使用 OSHI,必须首先将所需依赖添加到 pom.xml 文件中。这使 Maven 能够获取并包含 OSHI 核心库到构建路径中。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript"><dependency>  <groupId>com.github.oshi</groupId>  <artifactId>oshi-core</artifactId>  <version>latest__jar__version</version></dependency></code>
2.2 Java 代码

添加依赖后,可以编写利用 OSHI 获取实时硬件和软件指标的 Java 代码。以下代码片段演示了如何访问和显示系统信息。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">import oshi.SystemInfo;import oshi.hardware.CentralProcessor;import oshi.hardware.ComputerSystem;import oshi.hardware.GlobalMemory;import oshi.hardware.HWDiskStore;import oshi.hardware.NetworkIF;import oshi.hardware.Sensors;import oshi.software.os.OperatingSystem;import oshi.software.os.OSProcess;import java.util.List;import java.util.concurrent.TimeUnit;/** * OshiSystemMonitor 演示了如何使用 OSHI 库来检索和显示详细的系统信息,包括操作系统详情、CPU 使用率、内存统计、磁盘信息、网络接口、运行进程和传感器数据。 */publicclass OshiSystemMonitor {    /**     * 主方法用于运行系统监控程序。     * 它打印操作系统的硬件详情、1 秒内的 CPU 使用率、内存使用率、磁盘详情、网络接口统计信息、运行进程和传感器信息。     *     * @param args 命令行参数(未使用)     * @throws InterruptedException 如果在计算 CPU 负载时线程休眠被中断     */    public static void main(String[] args) throws InterruptedException {        // 初始化 SystemInfo 对象以访问硬件和操作系统信息        SystemInfo systemInfo = new SystemInfo();        // 获取基本的操作系统和计算机系统信息        OperatingSystem os = systemInfo.getOperatingSystem();        ComputerSystem cs = systemInfo.getHardware().getComputerSystem();        System.out.println("=== 基本系统信息 ===");        System.out.println("操作系统:" + os);        System.out.println("制造商:" + cs.getManufacturer());        System.out.println("型号:" + cs.getModel());        System.out.println("序列号:" + cs.getSerialNumber());        // 获取处理器信息以监控 CPU        CentralProcessor processor = systemInfo.getHardware().getProcessor();        System.out.println("
=== CPU 信息 ===");        System.out.println("CPU:" + processor.getProcessorIdentifier().getName());        // 捕获 CPU 刻度以测量 1 秒内的 CPU 负载        long[] prevTicks = processor.getSystemCpuLoadTicks();        // 休眠 1 秒以计算两次刻度之间的 CPU 使用率        TimeUnit.SECONDS.sleep(1);        // 计算两组刻度之间的 CPU 使用率百分比        double cpuLoad = processor.getSystemCpuLoadBetweenTicks(prevTicks) * 100;        System.out.printf("CPU 使用率:%.2f%%
", cpuLoad);        // 获取内存信息以计算总内存、已用内存和空闲内存        GlobalMemory memory = systemInfo.getHardware().getMemory();        long total = memory.getTotal();        long available = memory.getAvailable();        long used = total - available;        System.out.println("
=== 内存信息 ===");        System.out.println("总内存:" + (total / 1024 / 1024) + " MB");        System.out.println("已用内存:" + (used / 1024 / 1024) + " MB");        System.out.println("空闲内存:" + (available / 1024 / 1024) + " MB");        // 磁盘信息        System.out.println("
=== 磁盘信息 ===");        List<HWDiskStore> diskStores = systemInfo.getHardware().getDiskStores();        for (HWDiskStore disk : diskStores) {            System.out.println("磁盘名称:" + disk.getName());            System.out.println("型号:" + disk.getModel());            System.out.println("序列号:" + disk.getSerial());            System.out.println("大小:" + (disk.getSize() / 1024 / 1024 / 1024) + " GB");            System.out.println("读取次数:" + disk.getReads());            System.out.println("写入次数:" + disk.getWrites());            System.out.println("已读取字节数:" + disk.getReadBytes());            System.out.println("已写入字节数:" + disk.getWriteBytes());            System.out.println();        }        // 网络接口信息        System.out.println("
=== 网络接口 ===");        List<NetworkIF> networkIFs = systemInfo.getHardware().getNetworkIFs();        for (NetworkIF net : networkIFs) {            net.updateAttributes(); // 刷新接口统计信息            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("已发送字节数:" + net.getBytesSent());            System.out.println("已接收字节数:" + net.getBytesRecv());            System.out.println("已发送数据包数:" + net.getPacketsSent());            System.out.println("已接收数据包数:" + net.getPacketsRecv());            System.out.println();        }        // 进程信息(按 CPU 使用率排名前 5 的进程)        System.out.println("
=== CPU 使用率排名前 5 的进程 ===");        List<OSProcess> procs = os.getProcesses(5, OperatingSystem.ProcessSort.CPU);        for (OSProcess proc : procs) {            System.out.printf("进程 ID:%d,名称:%s,CPU 使用率:%.2f%%,内存:%d MB
",                    proc.getProcessID(),                    proc.getName(),                    100d * proc.getProcessCpuLoadCumulative(),                    proc.getResidentSetSize() / 1024 / 1024);        }        // 传感器信息        Sensors sensors = systemInfo.getHardware().getSensors();        System.out.println("
=== 传感器信息 ===");        System.out.println("CPU 温度:" + sensors.getCpuTemperature() + " °C");        System.out.println("CPU 风扇转速:" + sensors.getFanSpeeds()[0] + " RPM(如果可用)");        System.out.println("CPU 电压:" + sensors.getCpuVoltage() + " V");    }}</code>
2.2.1 代码解释

OshiSystemMonitor Java 程序利用 OSHI 库以跨平台方式收集和显示全面的系统信息。它首先初始化一个 SystemInfo 对象以访问硬件和操作系统信息,然后打印基本系统数据,如操作系统名称、制造商、型号和序列号。通过捕获 CPU 刻度并在 1 秒前后进行比较,计算实时 CPU 负载百分比来监控 CPU 使用率。然后,它获取内存统计信息,包括总内存、已用内存和空闲内存,并将字节转换为兆字节以便于阅读。通过遍历所有物理磁盘存储来收集磁盘信息,显示其名称、型号、序列号、大小和读写统计信息。同样,网络接口部分列出所有接口及其名称、MAC 地址、IPv4 和 IPv6 地址以及网络流量详情,如发送和接收的字节数和数据包数,并在打印前更新统计信息。对于进程监控,程序按 CPU 使用率获取排名前五的运行进程,显示每个进程的 ID、名称、CPU 负载和内存消耗。最后,它访问硬件传感器以报告 CPU 温度、风扇转速(如果可用)和 CPU 电压,一次性提供系统性能和健康状况的快照。

2.2.2 代码输出

当程序执行时,它会打印有关系统操作系统的硬件、CPU 使用率和内存统计信息的详细信息。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">=== 基本系统信息 ===操作系统:Windows 11 build 22621制造商:Dell Inc.型号:XPS 15 9500序列号:ABC123XYZ=== CPU 信息 ===CPU:Intel(R) Core(TM) i7-10750H CPU @ 2.60GHzCPU 使用率:12.34%=== 内存信息 ===总内存:16384 MB已用内存:7312 MB空闲内存:9072 MB=== 磁盘信息 ===磁盘名称:\.PhysicalDrive0型号:Samsung SSD 970 EVO 1TB序列号:S3Z6NX0M123456大小:931 GB读取次数:123456写入次数:654321已读取字节数:9876543210已写入字节数:1234567890=== 网络接口 ===名称:eth0显示名称:以太网适配器MAC 地址:00-1A-2B-3C-4D-5EIPv4:192.168.1.10IPv6:fe80::1a2b:3c4d:5e6f:7a8b已发送字节数:1234567已接收字节数:7654321已发送数据包数:12345已接收数据包数:54321=== CPU 使用率排名前 5 的进程 ===进程 ID:1234,名称:chrome.exe,CPU 使用率:15.67%,内存:450 MB进程 ID:5678,名称:java.exe,CPU 使用率:10.23%,内存:1200 MB进程 ID:9101,名称:explorer.exe,CPU 使用率:5.45%,内存:200 MB进程 ID:1121,名称:code.exe,CPU 使用率:3.89%,内存:350 MB进程 ID:3141,名称:slack.exe,CPU 使用率:2.15%,内存:150 MB=== 传感器信息 ===CPU 温度:55.0 °CCPU 风扇转速:1200 RPM(如果可用)CPU 电压:1.2 V</code>
3. 总结

OSHI 是一个强大的、易于开发人员使用的 Java 库,用于检索系统信息。无论您是构建监控工具、日志代理还是健康检查仪表板,OSHI 都提供了轻松集成系统级指标的所有功能。凭借无需原生编译和强大的跨平台支持,OSHI 在 Java 生态系统中成为系统自省的可靠工具。

翻译自:https://www.javacodegeeks.com/getting-started-with-oshi.html

项目:https://github.com/oshi/oshi

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

154

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

138

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

408

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

73

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

145

2025.12.22

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

271

2025.12.24

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

32

2026.02.11

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

44

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 10.9万人学习

Java 教程
Java 教程

共578课时 | 78.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号