【原创】JDK17获取CPU占用率、内存占用率以及堆内存使用情况

前言

我之前一篇文章:

【原创】Java获取CPU占用率、内存占用率最简单的方式_java获取cpu使用率-CSDN博客

这篇文章虽然简单,但是只能针对JDK8,换成现在模块化的JDK后,OperatingSystemMXBean类就无法反射获取其中的信息了,会导致FastJson报错。当然我已经找到了解决方法。

直接上代码

package com.itdct.justtest.test.monitor;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.OperatingSystemMXBean;
import java.text.DecimalFormat;import lombok.extern.slf4j.Slf4j;/*** @author DCTANT* @version 1.0* @date 2024/3/21 11:21:21* @description*/
@Slf4j
public class MonitorServer {private static final long GB = 1024 * 1024 * 1024;private static final long MB = 1024 * 1024;private static final DecimalFormat decimalFormat = new DecimalFormat("0.0");public MonitorInfoModel monitor() {MonitorInfoModel monitorInfoModel = new MonitorInfoModel();MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();long usedHeapMemory = heapMemoryUsage.getUsed();long maxHeapMemory = heapMemoryUsage.getMax();long usedNonHeapMemory = nonHeapMemoryUsage.getUsed();long maxNonHeapMemory = nonHeapMemoryUsage.getMax();String usedHeapMemoryInfo = decimalFormat.format(1.0 * usedHeapMemory / MB) + "MB";String maxHeapMemoryInfo = decimalFormat.format(1.0 * maxHeapMemory / MB) + "MB";String usedNonHeapMemoryInfo = decimalFormat.format(1.0 * usedNonHeapMemory / MB) + "MB";String maxNonHeapMemoryInfo;if (maxNonHeapMemory == -1L) {maxNonHeapMemoryInfo = "-";} else {maxNonHeapMemoryInfo = decimalFormat.format(1.0 * maxNonHeapMemory / MB) + "MB";}monitorInfoModel.setUsedHeapMemoryInfo(usedHeapMemoryInfo);monitorInfoModel.setMaxHeapMemoryInfo(maxHeapMemoryInfo);monitorInfoModel.setUsedNonHeapMemoryInfo(usedNonHeapMemoryInfo);monitorInfoModel.setMaxNonHeapMemoryInfo(maxNonHeapMemoryInfo);OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();if (operatingSystemMXBean instanceof com.sun.management.OperatingSystemMXBean) {com.sun.management.OperatingSystemMXBean opBean = (com.sun.management.OperatingSystemMXBean) operatingSystemMXBean;double cpuLoad = opBean.getCpuLoad();String cpuLoadInfo = decimalFormat.format(cpuLoad * 100) + "%";monitorInfoModel.setCpuLoadInfo(cpuLoadInfo);double processCpuLoad = opBean.getProcessCpuLoad();String processCpuLoadInfo = decimalFormat.format(processCpuLoad * 100) + "%";monitorInfoModel.setProcessCpuLoadInfo(processCpuLoadInfo);long totalMemorySize = opBean.getTotalMemorySize();long freeMemorySize = opBean.getFreeMemorySize();String totalMemoryInfo = decimalFormat.format(1.0 * totalMemorySize / GB) + "GB";String freeMemoryInfo = decimalFormat.format(1.0 * freeMemorySize / GB) + "GB";String useMemoryInfo = decimalFormat.format(1.0 * (totalMemorySize - freeMemorySize) / GB) + "GB";String memoryUseRatioInfo = decimalFormat.format((1.0 * (totalMemorySize - freeMemorySize) / totalMemorySize * 100)) + "%";monitorInfoModel.setTotalMemoryInfo(totalMemoryInfo);monitorInfoModel.setFreeMemoryInfo(freeMemoryInfo);monitorInfoModel.setUseMemoryInfo(useMemoryInfo);monitorInfoModel.setMemoryUseRatioInfo(memoryUseRatioInfo);long freeSwapSpaceSize = opBean.getFreeSwapSpaceSize();long totalSwapSpaceSize = opBean.getTotalSwapSpaceSize();String freeSwapSpaceInfo = decimalFormat.format(1.0 * freeSwapSpaceSize / GB) + "GB";String totalSwapSpaceInfo = decimalFormat.format(1.0 * totalSwapSpaceSize / GB) + "GB";String useSwapSpaceInfo = decimalFormat.format(1.0 * (totalSwapSpaceSize - freeSwapSpaceSize) / GB) + "GB";String swapUseRatioInfo = decimalFormat.format((1.0 * (totalSwapSpaceSize - freeSwapSpaceSize) / totalSwapSpaceSize * 100)) + "%";monitorInfoModel.setFreeSwapSpaceInfo(freeSwapSpaceInfo);monitorInfoModel.setTotalSwapSpaceInfo(totalSwapSpaceInfo);monitorInfoModel.setUseSwapSpaceInfo(useSwapSpaceInfo);monitorInfoModel.setSwapUseRatioInfo(swapUseRatioInfo);String arch = opBean.getArch();String name = opBean.getName();monitorInfoModel.setArch(arch);monitorInfoModel.setName(name);}return monitorInfoModel;}public static void main(String[] args) throws InterruptedException {MonitorServer monitorServer = new MonitorServer();while (true) {MonitorInfoModel infoModel = monitorServer.monitor();
//        String jsonString = JSON.toJSONString(infoModel, SerializerFeature.PrettyFormat);
//        log.info(jsonString);log.info("""堆内存使用情况:使用中的堆内存:{}最大堆内存:{}使用中的非堆内存:{}最大非堆内存:{}""",infoModel.getUsedHeapMemoryInfo(),infoModel.getMaxHeapMemoryInfo(),infoModel.getUsedNonHeapMemoryInfo(),infoModel.getMaxNonHeapMemoryInfo());log.info("""系统信息:系统架构:{}系统名称:{}系统使用情况:CPU使用率:{}JVM进程CPU使用率:{}系统总内存:{}使用中的内存:{}内存使用率:{}系统总交换内存:{}使用中的交换内存:{}交换内存使用率:{}""",infoModel.getArch(),infoModel.getName(),infoModel.getCpuLoadInfo(),infoModel.getProcessCpuLoadInfo(),infoModel.getTotalMemoryInfo(),infoModel.getUseMemoryInfo(),infoModel.getMemoryUseRatioInfo(),infoModel.getTotalSwapSpaceInfo(),infoModel.getUseSwapSpaceInfo(),infoModel.getSwapUseRatioInfo());Thread.sleep(1000);}}
}

核心代码自然是这句:

