Java获取任务管理器内存、各磁盘内存、CPU使用率数据

文章目录

      • 1、获取任务管理器运行内存、各磁盘内存
      • 2、获取CPU使用率

1、获取任务管理器运行内存、各磁盘内存

1.代码实现:

    /**
     * 获取内存使用情况
     */
    public static void getMemory() throws IOException {
        OperatingSystemMXBean mem = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        // 获取内存总容量
        long totalMemorySize = mem.getTotalPhysicalMemorySize();
        // 获取可用内存容量(剩余物理内存)
        long freeMemorySize = mem.getFreePhysicalMemorySize();
        // 空闲的交换容量
        long freeSwapSpaceSize = mem.getFreeSwapSpaceSize();

        float usedRAM = (float)(((totalMemorySize - freeMemorySize) * 1.0 / totalMemorySize) * 100);

        System.out.println("物理内存总容量totalMemorySize:" + transformation(totalMemorySize) );
        System.out.println("剩余物理内存可用容量freeMemorySize:" + transformation(freeMemorySize));
        System.out.println("usedRAM:" + usedRAM);
        System.out.println("空闲的交换容量:" + transformation(freeSwapSpaceSize));

        Runtime runtime = Runtime.getRuntime();
        // java虚拟机中的内存总量,可用内存空间 单位为byte,默认为系统的1/64
        long totalMemory = runtime.totalMemory();
        // java虚拟机试图使用的最大内存量 最大可用内存空间 单位byte,默认为系统的1/4
        long maxMemory = runtime.maxMemory();
        // java 虚拟机中的空闲内存量 空闲空间 单位byte, 默认为系统的1/4
        long freeMemory = runtime.freeMemory();
        float usedRAMJava = (float)(((totalMemory - freeMemory) * 1.0 / totalMemory) * 100);
        System.out.println("java虚拟机中的内存总量:" + totalMemory / 1024 / 1024 + "MB" );
        System.out.println("java虚拟机试图使用的最大内存量:" + maxMemory / 1024 / 1024 + "MB" );
        System.out.println("java虚拟机中的空闲内存量:" + freeMemory / 1024 / 1024 + "MB" );
        System.out.println("java虚拟机中的剩余内存占总量:" + usedRAMJava + "%" );

        DecimalFormat df = new DecimalFormat("#0.00");
        File[] disks = File.listRoots();
        for (File file : disks) {
            // 获取盘符
            System.out.print(file.getCanonicalPath() + "   ");
            // 获取总容量
            long totalSpace = file.getTotalSpace();
            // 获取剩余容量
            long usableSpace = file.getUsableSpace();
            // 获取已经使用的容量
            long freeSpace = totalSpace - usableSpace;
            // 获取使用率
            float useRate = (float)((freeSpace * 1.0 / totalSpace) * 100);
            System.out.print("总容量: " + transformation(totalSpace));
            System.out.print("已经使用: " + transformation(freeSpace));
            System.out.print("剩余容量: " + transformation(usableSpace));
            System.out.println("使用率: " + Double.parseDouble(df.format(useRate)) + "%   ");
        }
    }
    /**
     * 将字节容量转化为GB
     */
    public static String transformation(long size){
        return (float) size / 1024 / 1024 / 1024 + "GB"+"   ";
    }

2.运行结果
Java获取任务管理器内存、各磁盘内存、CPU使用率数据_第1张图片

3.任务管理器

Java获取任务管理器内存、各磁盘内存、CPU使用率数据_第2张图片

2、获取CPU使用率

通过Java获取CPU使用率,搜索大多方法都是使用getSystemCpuLoad()来获取,具体代码如下:

	public void getCpu() {
	        OperatingSystemMXBean mem = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
	        System.out.println("CPU使用率:" + mem.getSystemCpuLoad());
	        System.out.println("进程占用CPU:" + mem.getProcessCpuLoad());
	}

代码结果如下:
Java获取任务管理器内存、各磁盘内存、CPU使用率数据_第3张图片
问题:为什么获取的CPU使用率是0.0?而且在其他电脑上还出现了getSystemCpuLoad和getProcessCpuLoad获取的都为-1(负数)的情况?

经过多次搜索,大概看到的解析是说跟JDK的版本有关系,或者是跟电脑本身无权限访问的原因(未求证)。

思路转换,寻找其他方法:
CPU使用率是如下图任务管理器中利用率的百分比:
Java获取任务管理器内存、各磁盘内存、CPU使用率数据_第4张图片
还可以通过cmd终端窗口查看CPU使用率,cmd命令如下:

# 一秒中输出一次
typeperf "processor(_total)\% processor time"

# 若是只要执行一次,末尾添加  -sc 1, 或 -sc 次数
typeperf "processor(_total)\% processor time" -sc 1

执行结果:
Java获取任务管理器内存、各磁盘内存、CPU使用率数据_第5张图片
Java获取任务管理器内存、各磁盘内存、CPU使用率数据_第6张图片
其次还可使用wmic命令,根据搜索loadpercentage也代表CPU利用率

wmic cpu get loadpercentage

运行结果:
Java获取任务管理器内存、各磁盘内存、CPU使用率数据_第7张图片
即,想要通过Java获取CPU的使用率就可以用Runtime.getRuntime().exec()调用终端窗口cmd执行相应命令,实现代码如下所示:

    public static int getCpuUseRatio() {
        Process process = null;
        BufferedReader bufferedReader = null;
        try {
            String CMD_PYTHON = "wmic cpu get loadpercentage";
            process = Runtime.getRuntime().exec(CMD_PYTHON);
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));
            String res;
            while ((res = bufferedReader.readLine()) != null) {
                String strs = res.trim();  // 去除输出发前后空格
                if (!"".equals(strs) && !"LoadPercentage".equals(strs)) {
                    return Integer.parseInt(strs);
                }
            }
            bufferedReader.close();
            process.destroy();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null){
                    bufferedReader.close();
                }
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
            if (process != null) {
                process.destroy();
            }
        }
        // 获取失败,或出现异常
        return -1;
    }

你可能感兴趣的:(J2EE,java,开发语言)