Springboot+ OSHI 进行系统监控
核心优势跨平台支持兼容 Windows、macOS、Linux 等主流操作系统深度系统洞察提供 CPU、内存、磁盘、传感器、网络等详细信息零原生依赖纯 Java 实现无需安装额外组件轻量易用只需添加一个依赖即可快速集成✅ 使用 OSHI 可以轻松获取以下系统信息操作系统详情名称、版本、架构、运行时间CPU 监控使用率、核心数、处理器速度内存统计总内存、可用内存、交换分区使用情况磁盘信息分区详情、读写速度网络数据接口信息、IP 地址、带宽使用传感器数据CPU 温度、风扇转速、电压需硬件支持项目集成引入依赖dependency groupIdcom.github.oshi/groupId artifactIdoshi-core/artifactId version6.x.x/version /dependency编写工具类/** * 服务器信息采集工具类 */ public class ServerMonitorUtil { private static final SystemInfo SYSTEM_INFO new SystemInfo(); private static final HardwareAbstractionLayer HARDWARE SYSTEM_INFO.getHardware(); private static final OperatingSystem OS SYSTEM_INFO.getOperatingSystem(); private static final DecimalFormat DF new DecimalFormat(#.00); /** * 获取完整服务器信息 */ public static SystemMonitorRespVO getServerInfo() { SystemMonitorRespVO serverInfo new SystemMonitorRespVO(); // 1. CPU 信息 serverInfo.setCpu(getCpuInfo()); // 2. 内存信息 serverInfo.setMem(getMemInfo()); // 3. 系统信息 serverInfo.setSys(getSysInfo()); // 4. JVM 信息 serverInfo.setPy(getJvmInfo()); // 5. 磁盘信息 serverInfo.setDisks(getDiskInfo()); return serverInfo; } /** * 获取 CPU 信息 */ private static CpuInfoRespVO getCpuInfo() { CpuInfoRespVO cpu new CpuInfoRespVO(); CentralProcessor processor HARDWARE.getProcessor(); // 总核心数 cpu.setCpuNum(processor.getLogicalProcessorCount()); // CPU 使用率采集 3 秒内数据 long[] prevTicks processor.getSystemCpuLoadTicks(); try { Thread.sleep(3000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } long[] ticks processor.getSystemCpuLoadTicks(); long user ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; long sys ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; long idle ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; long total user sys idle; // 使用率保留 1 位小数 cpu.setUsed(NumberUtil.round(100.0 * user / total, 1).doubleValue()); cpu.setSys(NumberUtil.round(100.0 * sys / total, 1).doubleValue()); cpu.setFree(NumberUtil.round(100.0 * idle / total, 1).doubleValue()); return cpu; } /** * 获取系统内存信息 */ private static MemoryRespVO getMemInfo() { MemoryRespVO mem new MemoryRespVO(); GlobalMemory memory HARDWARE.getMemory(); // 总内存字节转 GB long total memory.getTotal(); // 已用内存 long used total - memory.getAvailable(); // 使用率 double usage NumberUtil.round(100.0 * used / total, 1).doubleValue(); // 格式化显示如 16.00 GB mem.setTotal(formatByte(total)); mem.setUsed(formatByte(used)); mem.setFree(formatByte(memory.getAvailable())); mem.setUsage(usage); return mem; } /** * 获取系统基础信息 */ private static SystemInfoRespVO getSysInfo() { SystemInfoRespVO sys new SystemInfoRespVO(); // 服务器名称 sys.setComputerName(OS.getFamily()); // 操作系统 sys.setOsName(OS.getFamily() OS.getVersionInfo().getVersion()); // 系统架构 sys.setOsArch(System.getProperty(os.arch)); // 服务器IP try { sys.setComputerIp(InetAddress.getLocalHost().getHostAddress()); } catch (UnknownHostException e) { sys.setComputerIp(未知); } // 项目运行路径 sys.setUserDir(System.getProperty(user.dir)); return sys; } /** * 获取 JVM 信息 */ private static JvmInfoRespVO getJvmInfo() { JvmInfoRespVO jvm new JvmInfoRespVO(); Properties props System.getProperties(); // JVM 名称 版本 jvm.setName(props.getProperty(java.vm.name)); jvm.setVersion(props.getProperty(java.version)); // Java 安装路径 jvm.setHome(props.getProperty(java.home)); // JVM 启动时间 long startTime ManagementFactory.getRuntimeMXBean().getStartTime(); jvm.setStartTime(DateUtil.formatDateTime(DateUtil.date(startTime))); // 运行时长 long runTime System.currentTimeMillis() - startTime; jvm.setRunTime(formatTime(runTime)); // JVM 内存信息 Runtime runtime Runtime.getRuntime(); // 总内存 long totalMem runtime.totalMemory(); // 已用内存 long usedMem totalMem - runtime.freeMemory(); // 使用率 double usage NumberUtil.round(100.0 * usedMem / runtime.maxMemory(), 1).doubleValue(); jvm.setMemoryTotal(formatByte(totalMem)); jvm.setMemoryUsed(formatByte(usedMem)); jvm.setFree(formatByte(runtime.freeMemory())); jvm.setMemoryUsage(usage); return jvm; } /** * 获取磁盘信息 */ private static ListDiskInfoRespVO getDiskInfo() { ListDiskInfoRespVO diskList new ArrayList(); FileSystem fileSystem OS.getFileSystem(); ListOSFileStore fileStores fileSystem.getFileStores(); for (OSFileStore store : fileStores) { // 过滤无效磁盘如临时盘、大小为0的盘 if (store.getTotalSpace() 0) { continue; } DiskInfoRespVO disk new DiskInfoRespVO(); // 盘符路径 disk.setDirName(store.getMount()); // 文件系统类型 disk.setSysTypeName(store.getType()); // 盘符名称 disk.setTypeName(store.getName()); // 总大小 long total store.getTotalSpace(); // 可用大小 long free store.getUsableSpace(); // 已用大小 long used total - free; // 使用率保留 1 位小数转字符串 double usage NumberUtil.round(100.0 * used / total, 1).doubleValue(); disk.setUsage(DF.format(usage)); // 格式化大小 disk.setTotal(formatByte(total)); disk.setFree(formatByte(free)); disk.setUsed(formatByte(used)); diskList.add(disk); } return diskList; } /** * 字节数格式化转 GB/MB/KB */ private static String formatByte(long bytes) { if (bytes 1024) { return bytes B; } else if (bytes 1024 * 1024) { return DF.format(bytes / 1024.0) KB; } else if (bytes 1024 * 1024 * 1024) { return DF.format(bytes / (1024.0 * 1024)) MB; } else { return DF.format(bytes / (1024.0 * 1024 * 1024)) GB; } } /** * 毫秒数格式化转 天-时-分-秒 */ private static String formatTime(long ms) { long days ms / (1000 * 60 * 60 * 24); long hours (ms % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); long minutes (ms % (1000 * 60 * 60)) / (1000 * 60); long seconds (ms % (1000 * 60)) / 1000; StringBuilder sb new StringBuilder(); if (days 0) { sb.append(days).append(天); } if (hours 0) { sb.append(hours).append(时); } if (minutes 0) { sb.append(minutes).append(分); } sb.append(seconds).append(秒); return sb.toString(); } }编写前端页面略编写后端业务略总结OSHI 是一个功能强大且轻量级的 Java 系统监控库。建议采用专业的应用监控中间件如夜莺、Prometheus Grafana等。

相关新闻

HarmonyOS中的路由跳转该怎么设计?Router和Navigation应该使用哪个呢?

HarmonyOS中的路由跳转该怎么设计?Router和Navigation应该使用哪个呢?

本问答帖原创发布在华为开发者联盟社区 ,欢迎开发者前往论坛提问交流。 问题描述: 在HarmonyOS中,如何实现模块间与模块内页面的跳转?Router和Navigation的使用场景是什么? 解决方案: HarmonyOS提供了两…

2026/5/17 4:22:22 阅读更多 →
Canvas绘制内容怎么更新?

Canvas绘制内容怎么更新?

本问答帖原创发布在华为开发者联盟社区 ,欢迎开发者前往论坛提问交流。 问题描述: Canvas的绘制内容怎么更新呢? 解决方案: 对于Canvas组件,只要调用绘制接口就会触发刷新。 对于Canvas组件上的图像,已经…

2026/7/5 0:14:29 阅读更多 →
Swiper组件如何实现中间高两边低的效果,前后两个组件的高度如何设置呢?

Swiper组件如何实现中间高两边低的效果,前后两个组件的高度如何设置呢?

本问答帖原创发布在华为开发者联盟社区 ,欢迎开发者前往论坛提问交流。 问题描述: 如何实现图示效果,在Swiper中将左右两个图片的高度进行缩小? 解决方案: 可以通过调整图片缩放属性scale来调整两侧图片的高度&…

2026/7/4 14:52:12 阅读更多 →

最新新闻

NestOS-Config核心架构解析:深入理解rpm-ostree与ignition配置

NestOS-Config核心架构解析:深入理解rpm-ostree与ignition配置

NestOS-Config核心架构解析:深入理解rpm-ostree与ignition配置 【免费下载链接】nestos-config nestos-config provides base manifest configuration for building NestOS. 项目地址: https://gitcode.com/openeuler/nestos-config 前往项目官网免费下载&am…

2026/7/5 8:04:16 阅读更多 →
ExtFUSE社区贡献指南:如何参与这个开源文件系统革命

ExtFUSE社区贡献指南:如何参与这个开源文件系统革命

ExtFUSE社区贡献指南:如何参与这个开源文件系统革命 【免费下载链接】extfuse Extension Framework for FUSE 项目地址: https://gitcode.com/openeuler/extfuse 前往项目官网免费下载:https://ar.openeuler.org/ar/ ExtFUSE(Extensi…

2026/7/5 8:00:16 阅读更多 →
如何让英雄联盟游戏体验提升3倍?探索LeagueAkari的智能辅助革命

如何让英雄联盟游戏体验提升3倍?探索LeagueAkari的智能辅助革命

如何让英雄联盟游戏体验提升3倍?探索LeagueAkari的智能辅助革命 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾因错过对局…

2026/7/5 8:00:16 阅读更多 →
OpenEuler SONIC内核补丁与标准Linux内核的7个主要差异:网络性能优化终极指南

OpenEuler SONIC内核补丁与标准Linux内核的7个主要差异:网络性能优化终极指南

OpenEuler SONIC内核补丁与标准Linux内核的7个主要差异:网络性能优化终极指南 【免费下载链接】sonic-linux-kernel The OpenEuler kernel patches used with SONIC 项目地址: https://gitcode.com/openeuler/sonic-linux-kernel 前往项目官网免费下载&#…

2026/7/5 8:00:16 阅读更多 →
如何轻松获取高质量音乐:六音音源修复版完整使用指南

如何轻松获取高质量音乐:六音音源修复版完整使用指南

如何轻松获取高质量音乐:六音音源修复版完整使用指南 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 想要免费享受高品质音乐吗?六音音源修复版为你提供了完美的解决方案&…

2026/7/5 7:58:16 阅读更多 →
全自动PACK生产线技术解析:嘉洛智能源头直供的智造方案

全自动PACK生产线技术解析:嘉洛智能源头直供的智造方案

随着新能源汽车与储能产业的爆发式增长,动力电池与储能电池的需求呈现井喷态势。作为连接电芯与终端应用的关键环节,电池模组PACK生产线的自动化与智能化水平,直接决定了整个生产体系的成本效率、产品品质与交付能力。面对市场上琳琅满目的设…

2026/7/5 7:58:16 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