最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年06月20日 09:17:23   作者:DCTANT  
這篇文章主要介紹了Java獲取CPU和內(nèi)存占用率最簡單的方法,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

先上代碼,保證這是目前全網(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)證過濾器的流程

    這篇文章主要介紹了springSecurity自定義登陸接口和JWT認(rèn)證過濾器的相關(guān)資料,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Java的非阻塞隊列ConcurrentLinkedQueue解讀

    Java的非阻塞隊列ConcurrentLinkedQueue解讀

    這篇文章主要介紹了Java的非阻塞隊列ConcurrentLinkedQueue解讀,在并發(fā)編程中,有時候需要使用線程安全的隊列,如果要實現(xiàn)一個線程安全的隊列有兩種方式:一種是使用阻塞算法,另一種是使用非阻塞算法,需要的朋友可以參考下
    2023-12-12
  • SpringBoot詳細(xì)講解如何創(chuàng)建及刷新Spring容器bean

    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)用存儲過程實例代碼

    本篇文章主要介紹了Spring Data JPA調(diào)用存儲過程實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • 淺談Java StringBuilder為什么線程不安全

    淺談Java StringBuilder為什么線程不安全

    這篇文章主要介紹了淺談Java StringBuilder為什么線程不安全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java的新特性反射機(jī)制應(yīng)用及操作示例詳解

    java的新特性反射機(jī)制應(yīng)用及操作示例詳解

    這篇文章主要為大家介紹了java的新特性反射機(jī)制的操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java8 Stream API 詳細(xì)使用方法與操作技巧指南

    Java8 Stream API 詳細(xì)使用方法與操作技巧指南

    這篇文章主要介紹了Java8 Stream API 詳細(xì)使用方法與操作技巧,總結(jié)分析了Java8 Stream API 基本功能、使用方法與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • 精致小巧的java相冊制作方法

    精致小巧的java相冊制作方法

    這篇文章主要為大家詳細(xì)介紹了精致小巧的java相冊制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java中的5種同步輔助類介紹

    Java中的5種同步輔助類介紹

    你提交了一些任務(wù),但你想等它們都完成了再做另外一些事情;你提交了一些任務(wù),但是不想讓它們立刻執(zhí)行,等你喊123開始的時候,它們才開始執(zhí)行;等等這些場景,線程之間需要相互配合,或者等待某一個條件成熟執(zhí)行。這些場景想你就需要用到同步輔助類
    2014-04-04
  • Java上轉(zhuǎn)型和下轉(zhuǎn)型對象

    Java上轉(zhuǎn)型和下轉(zhuǎn)型對象

    這篇文章給大家講述了Java上轉(zhuǎn)型和下轉(zhuǎn)型對象的詳細(xì)用法以及相關(guān)的代碼分享,有興趣的朋友可以學(xué)習(xí)下。
    2018-03-03

最新評論

托里县| 潜山县| 康乐县| 全州县| 攀枝花市| 茶陵县| 旺苍县| 凌海市| 红原县| 馆陶县| 萨嘎县| 谢通门县| 黎平县| 安福县| 张家港市| 乌海市| 桃源县| 双鸭山市| 台北市| 文昌市| 石河子市| 孟连| 永定县| 青河县| 平凉市| 沙湾县| 景东| 牡丹江市| 马鞍山市| 江陵县| 凤翔县| 峨边| 和田县| 历史| 本溪| 平乡县| 屯门区| 威宁| 宝应县| 拜城县| 盘山县|