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

问题描述

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

使用oshi

1.需要导入的包


         
            cn.hutool
            hutool-all
            4.0.9
        
        
            net.java.dev.jna
            jna
            4.5.0
        
        
            net.java.dev.jna
            jna-platform
            4.5.0
        

        
        
            com.github.oshi
            oshi-json
            3.6.1
        
        

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;

/**
 * 

* 类说明 *

* * @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 磁盘的使用情况)