java获取系统CPU和内存使用率的三种方法

这篇具有很好参考价值的文章主要介绍了java获取系统CPU和内存使用率的三种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

获取系统CPU和内存的三种方法:
1、使用OperatingSystemMXBean获取
2、使用sigar方法获取
3、使用oshi方法获取
以下是我在我的机子上对三种方法测试的比较

方法    准确率
OperatingSystemMXBean    获取的内存数据准确,CPU差距有点大
sigar    获取的内存数据稍微有点差距,CPU相对OSMXB好一点
oshi    获取的内存数据准确,CPU相对于其他两种方法差距最小
第二种和第三种方法还适用于Linux系统

1、使用OperatingSystemMXBean获取系统CPU、内存
import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;

import lombok.extern.slf4j.Slf4j;

@SuppressWarnings("restriction")
@Slf4j
public class test {
    
    private static OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    
    public static void main(String[] args) throws InterruptedException {
        
        while(true) {
            
            //获取CPU
            double cpuLoad = osmxb.getSystemCpuLoad();
            int percentCpuLoad = (int) (cpuLoad * 100);
            //获取内存
            double totalvirtualMemory = osmxb.getTotalPhysicalMemorySize();
            double freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize();
            double value = freePhysicalMemorySize/totalvirtualMemory;
            int percentMemoryLoad = (int) ((1-value)*100);
            
            log.info("CPU = {},Mem = {}", percentCpuLoad,percentMemoryLoad);
            Thread.sleep(1000);
            
        }
        
    }

}

如下是控制台打印的日志信息


2.使用sigar方法获取系统CPU、内存
使用此方法需要使用到外部组件,我这里刚好有,可以自行下载sigar百度分享地址,提取码:6ijt。
如果是Windows系统需要将sigar-amd64-winnt.dll文件放到到C:\Windows\System32
如果是Linux系统需要将libsigar-amd64-linux.so文件放到/usr/lib64
需要在maven中添加依赖:

    <dependency>
        <groupId>org.fusesource</groupId>
        <artifactId>sigar</artifactId>
        <version>1.6.4</version>
    </dependency>

    <repositories><!-- 代码库 -->
        <repository>
            <id>maven-ali</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public//</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
                <checksumPolicy>fail</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>

sigar获取CPU信息代码

import java.util.Properties;

import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class test {
    
    public static void main(String[] args) throws InterruptedException, SigarException {
        
        while(true) {
            
            Properties props = System.getProperties();
            String systemName = props.getProperty("os.name");
            
            Sigar sigar = new Sigar();
            CpuInfo[] infos = sigar.getCpuInfoList();
            CpuInfo infoss = infos[0];
            CpuPerc cpu = sigar.getCpuPerc();
            Integer totalCPUs = infoss.getTotalCores();
            String CPUinfo = infoss.getVendor() + "  " + infoss.getModel();
            double referenceSpeed = infoss.getMhz();
            String CPUSpeed = String.format("%.2f", referenceSpeed / 1000) + " GHz";
            double cpuUsedPerc = cpu.getCombined();
            
            String CPUPers = "";
            if(systemName.startsWith("win") || systemName.startsWith("Win")) {
                CPUPers = String.format("%.1f", cpuUsedPerc * 100) + "%";
            }else {
                CPUPers = String.format("%.1f", cpuUsedPerc * 1000) + "%";
            }
            
            log.info("CPU信息 = {},CPU总数 = {},CPU基准速度 ={},CPU利用率 ={}",CPUinfo,totalCPUs,CPUSpeed,CPUPers);
            Thread.sleep(1000);
            sigar.close();
        }
        
    }

}

以下是控制台打印的CPU信息

sigar获取内存信息代码

import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class test {
    
    public static void main(String[] args) throws InterruptedException, SigarException {
        
        while(true) {
            
            Sigar sigar = new Sigar();
            double memTotal = sigar.getMem().getTotal();
            double memUsedPerc = sigar.getMem().getUsedPercent();
    
            String memory = String.format("%.0f", memTotal / 1024 / 1024 / 1024) + " GB";
            String memoryUsage = String.format("%.2f", memUsedPerc) + " %";
    
            log.info("内存 = {},内存使用率 = {}",memory,memoryUsage);
            Thread.sleep(1000);
            sigar.close();
        }
        
    }

}


