美文网首页
java 获取内存 cpu 磁盘的使用情况

java 获取内存 cpu 磁盘的使用情况

作者: ShawnLiMr | 来源:发表于2018-06-30 11:32 被阅读0次

问题描述

目前线上的服务越来越多,需要监控对应服务的运行状态和系统基本信息:磁盘,cpu,内存的使用情况,线上服务和本地环境的机器类型不同,查找相关资料未找到可用的代码,经过查找相关资料,整理如下。

使用oshi

1.需要导入的包

<!--系统使用率导包开始-->
       <dependency>  <!--工具类 小数格式化 可以改为其他-->
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.0.9</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>4.5.0</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna-platform</artifactId>
            <version>4.5.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.github.oshi/oshi-json -->
        <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-json</artifactId>
            <version>3.6.1</version>
        </dependency>
        <!--系统使用率导包结束-->

2.上干活 具体代码

这里获取磁盘使用情况在linux下有问题,所以使用了其他的方式获取

import java.io.InputStreamReader;
import java.io.LineNumberReader;

import cn.hutool.core.util.NumberUtil;
import lombok.extern.slf4j.Slf4j;
import oshi.json.SystemInfo;
import oshi.json.hardware.CentralProcessor;
import oshi.json.hardware.GlobalMemory;
import oshi.json.hardware.HWDiskStore;
import oshi.json.hardware.HardwareAbstractionLayer;

/**
 * <p>
 * 类说明
 * </p>
 *
 * @author Shawn
 * @since 2018/06/29
 */
@Slf4j
public class SystemUsageUtil {

    private static SystemInfo systemInfo = new SystemInfo();

    /**
     * 获取内存的使用率
     *
     * @return 内存使用率 0.36
     */
    public static double getMemoryUsage() {
        HardwareAbstractionLayer hal = systemInfo.getHardware();
        GlobalMemory memory = hal.getMemory();
        long available = memory.getAvailable();
        long total = memory.getTotal();
        log.info("getMemoryUsage available={},total={}", available, total);
        double useRate = NumberUtil.div(available, total, 2);
        return useRate;
    }

    /**
     * 获取CPU的使用率
     *
     * @return CPU使用率 0.36
     */
    public static double getCpuUsage() {
        HardwareAbstractionLayer hal = systemInfo.getHardware();
        CentralProcessor processor = hal.getProcessor();
        double useRate = processor.getSystemCpuLoadBetweenTicks();
        log.info("getCpuUsage useRate={}", useRate);
        return NumberUtil.div(useRate, 1, 2);
    }

    /**
     * 获取磁盘的使用率
     *
     * @return CPU使用率 0.36
     */
    public static double getDiskUsage() {
        if (isWindows()) {
            return getWinDiskUsage();
        }
        return getUnixDiskUsage();
    }


    /**
     * 判断系统是否为windows
     *
     * @return 是否
     */
    private static boolean isWindows() {
        return System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS");
    }

    /**
     * 获取linux 磁盘使用率
     *
     * @return 磁盘使用率
     */
    private static double getUnixDiskUsage() {
        String ioCmdStr = "df -h /";
        String resultInfo = runCommand(ioCmdStr);
        String[] data = resultInfo.split(" +");
        double total = Double.parseDouble(data[10].replace("%", ""));
        return total / 100;
    }

    /**
     * 获取linux 磁盘使用率
     *
     * @return 磁盘使用率
     */
    private static double getWinDiskUsage() {

        HardwareAbstractionLayer hal = systemInfo.getHardware();
        HWDiskStore[] diskStores = hal.getDiskStores();
        long total = 0;
        long used = 0;
        if (diskStores != null && diskStores.length > 0) {
            for (HWDiskStore diskStore : diskStores) {
                long size = diskStore.getSize();
                long writeBytes = diskStore.getWriteBytes();
                total += size;
                used += writeBytes;
            }
        }
        return NumberUtil.div(used, total, 2);
    }


    /**
     * 执行系统命令
     *
     * @param CMD 命令
     * @return 字符串结果
     */
    private static String runCommand(String CMD) {
        StringBuilder info = new StringBuilder();
        try {
            Process pos = Runtime.getRuntime().exec(CMD);
            pos.waitFor();
            InputStreamReader isr = new InputStreamReader(pos.getInputStream());
            LineNumberReader lnr = new LineNumberReader(isr);
            String line;
            while ((line = lnr.readLine()) != null) {
                info.append(line).append("\n");
            }
        } catch (Exception e) {
            info = new StringBuilder(e.toString());
        }
        return info.toString();
    }
}

亲测 linux和windows环境可正常使用

参考资料

https://github.com/oshi/oshi

相关文章

  • java 获取内存 cpu 磁盘的使用情况

    问题描述 目前线上的服务越来越多,需要监控对应服务的运行状态和系统基本信息:磁盘,cpu,内存的使用情况,线上服务...

  • 服务器状态分析

    服务器整体情况, CPU 使用情况,内存,磁盘,磁盘 IO ,网络 IO top 看服务器整体使用情况,一般都是 ...

  • Linux一些常用的命令

    查看内存的使用情况 查看 CPU/Mem/Swap 的使用情况 ** 查看磁盘的使用情况以及文件系统被挂载的位置*...

  • MobaXterm开启监控服务器资源使用情况

    MobaXterm可以在会话窗口底部查看服务器资源使用情况,比如内存,CPU,磁盘使用等。 可以通过Setting...

  • Linux 服务器日志记录

    问题描述: 需要shell将每天的磁盘使用情况保存。 问题分析: 1、获取日期。2、获取磁盘使用情况。 核心语句:...

  • Mysql优化

    mysql优化 cpu指标 mem内存 swap 磁盘IO 优化的工具 主机选型 cpu选择 内存 磁盘选择 存储...

  • Android的性能优化

    内存、CPU、GPU 应用运行时内存使用情况查看:Android Studio—Memory/CPU/GPU。 使...

  • python-获取cpu,内存

    获取cpu使用情况 获取整个手机的cpu使用情况 这里可以看到所有进程的Cpu占用率: 看第一个应用CPU占用率6...

  • 性能测试概览Ⅲ

    性能测试关注点 时间 资源消耗:cpu、内存、磁盘、网络 性能瓶颈 硬件(最直接但成本最高):cpu、内存、磁盘、...

  • 消息队列监控项整理【实战笔记】

    目录 一、系统监控项 1.CPU CPU使用率、CPU Load、 2.内存 内存使用率 3.磁盘 磁盘使用率、磁...

网友评论

      本文标题:java 获取内存 cpu 磁盘的使用情况

      本文链接:https://www.haomeiwen.com/subject/mnrtuftx.html