OSHI可以获取系统信息(CPU、内存、磁盘、网络等),纯Java实现(通过JNA访问本地API,无需安装本地库),跨平台支持。

引入依赖

<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.6.5</version>
</dependency>

编写测试用例

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import oshi.SystemInfo;
import oshi.hardware.*;
import oshi.software.os.OSProcess;
import oshi.software.os.OperatingSystem;import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;@Slf4j
public class ResourceMonitorTest {@Testpublic void testGetResource() {// 获取系统信息SystemInfo si = new SystemInfo();// 获取硬件抽象层HardwareAbstractionLayer hardware = si.getHardware();log.info("===============================CPU信息===============================");CentralProcessor processor = hardware.getProcessor();CentralProcessor.ProcessorIdentifier processorIdentifier = processor.getProcessorIdentifier();String processorName = processorIdentifier.getName();log.info("CPU 名称: {}", processorName);String vendor = processorIdentifier.getVendor();log.info("CPU 供应商: {}", vendor);long cpuFreq = processorIdentifier.getVendorFreq();log.info("CPU 频率: {}", cpuFreq);int logicalProcessorCount = processor.getLogicalProcessorCount();log.info("CPU 核心数: {}", logicalProcessorCount);int physicalProcessorCount = processor.getPhysicalProcessorCount();log.info("CPU 物理核心数: {}", physicalProcessorCount);// CPU 负载 (最近1/5/15分钟)double[] loadAverage = processor.getSystemLoadAverage(3);log.info("CPU 负载: {}", loadAverage[0]);log.info("===============================实时 CPU 使用率===============================");// 第一次调用获取 tickslong[] prevTicks = processor.getSystemCpuLoadTicks();// 等待1秒try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 第二次调用计算使用率long[] ticks = processor.getSystemCpuLoadTicks();long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];log.info("应用程序CPU使用率:{}", user);long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];log.info("应用程序优先CPU使用率:{}", nice);long sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];log.info("系统程序CPU使用率:{}", sys);long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];log.info("CPU空闲时间:{}", idle);long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];log.info("CPU等待率:{}", iowait);long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];log.info("CPU中断率:{}", irq);long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];log.info("CPU软中断率:{}", softirq);long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];log.info("CPU抢占率:{}", steal);long totalCpu = user + nice + sys + idle + iowait + irq + softirq + steal;log.info("CPU总使用率:{}", totalCpu);// 计算各状态百分比double cpuUsage = 100d * (totalCpu - idle) / totalCpu;log.info("CPU使用率:{}", cpuUsage);double ioWaitPercent = 100d * iowait / totalCpu;log.info("IO等待使用率:{}", ioWaitPercent);log.info("===============================内存信息===============================");GlobalMemory memory = hardware.getMemory();double gbNum = 1024.0 * 1024.0 * 1024.0;// 总内存 (bytes)long totalMemory = memory.getTotal();BigDecimal totalMemoryDec = new BigDecimal(totalMemory / gbNum).setScale(2, RoundingMode.HALF_UP);log.info("总内存:{}GB", totalMemoryDec);// 可用内存 (bytes)long availableMemory = memory.getAvailable();BigDecimal availableMemoryDec = new BigDecimal(availableMemory / gbNum).setScale(2, RoundingMode.HALF_UP);log.info("可用内存:{}GB", availableMemoryDec);// 已用内存 (bytes)long usedMemory = totalMemory - availableMemory;BigDecimal usedMemoryDec = new BigDecimal(usedMemory / gbNum).setScale(2, RoundingMode.HALF_UP);log.info("已用内存:{}GB", usedMemoryDec);// 交换空间信息long totalSwap = memory.getVirtualMemory().getSwapTotal();BigDecimal totalSwapDec = new BigDecimal(totalSwap / gbNum).setScale(2, RoundingMode.HALF_UP);log.info("总交换空间:{}GB", totalSwapDec);long usedSwap = memory.getVirtualMemory().getSwapUsed();BigDecimal usedSwapDec = new BigDecimal(usedSwap / gbNum).setScale(2, RoundingMode.HALF_UP);log.info("已用交换空间:{}GB", usedSwapDec);// 内存使用率double memoryUsagePercent = 100d * usedMemory / totalMemory;BigDecimal memoryUsagePercentDec = new BigDecimal(memoryUsagePercent / gbNum).setScale(2, RoundingMode.HALF_UP);log.info("内存使用率:{}%", memoryUsagePercentDec);log.info("===============================磁盘设备信息===============================");List<HWDiskStore> diskStores = hardware.getDiskStores();for (HWDiskStore disk : diskStores) {String name = disk.getName();String model = disk.getModel();log.info("磁盘:{},磁盘型号:{}", name, model);long size = disk.getSize();BigDecimal sizeDec = new BigDecimal(size / gbNum).setScale(2, RoundingMode.HALF_UP);log.info("磁盘:{},磁盘大小:{}GB", name, sizeDec);long reads = disk.getReads();log.info("磁盘:{},读取次数:{}", name, reads);long readBytes = disk.getReadBytes();log.info("磁盘:{},读取字节数:{}", name, readBytes);long writes = disk.getWrites();log.info("磁盘:{},写入次数:{}", name, writes);long writeBytes = disk.getWriteBytes();log.info("磁盘:{},写入字节数:{}", name, writeBytes);long transferTime = disk.getTransferTime();log.info("磁盘:{},传输时间:{}", name, transferTime);}log.info("===============================网络接口信息===============================");List<NetworkIF> networkIFs = hardware.getNetworkIFs();for (NetworkIF net : networkIFs) {String name = net.getName();String displayName = net.getDisplayName();log.info("网络接口:{},显示名称:{}", name, displayName);String mac = net.getMacaddr();log.info("网络接口:{},MAC地址:{}", name, mac);long mtu = net.getMTU();log.info("网络接口:{},MTU值:{}", name, mtu);long speed = net.getSpeed();log.info("网络接口:{},网卡速度:{}", name, speed);String[] ipv4 = net.getIPv4addr();log.info("网络接口:{},IPv4 地址:{}", name, ipv4);String[] ipv6 = net.getIPv6addr();log.info("网络接口:{},IPv6 地址:{}", name, ipv6);}// 第一次获取数据long bytesRecv = 0L;long bytesSent = 0L;for (NetworkIF net : networkIFs) {net.updateAttributes();bytesRecv = net.getBytesRecv();bytesSent = net.getBytesSent();long packetsRecv = net.getPacketsRecv();long packetsSent = net.getPacketsSent();}// 等待1秒try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 第二次获取并计算速率for (NetworkIF net : networkIFs) {net.updateAttributes();long newRecv = net.getBytesRecv();long newSent = net.getBytesSent();// 计算每秒接收/发送的字节数long recvRate = newRecv - bytesRecv;long sentRate = newSent - bytesSent;log.info("网卡 {} 接收 {} 字节/秒, 发送 {} 字节/秒", net.getName(), recvRate, sentRate);}log.info("===============================操作系统信息===============================");OperatingSystem os = si.getOperatingSystem();String family = os.getFamily();log.info("操作系统 {}", family);String manufacturer = os.getManufacturer();log.info("操作系统制造商 {}", manufacturer);OperatingSystem.OSVersionInfo versionInfo = os.getVersionInfo();log.info("操作系统版本 {}", versionInfo.toString());long uptime = os.getSystemUptime();log.info("系统启动时间 {}", uptime);int processCount = os.getProcessCount();log.info("进程数量 {}", processCount);int threadCount = os.getThreadCount();log.info("线程数量 {}", threadCount);OSProcess currentProcess = os.getProcess(os.getProcessId());log.info("当前进程 {}", currentProcess.getName());long processMemory = currentProcess.getResidentSetSize();log.info("进程内存占用 {}", processMemory);double processCpuLoad = currentProcess.getProcessCpuLoadBetweenTicks(currentProcess);log.info("进程CPU使用率 {}", processCpuLoad);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89009.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89009.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/89009.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业数字化资产管理安全、成本、协作困局难解?

在数字化浪潮席卷全球的今天&#xff0c;3D技术已成为驱动影视动画、工业设计、建筑可视化等领域创新的核心动力。然而&#xff0c;随着3D资产规模呈指数级增长&#xff0c;企业正面临前所未有的管理挑战&#xff1a;海量模型存储混乱、版本迭代难以追溯、团队协作效率低下、知…

力扣面试150题--组合总和

Day 72 题目描述&#xff08;终于理顺回溯了&#xff09;思路 这里还是基于模板来说明代码思路void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择 : 本层集合中的元素) {处理节点;backtracking(路径, 选择列表); // 递归撤销处理; // 回溯} }对于主要函数的…

多客户端-服务器(select,poll)

多客户端-服务器结构总结一、普通CS架构的局限性核心问题&#xff1a;单线程中accept&#xff08;阻塞等待连接&#xff09;与read&#xff08;阻塞读取数据&#xff09;函数互相干扰&#xff0c;无法同时处理多客户端。本质原因&#xff1a;阻塞型函数需独立执行&#xff0c;若…

如何使用postman做接口测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 常用的接口测试工具主要有以下几种&#xff1a;Postman: 简单方便的接口调试工具&#xff0c;便于分享和协作。具有接口调试&#xff0c;接口集管理&#xff0c…

新型网络架构设计助力智慧医疗降本增效

随着智慧医疗的快速发展,越来越多的医院开始布局“互联网+医疗”服务,通过数字化手段提升医疗服务效率。然而,如何构建一个既稳定可靠又具备灵活扩展能力的医疗网络,成为医院数字化转型中的关键问题。本文以某智慧医疗项目为例,探讨传统网络与SD-WAN结合的最佳实践。 背景…

一文读懂现代卷积神经网络—使用块的网络(VGG)

目录 什么是使用块的网络&#xff08;VGG&#xff09;&#xff1f; 一、VGG 的核心思想&#xff1a;用块&#xff08;Block&#xff09;构建网络 二、VGG 的网络结构 三、VGG 的优势 1. 结构简洁统一 2. 强大的特征表达能力 3. 小卷积核的计算效率 4. 良好的迁移学习性…

Linux的相关学习

linux 1.文件权限怎么修改 chmod [权限模式] [文件或目录]1、**数字模式&#xff08;八进制&#xff09;**&#xff1a; chmod 755 myfile.sh # 所有者&#xff1a;rwx (7)&#xff0c;组&#xff1a;r-x (5)&#xff0c;其他用户&#xff1a;r-x (5) 7 rwx&#xff08;读写…

Kotlin集合接口

Kotlin 集合概述 Kotlin 集合提供了对数据进行各种操作的便捷方式。它们实现了接口&#xff0c;因此可以操作不同类型的数据。例如&#xff0c;你可以编写一个函数&#xff0c;同时打印 Set 和 List 的所有元素。我们来看看这是如何实现的。Iterable 接口 我们已经知道&#xf…

Git 常用操作与注意事项全攻略

1. 基本配置 git config --global user.name "你的名字" git config --global user.email "你的邮箱" git config --list # 查看当前配置建议全局配置用户名和邮箱&#xff0c;否则提交记录可能不规范2.仓库操作 初始化本地仓库 git init只在新建项目时使…

STM32-第五节-TIM定时器-1(定时器中断)

一、定时器原理&#xff1a;1.介绍&#xff1a;对指定输入时钟进行计数&#xff0c;并在计数值达到设定值时触发中断。分类&#xff1a;基本定时器&#xff0c;通用定时器&#xff0c;高级定时器频率&#xff1a;72MHZ2.框图&#xff1a; &#xff08;1&#xff09;基本定时器&…

【图像处理基石】什么是色盲仿真技术?

色盲仿真概述 色盲仿真是一种将正常色彩图像转换为色盲患者感知效果的技术。人类常见的色盲类型包括&#xff1a; 红色盲&#xff08;Protanopia&#xff09;&#xff1a;无法感知红色绿色盲&#xff08;Deuteranopia&#xff09;&#xff1a;无法感知绿色蓝黄色盲&#xff08;…

九、官方人格提示词汇总(中-3)

“参谋代写计划”功能输出欣赏&#xff0c;规则&#xff1a; 本部分统一使用 Gemini 2.5 Pro API。该 API 下的输出质量基本达到我的要求&#xff0c;已具备实用价值。严格等级均为“权衡有度&#xff08;L3&#xff09;”&#xff0c;创造力等级均为“趋势捕手&#xff08;L3…

华为MateBook D 16 SE版 2024款 12代酷睿版i5集显(MCLF-XX,MCLF-16)原厂OEM预装Win11系统

适用型号&#xff1a;MCLF-XX,MCLF-16链接&#xff1a;https://pan.baidu.com/s/1OkvUqZMdCSF98YtQfWAYXw?pwdq2gh 提取码&#xff1a;q2gh 华为开箱状态出厂Windows11系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、华为电脑…

Python自动化:每日销售数据可视化

这是手动执行sql分组查出的Linda奶茶店每日的销售数据,那么能否图形化展示方便对比近一个月每日的销售趋势呢。如果是做在网站里,前端可以集成echart或highchart生成柱状图或线状图。如果需要每天定时推送这些数据到邮箱或其他消息通知渠道,第一步肯定是需要先生成图片到服务…

scrapy项目开发流程

1.创建项目&#xff1a;scrapy startproject mySpider2.生成一个爬虫&#xff1a;scrapy genspider itcast itcast.cn3.提取数据&#xff1a;根据网站结构在spider中实现数据采集相关内容4.保存数据使用pipeline进行数据后续处理和保存1.创建项目items.py-->自己预计需要爬取…

堆排序以及其插入删除

堆排序首先介绍一下堆排序属于选择排序的一种类型。其次就是他有点依赖于顺序存储树判断其孩子以及父节点的概念&#xff0c;接下来复习一下。堆分为大根堆和小根堆① 若满⾜&#xff1a;L(i)≥L(2i)且L(i)≥L(2i1) &#xff08;1 ≤ i ≤n/2 &#xff09;—— ⼤根堆&#xff…

Spring Boot项目结构解析:构建高效、清晰的代码框架

在当今的软件开发领域&#xff0c;Spring Boot因其简洁性和强大的功能而备受青睐。它不仅简化了Spring框架的配置&#xff0c;还提供了一套高效的项目开发模式。本文将深入探讨Spring Boot项目结构中的关键组件&#xff0c;包括PO、Query、VO、Config等&#xff0c;旨在帮助开发…

多客户端 - 服务器结构-实操

实现2个客户端之间互相聊天 要求&#xff1a; 1、服务器使用 select 模型实现接受多个客户端连接&#xff0c;以及转发消息 2、客户端要求&#xff1a;使用 poll 模型解决 技能够 read 读取服务器发来的消息&#xff0c;又能够scanf读取键盘输入的信息 3、客户端服务器不允许开…

iOS高级开发工程师面试——Objective-C 语言特性

iOS高级开发工程师面试——Objective-C 语言特性 一、多态二、继承三、代理(Delegate)1. 代理为什么用 weak 修饰呢?block和代理的区别?四、通知(NSNotificationCenter)五、KVC (Key-value Coding)六、属性七、`@property` [ˈprɒpəti]的本质是什么?ivar 、 setter …

MMpretrain 中的 LinearClsHead 结构与优化

LinearClsHead 结构与优化 一、LinearClsHead 核心结构 在 MMPretrain 中&#xff0c;LinearClsHead 是一个简洁高效的分类头&#xff0c;其核心结构如下&#xff1a; class LinearClsHead(BaseModule):def __init__(self,num_classes, # 类别数量in_channels, # 输入…