当前位置: 首页 > news >正文

Java使用OSHI获取服务器信息

        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.dtcms.com/a/274044.html

相关文章:

  • 如何在报表开发工具FastReport .NET 中构建和连接 Firebird 插件?
  • SpringBoot JWT
  • 异步技术:Web 性能优化的核心引擎
  • crmeb多门店对接拉卡拉支付小程序聚合收银台集成全流程详解
  • 电力自动化的通信中枢,为何工业交换机越来越重要?
  • Vue框架之模板语法全面解析
  • [面试] 手写题-爬楼梯,斐波那契数列
  • 揭示张量分析的强大力量:高级研究的基础-AI云计算拓展核心内容
  • 【时时三省】(C语言基础)通过指针引用数组元素
  • 2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛-A题 农业灌溉系统优化
  • 基于kafka的分布式日志收集与实时监控平台(原理,框架)
  • (满满的坑LLAMA3使用申请被拒绝rejected)利用huggingface导入LLAMA3模型
  • 巨人网络持续加强AI工业化管线,Lovart国内版有望协同互补
  • 【每日刷题】加一
  • kubernetes高级调度
  • lodash不支持 Tree Shaking 而 lodash-es可以
  • 可信数据空间(Trusted Data Space)核心能力及行业赋能分析
  • 7.11类
  • 上位机知识篇---端口
  • CSS和CSS3区别对比
  • Day58
  • 深度学习篇---松科TPU部署代码分析
  • 线程邮箱(线程间通信的异步缓存机制)
  • 数据分析师如何构建自己的底层逻辑?
  • 数据结构自学Day5--链表知识总结
  • 基于FP6195的60V宽压输入降压电源方案 - 适用于智能家居模块供电
  • 亚洲零售行业发展趋势洞察
  • P5709 【深基2.习6】Apples Prologue / 苹果和虫子
  • Python—文件操作
  • 从语音识别到智能助手:Voice Agent 的技术进化与交互变革丨Voice Agent 学习笔记