以下是控制台打印的内存信息


3.使用oshi方法获取系统CPU、内存
需要在maven中添加依赖:

        <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
            <version>3.5.0</version>
        </dependency>

        <repositories><!-- 代码库 -->
            <repository>
                <id>maven-ali</id>
                <url>http://maven.aliyun.com/nexus/content/groups/public//</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                    <updatePolicy>always</updatePolicy>
                    <checksumPolicy>fail</checksumPolicy>
                </snapshots>
            </repository>
        </repositories>

oshi获取CPU代码

import java.text.DecimalFormat;
import org.hyperic.sigar.SigarException;
import lombok.extern.slf4j.Slf4j;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;

@Slf4j
public class test {
    
    public static void main(String[] args) throws InterruptedException, SigarException {
        
        while(true) {
            SystemInfo systemInfo = new SystemInfo();
            CentralProcessor processor = systemInfo.getHardware().getProcessor();
            long[] prevTicks = processor.getSystemCpuLoadTicks();
            long[] ticks = processor.getSystemCpuLoadTicks();
            long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
            long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
            long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
            long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
            long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
            long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
            long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
            long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
            long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
            
            log.info("CPU总数 = {},CPU利用率 ={}",processor.getLogicalProcessorCount(),new DecimalFormat("#.##%").format(1.0-(idle * 1.0 / totalCpu)));
            Thread.sleep(1000);
        }
        
    }

}


以下是打印信息

oshi获取内存信息代码

import java.text.DecimalFormat;
import org.hyperic.sigar.SigarException;
import lombok.extern.slf4j.Slf4j;
import oshi.SystemInfo;
import oshi.hardware.GlobalMemory;

@Slf4j
public class test {
    
    public static void main(String[] args) throws InterruptedException, SigarException {
        
        while(true) {
            SystemInfo systemInfo = new SystemInfo();
            GlobalMemory memory = systemInfo.getHardware().getMemory();
            long totalByte = memory.getTotal();
            long acaliableByte = memory.getAvailable();
            
            log.info("内存大小 = {},内存使用率 ={}",formatByte(totalByte),new DecimalFormat("#.##%").format((totalByte-acaliableByte)*1.0/totalByte));
            Thread.sleep(1000);
        }
        
    }
    
    public static String formatByte(long byteNumber){
        double FORMAT = 1024.0;
        double kbNumber = byteNumber/FORMAT;
        if(kbNumber<FORMAT){
            return new DecimalFormat("#.##KB").format(kbNumber);
        }
        double mbNumber = kbNumber/FORMAT;
        if(mbNumber<FORMAT){
            return new DecimalFormat("#.##MB").format(mbNumber);
        }
        double gbNumber = mbNumber/FORMAT;
        if(gbNumber<FORMAT){
            return new DecimalFormat("#.##GB").format(gbNumber);
        }
        double tbNumber = gbNumber/FORMAT;
        return new DecimalFormat("#.##TB").format(tbNumber);
    }

}


以下是打印的信息

到此结束!
综合考虑使用oshi的方法是最好的,不用使用外部组件,准确率也是最高的。
————————————————
版权声明:本文为CSDN博主「紫伟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41866138/article/details/105386832文章来源地址https://www.toymoban.com/news/detail-849492.html

