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,該進(jìn)程占用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),輸出的結(jié)果如圖:(使用的是阿里巴巴的fastjson)

我當(dāng)時(shí)只是為了偷懶一個(gè)個(gè)去get輸出,就直接通過JSON的方式打印輸出了,結(jié)果不輸出不知道,一輸出嚇一跳,把一堆隱藏字段都給輸出出來了,包括systemCpuLoad、processCpuLoad,這兩個(gè)字段一個(gè)就是系統(tǒng)CPU總的利用率,另一個(gè)應(yīng)該是這個(gè)Java進(jìn)程當(dāng)前的CPU利用率,這樣就省去很多事了,直接通過JSONObject取出來就是了,直接就給輸出出來了。
其中:OperatingSystemMXBean這個(gè)類是JDK自帶的,不用引入任何第三方j(luò)ar包
輸出最終結(jié)果如下:

上面的方法只能針對(duì)JDK8,換成現(xiàn)在模塊化的JDK后,OperatingSystemMXBean類就無法反射獲取其中的信息了,會(huì)導(dǎo)致FastJson報(bào)錯(cuò)。當(dāng)然我已經(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)架構(gòu):{}
系統(tǒng)名稱:{}
系統(tǒng)使用情況:
CPU使用率:{}
JVM進(jìn)程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)運(yùn)行信息
其中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 計(jì)算機(jī)信息
/**
* 系統(tǒng)cpu使用率信息
*/
private String cpuLoadInfo;
/**
* JVM進(jìn)程 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)架構(gòu)
*/
private String arch;
/**
* 系統(tǒng)名稱
*/
private String name;
}封裝之后返回,直接就能使用,非常優(yōu)雅
運(yùn)行效果


以上就是Java獲取CPU和內(nèi)存占用率最簡單的方法的詳細(xì)內(nèi)容,更多關(guān)于Java CPU和內(nèi)存占用率的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring?Mvc中CommonsMultipartFile的特性實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Spring?Mvc中CommonsMultipartFile特性的相關(guān)資料,SpringMVC擁有強(qiáng)大的靈活性,非侵入性和可配置性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
SpringBoot調(diào)整ApplicationContextAware如何實(shí)現(xiàn)類加載順序
SpringBoot調(diào)整ApplicationContextAware實(shí)現(xiàn)類加載順序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)
MyBatis-Plus是MyBatis的增強(qiáng)工具,本文主要介紹了Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL),具有一定的參考價(jià)值,感興趣的可以了解一下2021-07-07
Spring Boot LocalDateTime格式化處理的示例詳解
這篇文章主要介紹了Spring Boot LocalDateTime格式化處理的示例詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
SpringBoot中使用Zookeeper實(shí)現(xiàn)分布式鎖的案例
本文主要介紹了SpringBoot中使用Zookeeper實(shí)現(xiàn)分布式鎖的案例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
詳解Spring boot使用Redis集群替換mybatis二級(jí)緩存
本篇文章主要介紹了詳解Spring boot使用Redis集群替換mybatis二級(jí)緩存,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
springboot中請(qǐng)求地址轉(zhuǎn)發(fā)的兩種方案
在開發(fā)過程中,我們經(jīng)常需要將請(qǐng)求從一個(gè)服務(wù)轉(zhuǎn)發(fā)到另一個(gè)服務(wù),以實(shí)現(xiàn)不同服務(wù)之間的協(xié)作,本文主要介紹了springboot中請(qǐng)求地址轉(zhuǎn)發(fā)的兩種方案,感興趣的可以了解一下2023-11-11
springcloud如何獲取網(wǎng)關(guān)封裝的頭部信息
這篇文章主要介紹了springcloud獲取網(wǎng)關(guān)封裝的頭部信息,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

