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

上面的方法只能針對JDK8,換成現(xiàn)在模塊化的JDK后,OperatingSystemMXBean類就無法反射獲取其中的信息了,會導(dǎo)致FastJson報錯。當(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ī)信息
/**
* 系統(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)存占用率的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springSecurity自定義登錄接口和JWT認(rèn)證過濾器的流程
這篇文章主要介紹了springSecurity自定義登陸接口和JWT認(rèn)證過濾器的相關(guān)資料,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-12-12
Java的非阻塞隊列ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java的非阻塞隊列ConcurrentLinkedQueue解讀,在并發(fā)編程中,有時候需要使用線程安全的隊列,如果要實現(xiàn)一個線程安全的隊列有兩種方式:一種是使用阻塞算法,另一種是使用非阻塞算法,需要的朋友可以參考下2023-12-12
SpringBoot詳細(xì)講解如何創(chuàng)建及刷新Spring容器bean
前面看spring源碼時可以發(fā)現(xiàn)refresh()方法十分重要。在這個方法中會加載beanDefinition,同時創(chuàng)建bean對象。那么在springboot中有沒有使用這個refresh()方法呢2022-06-06
Spring Data JPA調(diào)用存儲過程實例代碼
本篇文章主要介紹了Spring Data JPA調(diào)用存儲過程實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
java的新特性反射機(jī)制應(yīng)用及操作示例詳解
這篇文章主要為大家介紹了java的新特性反射機(jī)制的操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Java8 Stream API 詳細(xì)使用方法與操作技巧指南
這篇文章主要介紹了Java8 Stream API 詳細(xì)使用方法與操作技巧,總結(jié)分析了Java8 Stream API 基本功能、使用方法與操作注意事項,需要的朋友可以參考下2020-05-05