到了这里,关于java获取系统CPU和内存使用率的三种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 获取windows下硬件数据信息(CPU,内存,英特尔、英伟达、AMD显卡使用率及详细信息)

    前言:最近一直在做关于显卡数据采集的调研工作,也在github上看到了一些三方库比如Python和golang的psutil, python: gpustart,再或者通过wmi或者windowsApi等底层接口 但是都只能获取到显卡的名称以及厂家信息等 无法真正意义上获取到显卡占用率等数据 在或者只能获取到英伟达的显卡

    2024年02月16日
    浏览(57)
  • qt使用QCustomplot绘制cpu和内存使用率图

                QCustomPlot是一个开源的Qt C++图表库,用于可视化数据。该库提供了多种类型的可定制的图表,包括散点图、线图、柱状图和等高线图等。它还支持自定义绘制,可以创建任意形状和大小的元素,并使其与其他元素交互。QCustomPlot易于集成到现有的Qt应用程序中

    2024年02月09日
    浏览(52)
  • Linux提高CPU及内存使用率的脚本

    测试或运维中,有时会特意提高CPU及内存使用率,观察运行情况,以下脚本供参考。 链接1: Linux tmpfs及消耗内存脚本 链接2: Linux 中的 /dev/null 和 /dev/zero 链接3: Linux 提高CPU占用率的脚本

    2024年02月13日
    浏览(49)
  • Linux-提高CPU、内存使用率shell脚本

    目录 1、提升CPU利用率 (1)构造CPU达到100% (2) 结束命令 2、提高内存利用率 可以申请的内存 申请内存空间: 完成后释放内存: 3、 使用ChaosBlade工具 cpu注入: 内存注入: (1)构造CPU达到100% for i in `seq 1 $(cat /proc/cpuinfo |grep \\\"physical id\\\" |wc -l)`; do dd if=/dev/zero of=/dev/null done (

    2024年02月04日
    浏览(71)
  • STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

    学习使用Freertos第四步 在 FreeRTOS 中,中断管理和软件定时: · taskENTER_CRITICAL() ·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用 ·

    2024年02月12日
    浏览(49)
  • 【Visio 2019 移动、缩放卡死,高内存 CPU 和磁盘使用率,亲测有效】

    正在使用Microsoft Visio 2019,里面有较多的插图连线,当缩放、移动时回变得很卡,内存占用率特标高。机器:联想拯救者2021r7000p。 我在另一个线程中找到了解决方案 您需要关闭Visio,然后删除注册表项:HKEY_CURRENT_USER SOFTWARE Microsoft Office 16.0 Common ExperimentConfigs Ecs

    2024年02月13日
    浏览(109)
  • 大数据之LibrA数据库系统告警处理(ALM-12016 CPU使用率超过阈值)

    告警解释 系统每30秒周期性检测CPU使用率,并把实际CPU使用率和阈值相比较。CPU使用率默认提供一个阈值范围。当检测到CPU使用率连续多次(可配置,默认值为10)超出阈值范围时产生该告警。 平滑次数为1,CPU使用率小于或等于阈值时,告警恢复;平滑次数大于1,CPU使用率

    2024年02月06日
    浏览(51)
  • CPU 使用率和负载Load

    优质博文:IT-BLOG-CN CPU 使用率是 CPU 处理非空闲任务所花费的时间百分比 。例如单核 CPU 1s 内非空闲态运行时间为 0.8s ,那么它的 CPU 使用率就是 80% ;双核 CPU 1s 内非空闲态运行时间分别为 0.4s 和 0.6s ,那么,总体 CPU 使用率就是 (0.4s + 0.6s) / (1s * 2) = 50% ,其中 2 表示 CPU 核数

    2024年02月03日
    浏览(52)
  • 【linux】查看CPU的使用率

    命令1:top 总体系统信息 uptime:系统的运行时间和平均负载。 tasks:当前运行的进程和线程数目。 CPU:总体 CPU 使用率和各个核心的使用情况。 内存(Memory):总体内存使用情况、可用内存和缓存。 查看 CPU 使用率 以下是一些常用的CPU使用率相关字段: %Cpu(s):显示整个系统

    2024年04月23日
    浏览(60)
  • 测试:虚拟机查看CPU使用率

    Windows虚拟机 任务管理器 : 在虚拟机中,您可以打开任务管理器(Ctrl + Shift + Esc),然后在“进程”标签下查看CPU使用率。 PowerShell : 使用PowerShell命令 Get-VM | Select-Object Name, CPUUsage 可以查询虚拟机的CPU使用率。 VMware vSphere Client : 如果您的虚拟机运行在VMware环境中,可以使用

    2024年02月01日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包