欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java獲取CPU和內(nèi)存占用率最簡單的方法

 更新時間:2024年06月20日 09:17:23   作者:DCTANT  
這篇文章主要介紹了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的特性實例詳解

    這篇文章主要給大家介紹了關于Spring?Mvc中CommonsMultipartFile特性的相關資料,SpringMVC擁有強大的靈活性,非侵入性和可配置性,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • SpringBoot調(diào)整ApplicationContextAware如何實現(xiàn)類加載順序

    SpringBoot調(diào)整ApplicationContextAware如何實現(xiàn)類加載順序

    SpringBoot調(diào)整ApplicationContextAware實現(xiàn)類加載順序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)

    Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)

    MyBatis-Plus是MyBatis的增強工具,本文主要介紹了Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL),具有一定的參考價值,感興趣的可以了解一下
    2021-07-07
  • 詳解Java字符串在內(nèi)存中的存儲位置

    詳解Java字符串在內(nèi)存中的存儲位置

    這篇文章主要介紹了Java字符串在內(nèi)存中的存儲位置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • 深入學習 Java 中的 Lambda

    深入學習 Java 中的 Lambda

    Lambda表達式是Java SE 8中一個重要的新特性。lambda表達式允許你通過表達式來代替功能接口。 lambda表達式就和方法一樣,它提供了一個正常的參數(shù)列表和一個使用這些參數(shù)的主體(body,可以是一個表達式或一個代碼塊)。,需要的朋友可以參考下
    2019-06-06
  • Spring Boot LocalDateTime格式化處理的示例詳解

    Spring Boot LocalDateTime格式化處理的示例詳解

    這篇文章主要介紹了Spring Boot LocalDateTime格式化處理的示例詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • SpringBoot中使用Zookeeper實現(xiàn)分布式鎖的案例

    SpringBoot中使用Zookeeper實現(xiàn)分布式鎖的案例

    本文主要介紹了SpringBoot中使用Zookeeper實現(xiàn)分布式鎖的案例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • 詳解Spring boot使用Redis集群替換mybatis二級緩存

    詳解Spring boot使用Redis集群替換mybatis二級緩存

    本篇文章主要介紹了詳解Spring boot使用Redis集群替換mybatis二級緩存,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • springboot中請求地址轉(zhuǎn)發(fā)的兩種方案

    springboot中請求地址轉(zhuǎn)發(fā)的兩種方案

    在開發(fā)過程中,我們經(jīng)常需要將請求從一個服務轉(zhuǎn)發(fā)到另一個服務,以實現(xiàn)不同服務之間的協(xié)作,本文主要介紹了springboot中請求地址轉(zhuǎn)發(fā)的兩種方案,感興趣的可以了解一下
    2023-11-11
  • springcloud如何獲取網(wǎng)關封裝的頭部信息

    springcloud如何獲取網(wǎng)關封裝的頭部信息

    這篇文章主要介紹了springcloud獲取網(wǎng)關封裝的頭部信息,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論