Java獲取CPU和內(nèi)存占用率最簡單的方法
先上代碼,保證這是目前全網(wǎng)最簡單的獲取系統(tǒng)CPU占用率、內(nèi)存占用率的方法
@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("系統(tǒng)CPU占用率: ") .append(twoDecimal(systemCpuLoad)) .append("%,內(nèi)存占用率:") .append(twoDecimal(memoryUseRatio)) .append("%,系統(tǒng)總內(nèi)存:") .append(twoDecimal(totalMemory)) .append("GB,系統(tǒng)剩余內(nèi)存:") .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,這兩個字段一個就是系統(tǒng)CPU總的利用率,另一個應該是這個Java進程當前的CPU利用率,這樣就省去很多事了,直接通過JSONObject取出來就是了,直接就給輸出出來了。
其中:OperatingSystemMXBean這個類是JDK自帶的,不用引入任何第三方jar包
輸出最終結果如下:
上面的方法只能針對JDK8,換成現(xiàn)在模塊化的JDK后,OperatingSystemMXBean類就無法反射獲取其中的信息了,會導致FastJson報錯。當然我已經(jīng)找到了解決方法。
直接上代碼
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(""" 堆內(nèi)存使用情況: 使用中的堆內(nèi)存:{} 最大堆內(nèi)存:{} 使用中的非堆內(nèi)存:{} 最大非堆內(nèi)存:{} """, infoModel.getUsedHeapMemoryInfo(), infoModel.getMaxHeapMemoryInfo(), infoModel.getUsedNonHeapMemoryInfo(), infoModel.getMaxNonHeapMemoryInfo()); log.info(""" 系統(tǒng)信息: 系統(tǒng)架構:{} 系統(tǒng)名稱:{} 系統(tǒng)使用情況: CPU使用率:{} JVM進程CPU使用率:{} 系統(tǒng)總內(nèi)存:{} 使用中的內(nèi)存:{} 內(nèi)存使用率:{} 系統(tǒng)總交換內(nèi)存:{} 使用中的交換內(nèi)存:{} 交換內(nèi)存使用率:{} """, 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轉(zhuǎn)為com.sun.management.OperatingSystemMXBean,即可獲取系統(tǒng)運行信息
其中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堆信息 /** * 使用中的堆內(nèi)存信息 */ private String usedHeapMemoryInfo; /** * 最大堆內(nèi)存信息 */ private String maxHeapMemoryInfo; /** * 使用中的非堆內(nèi)存信息 */ private String usedNonHeapMemoryInfo; /** * 最大非堆內(nèi)存信息 */ private String maxNonHeapMemoryInfo; // INFO: DCTANT: 2024/3/21 計算機信息 /** * 系統(tǒng)cpu使用率信息 */ private String cpuLoadInfo; /** * JVM進程 cpu使用率信息 */ private String processCpuLoadInfo; /** * 系統(tǒng)總內(nèi)存信息 */ private String totalMemoryInfo; /** * 系統(tǒng)空閑內(nèi)存信息 */ private String freeMemoryInfo ; /** * 使用中的內(nèi)存信息 */ private String useMemoryInfo ; /** * 內(nèi)存使用率 */ private String memoryUseRatioInfo; /** * 空閑交換內(nèi)存信息 */ private String freeSwapSpaceInfo; /** * 總交換內(nèi)存信息 */ private String totalSwapSpaceInfo; /** * 使用中交換內(nèi)存信息 */ private String useSwapSpaceInfo; /** * 交換內(nèi)存使用率信息 */ private String swapUseRatioInfo; /** * 系統(tǒng)架構 */ private String arch; /** * 系統(tǒng)名稱 */ private String name; }
封裝之后返回,直接就能使用,非常優(yōu)雅
運行效果
以上就是Java獲取CPU和內(nèi)存占用率最簡單的方法的詳細內(nèi)容,更多關于Java CPU和內(nèi)存占用率的資料請關注腳本之家其它相關文章!
相關文章
Spring?Mvc中CommonsMultipartFile的特性實例詳解
這篇文章主要給大家介紹了關于Spring?Mvc中CommonsMultipartFile特性的相關資料,SpringMVC擁有強大的靈活性,非侵入性和可配置性,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11SpringBoot調(diào)整ApplicationContextAware如何實現(xiàn)類加載順序
SpringBoot調(diào)整ApplicationContextAware實現(xiàn)類加載順序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)
MyBatis-Plus是MyBatis的增強工具,本文主要介紹了Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL),具有一定的參考價值,感興趣的可以了解一下2021-07-07Spring Boot LocalDateTime格式化處理的示例詳解
這篇文章主要介紹了Spring Boot LocalDateTime格式化處理的示例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10SpringBoot中使用Zookeeper實現(xiàn)分布式鎖的案例
本文主要介紹了SpringBoot中使用Zookeeper實現(xiàn)分布式鎖的案例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-01-01詳解Spring boot使用Redis集群替換mybatis二級緩存
本篇文章主要介紹了詳解Spring boot使用Redis集群替換mybatis二級緩存,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05springboot中請求地址轉(zhuǎn)發(fā)的兩種方案
在開發(fā)過程中,我們經(jīng)常需要將請求從一個服務轉(zhuǎn)發(fā)到另一個服務,以實現(xiàn)不同服務之間的協(xié)作,本文主要介紹了springboot中請求地址轉(zhuǎn)發(fā)的兩種方案,感興趣的可以了解一下2023-11-11springcloud如何獲取網(wǎng)關封裝的頭部信息
這篇文章主要介紹了springcloud獲取網(wǎng)關封裝的頭部信息,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06