Java获取CPU和内存占用率最简单的方法
作者:DCTANT
这篇文章主要介绍了Java获取CPU和内存占用率最简单的方法,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
先上代码,保证这是目前全网最简单的获取系统CPU占用率、内存占用率的方法
@Test public void testSystemUsage() { final long GB = 1024 * 1024 * 1024; while (true) { OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean(); String osJson = JSON.toJSONString(operatingSystemMXBean); // System.out.println("osJson is " + osJson); JSONObject jsonObject = JSON.parseObject(osJson); double processCpuLoad = jsonObject.getDouble("processCpuLoad") * 100; double systemCpuLoad = jsonObject.getDouble("systemCpuLoad") * 100; Long totalPhysicalMemorySize = jsonObject.getLong("totalPhysicalMemorySize"); Long freePhysicalMemorySize = jsonObject.getLong("freePhysicalMemorySize"); double totalMemory = 1.0 * totalPhysicalMemorySize / GB; double freeMemory = 1.0 * freePhysicalMemorySize / GB; double memoryUseRatio = 1.0 * (totalPhysicalMemorySize - freePhysicalMemorySize) / totalPhysicalMemorySize * 100; StringBuilder result = new StringBuilder(); result.append("系统CPU占用率: ") .append(twoDecimal(systemCpuLoad)) .append("%,内存占用率:") .append(twoDecimal(memoryUseRatio)) .append("%,系统总内存:") .append(twoDecimal(totalMemory)) .append("GB,系统剩余内存:") .append(twoDecimal(freeMemory)) .append("GB,该进程占用CPU:") .append(twoDecimal(processCpuLoad)) .append("%"); System.out.println(result.toString()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } public double twoDecimal(double doubleValue) { BigDecimal bigDecimal = new BigDecimal(doubleValue).setScale(2, RoundingMode.HALF_UP); return bigDecimal.doubleValue(); }
这代码我注释都懒得写一行了,主要是这一行:JSON.toJSONString(operatingSystemMXBean),输出的结果如图:(使用的是阿里巴巴的fastjson)
我当时只是为了偷懒一个个去get输出,就直接通过JSON的方式打印输出了,结果不输出不知道,一输出吓一跳,把一堆隐藏字段都给输出出来了,包括systemCpuLoad、processCpuLoad,这两个字段一个就是系统CPU总的利用率,另一个应该是这个Java进程当前的CPU利用率,这样就省去很多事了,直接通过JSONObject取出来就是了,直接就给输出出来了。
其中:OperatingSystemMXBean这个类是JDK自带的,不用引入任何第三方jar包
输出最终结果如下:
上面的方法只能针对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; }
封装之后返回,直接就能使用,非常优雅
运行效果
以上就是Java获取CPU和内存占用率最简单的方法的详细内容,更多关于Java CPU和内存占用率的资料请关注脚本之家其它相关文章!