当前位置: 首页 > article >正文

【JAVA】获取windows内存使用率排名前十的进程信息、总的cpu和内存使用率

代码

package sample.appfunction;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

class ProcessInfo implements Comparable<ProcessInfo> {
    String name;
    long memoryUsage;
    String pid;

    public ProcessInfo(String pid,String name, long memoryUsage) {
        this.name = name;
        this.memoryUsage = memoryUsage;
        this.pid=pid;
    }

    @Override
    public int compareTo(ProcessInfo other) {
        // 按内存使用量降序排序
        return Long.compare(other.memoryUsage, this.memoryUsage);
    }
}

public class tt {
    public static void main(String[] args) {
        try {
            // 获取 CPU 使用率
            double cpuUsage = getCPUUsage();
            System.out.printf("CPU 使用率: %.2f%%%n", cpuUsage);

            // 获取内存使用率
            double memoryUsage1 = getMemoryUsage();
            System.out.printf("内存使用率: %.2f%%%n", memoryUsage1);
            
            
            // 执行 wmic 命令获取进程内存使用信息
            //cdm使用的命令:wmic process get ProcessId,Name,WorkingSetSize,ParentProcessId /format:csv
            ProcessBuilder processBuilder = new ProcessBuilder("wmic", "process", "get", "ProcessId,Name,WorkingSetSize", "/format:csv");
            Process process = processBuilder.start();

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            List<ProcessInfo> processInfos = new ArrayList<>();

            // 跳过标题行
            reader.readLine();

            while ((line = reader.readLine()) != null) {
                if (!line.isEmpty()) {
                    //line:LWX1000405,chrome.exe,1332492,94793728(用户,进程名,pid,用量)
                    String[] parts = line.split(",");
                    if (parts.length >= 4) {
                        String name = parts[1];
                        String pid=parts[2];
                        try {
                            long memoryUsage = Long.parseLong(parts[3].trim());
                            processInfos.add(new ProcessInfo(pid,name, memoryUsage));
                        } catch (NumberFormatException e) {
                            // 忽略无法解析的行
                        }
                    }
                }
            }

            // 按内存使用量排序
            Collections.sort(processInfos);

            // 输出排名前 10 的进程
            System.out.println("内存使用率排名前 10 的进程:");
            for (int i = 0; i < Math.min(10, processInfos.size()); i++) {
                ProcessInfo info = processInfos.get(i);
                System.out.printf("%d. PID:%S 进程名: %s, 内存使用量: %.2f MB%n",
                        i + 1,info.pid, info.name, (double) info.memoryUsage / (1024 * 1024));
            }


        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取 CPU 使用率
     * @return CPU 使用率百分比
     * @throws IOException 执行命令时可能抛出的异常
     * @throws InterruptedException 进程等待时可能抛出的异常
     */
    public static double getCPUUsage() throws IOException, InterruptedException {
        Process process = Runtime.getRuntime().exec("wmic cpu get loadpercentage");
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            if (!line.isEmpty() && !line.contains("LoadPercentage")) {
                try {
                    return Double.parseDouble(line.trim());
                } catch (NumberFormatException e) {
                    return 0;
                }
            }
        }
        return 0;
    }

    /**
     * 获取内存使用率
     * @return 内存使用率百分比
     * @throws IOException 执行命令时可能抛出的异常
     * @throws InterruptedException 进程等待时可能抛出的异常
     */
    public static double getMemoryUsage() throws IOException, InterruptedException {
        Process process = Runtime.getRuntime().exec("wmic OS get FreePhysicalMemory,TotalVisibleMemorySize /Value");
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        long totalMemory = 0;
        long freeMemory = 0;
        while ((line = reader.readLine()) != null) {
            if (line.startsWith("TotalVisibleMemorySize")) {
                totalMemory = Long.parseLong(line.split("=")[1].trim());
            } else if (line.startsWith("FreePhysicalMemory")) {
                freeMemory = Long.parseLong(line.split("=")[1].trim());
            }
        }
        if (totalMemory > 0) {
            return (1 - (double) freeMemory / totalMemory) * 100;
        }
        return 0;
    }
}

输出

CPU 使用率: 78.00%
内存使用率: 87.50%
内存使用率排名前 10 的进程:

  1. PID:18744 进程名: chrome.exe, 内存使用量: 2828.82 MB
  2. PID:20844 进程名: idea64.exe, 内存使用量: 2077.74 MB
  3. PID:316564 进程名: java.exe, 内存使用量: 1199.97 MB
  4. PID:1329312 进程名: java.exe, 内存使用量: 970.99 MB
  5. PID:10552 进程名: chrome.exe, 内存使用量: 461.88 MB
  6. PID:1325292 进程名: chrome.exe, 内存使用量: 452.34 MB
  7. PID:17388 进程名: IM.exe, 内存使用量: 442.53 MB
  8. PID:15832 进程名: chrome.exe, 内存使用量: 291.07 MB
  9. PID:1345224 进程名: chrome.exe, 内存使用量: 272.21 MB
  10. PID:1342028 进程名: java.exe, 内存使用量: 264.14 MB

http://www.kler.cn/a/517832.html

相关文章:

  • 嵌入式实时操作系统
  • IDEA工具下载、配置和Tomcat配置
  • 【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)
  • 尝试qemu仿真VisionFive2 OpenKylin系统
  • 基于Docker的Spark分布式集群
  • 论文阅读的附录(七):Understanding Diffusion Models: A Unified Perspective(二):公式46的推导
  • iOS swift 后台运行应用尝试失败
  • 第84期 | GPTSecurity周报
  • 2025年01月23日Github流行趋势
  • 日常梳理-网络架构
  • 【重庆市乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移内容测评
  • windows git bash 使用zsh 并集成 oh my zsh
  • 论文速读|SigLIP:Sigmoid Loss for Language Image Pre-Training.ICCV23
  • 【最详细】通过anaconda安装mxnet
  • 【开源免费】基于SpringBoot+Vue.JS贸易行业crm系统(JAVA毕业设计)
  • 2025年美赛F题 网络强大?
  • 【JVM】GC
  • 模型评估:从理论排名到实践价值的转变
  • 基于springboot+vue的医疗设备管理系统
  • 生活服务发起“春节京味不打烊”活动,助力商家新春生意增长
  • 代码审计初识
  • 智能安全策略-DPL
  • 美颜技术开发实战:美颜滤镜SDK的性能优化与兼容性解决方案
  • atheris从安装到fuzz输入输出解读
  • 六、CSS预处理器
  • Poseidon哈希为什么适合做ZKP