  if (operatingSystemMXBean instanceof com.sun.management.OperatingSystemMXBean) {com.sun.management.OperatingSystemMXBean opBean = (com.sun.management.OperatingSystemMXBean) operatingSystemMXBean;

将java.lang.management.OperatingSystemMXBean转为com.sun.management.OperatingSystemMXBean,即可获取系统运行信息

其中MonitorInfoModel类为:

package com.itdct.justtest.test.monitor;import lombok.Data;/*** @author DCTANT* @version 1.0* @date 2024/3/21 11:21:36* @description*/
@Data
public class MonitorInfoModel {// INFO: DCTANT: 2024/3/21 JVM堆信息/*** 使用中的堆内存信息*/private String usedHeapMemoryInfo;/*** 最大堆内存信息*/private String maxHeapMemoryInfo;/*** 使用中的非堆内存信息*/private String usedNonHeapMemoryInfo;/*** 最大非堆内存信息*/private String maxNonHeapMemoryInfo;// INFO: DCTANT: 2024/3/21 计算机信息/*** 系统cpu使用率信息*/private String cpuLoadInfo;/*** JVM进程 cpu使用率信息*/private String processCpuLoadInfo;/*** 系统总内存信息*/private String totalMemoryInfo;/*** 系统空闲内存信息*/private String freeMemoryInfo ;/*** 使用中的内存信息*/private String useMemoryInfo ;/*** 内存使用率*/private String memoryUseRatioInfo;/*** 空闲交换内存信息*/private String freeSwapSpaceInfo;/*** 总交换内存信息*/private String totalSwapSpaceInfo;/*** 使用中交换内存信息*/private String useSwapSpaceInfo;/*** 交换内存使用率信息*/private String swapUseRatioInfo;/*** 系统架构*/private String arch;/*** 系统名称*/private String name;}

封装之后返回,直接就能使用,非常优雅

运行效果

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

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

相关文章

网络QUIC测试方法。

1、通过CURL3命令行接口,访问H3/泛播测试 curl3 --http3 --verbose https://h3.speed.cloudflare.com/__down?bytes100000000000 >> /dev/null 2、访问H3/泛播测试网站,按F12打开开发人员控制台,切换到网络这一项,把协议显…

蓝桥杯-数的潜能-求快速幂

题目 思路 --将数字拆分成加和的形式,并且相乘。数据范围到10的18次方,暴力肯定不行,要找规律。拆分成1肯定不行,对乘法没有贡献,2可以,3也可以,4、5、6等大于3的数字都可以用2和3来表示。所以…

【python】flask服务端响应与重定向处理

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

OpenGL+QT实现矢量和影像的叠加绘制

一、QT下OpenGL框架的初始化 OpenGL的介绍我在这里就没有必要介绍了,那OpenGL和QT的结合在这里就有必要先介绍一下,也就是怎么使用QT下的OpenGL框架。要想使用QT下的OpenGL框架,就必须要子类化QGLWidget,然后实现。 void initia…

Java算法总结之插入排序(详解)

程序代码园发文地址:Java算法总结之插入排序(详解)-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,Java算法总结之插入排序(详解)http://www.byqws.com/blog/3148.html?sourcecsdn 插入排…

Oracle数据库删除归档脚本(实例)

Oracle数据库删除归档脚本&#xff08;实例&#xff09; #!/bin/sh applied_days2 cat /dev/null>applied_arch.lst sqlplus -s "/as sysdba" <<EOF>/dev/null set feedback off set pages 0 set head off set timing off set echo off spool applied_a…

IDEA 多个git仓库项目放一个窗口

1、多个项目先通过新建module或者CtrlAltShiftS 添加module引入 2、重点是右下角有时候git 分支视图只有一个module的Repositories。这时候需要去设置把多个git仓库添加到同一个窗口才能方便提交代码。 3、如果Directory Mappings已经有相关项目配置&#xff0c;但是灰色的&…

常量与变量

1 常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。常量区分为不同的类型,如12、0、-3为整型常量&#xff0c;4.6、-1.23为实型常量&#xff0c;a、d为字符常量。常量一般从其字面形式即可判别。这种常量称为字面常量或直接常量。 也可以用一个标识符代表一个常…

【NBUOJ刷题笔记】递推_递归+分治策略1

0. 前言 PS&#xff1a;本人并不是集训队的成员&#xff0c;因此代码写的烂轻点喷。。。本专题一方面是巩固自己的算法知识&#xff0c;另一方面是给NBU学弟学妹们参考解题思路&#xff08;切勿直接搬运抄袭提交作业&#xff01;&#xff01;&#xff01;&#xff09;最后&…

【消息队列开发】 虚拟主机设计——操作绑定

文章目录 &#x1f343;前言&#x1f332;添加绑定&#x1f333;删除绑定⭕总结 &#x1f343;前言 本次开发任务&#xff1a; 实现对绑定的添加与绑定 &#x1f332;添加绑定 对于绑定的操作相较于前面对交换机和队列的操作就会麻烦一点了 我们分为以下七步来实现&#x…

【xr806开发板使用】连接wifi例程实现

##开发环境 win10 WSL ##1、环境配置 参考&#xff1a;https://aijishu.com/a/1060000000287513 首先下载安装wsl 和ubuntu https://docs.microsoft.com/zh-cn/windows/wsl/install &#xff08;1&#xff09;安装repo&#xff1a; 创建repo安装目录&#xff1a; mkdir ~/…

AI预测福彩3D第15弹【2024年3月21日预测--新算法重新开始计算第12次测试】

今天继续对第一套算法进行测试&#xff0c;废话不多说&#xff0c;直接上结果。 最终&#xff0c;经过研判分析&#xff0c;2024年3月21日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a;5 4 7 1 2 0 6 十位&#xff1a;3 5 1 2 0 4 6(9换6) 个位&#xff1a;2 0 1 3 4…

修改网站源码,给电子商城的商品添加图片时商品id为0的原因

修改网站源码&#xff0c;给电子商城的商品添加图片时商品id为0的原因。花了几个小时查找原因。后来&#xff0c;由于PictureControl.class.php是复制CourseControl.class.php而来&#xff0c;于是对比了这两个文件&#xff0c;在CourseControl.class.php找到了不一样的关键几条…

【算法】差分算法(空调)

可用于求一个数组要变为另一个数组最少要改变多少次的次数 Farmer John 的 N 头奶牛对他们牛棚的室温非常挑剔。 有些奶牛喜欢温度低一些&#xff0c;而有些奶牛则喜欢温度高一些。 Farmer John 的牛棚包含一排 N 个牛栏&#xff0c;编号为 1…N&#xff0c;每个牛栏里有一头…

【Linux系列】计算机系统中的架构与发行版:理解与区分

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

一文读懂MES和ERP的区别

MES&#xff08;Manufacturing Execution System&#xff09;系统是制造执行系统&#xff0c;位于上层的计划管理系统与生产过程的直接工业控制系统之间&#xff0c;是面向车间层的管理信息系统&#xff0c;能够对整个车间制造过程进行优化&#xff0c;实时收集生产过程中的数据…

LeetCode-60题:排列序列解法二(原创)

【题目描述】 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a;"123" 、"132" 、"213" 、"231"、"312"、…

数字化转型:传统行业的新出路?

近年来&#xff0c;数字化转型已成为各行各业的热议话题。许多传统行业正面临着巨大的挑战&#xff0c;例如市场竞争加剧、成本上升、利润率下降等。数字化转型被视为传统行业破局的关键。那么&#xff0c;数字化转型究竟是不是传统行业的新出路呢&#xff1f; 传统行业面临的挑…

Qt 坐标位置转换

Qt 坐标位置转换 文章目录 Qt 坐标位置转换常见的位置坐标转换Qt窗体中常用坐标的区别与获取途径当前光标相对于屏幕的绝对位置当前光标相对于当前窗口的位置鼠标事件发生的位置窗体的位置判断鼠标光标是否悬浮在某个子控件上 从事Qt快一年了 &#xff0c;在做坐标转换的时候容…

OpenCV4.9.0在Android 开发简介

查看&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;使用 Clojure 进行 OpenCV 开发简介 下一篇&#xff1a;暂无 引言&#xff1a; OpenCV是一个跨平台计算机视觉库&#xff0c;广泛用于图像处理、计算机视觉和机器学习等领域…