java - 获取CPU使用率最高的进程

标签 java sigar

我正在尝试编写一个程序来记录 CPU 使用率和消耗最高 CPU 的进程。假设 firefox.exe 占用最高的 CPU,即 70%,它应该仅记录该进程及其 CPU 使用情况。

我正在使用 sigar 库来完成此任务。这是我当前的代码,它每秒获取系统 CPU 使用情况。

public class CPULogger {

    private static Sigar sigar = new Sigar();
    public void startLogging() 
    {
        Mem mem = null;
        CpuTimer cpuTimer = null;
        CpuPerc cpuPerc = null;
        FileSystemUsage fileSystemUsage = null;
        int num = 0;
        try
        {
            System.load(System.getProperty("user.dir") + "\\sigar-x86-winnt.dll");
        }
        catch(Exception exc)
        {
            writeLogs(exc.getMessage());
        }

        while(true)
        {
            try
            {
                Thread.sleep(1000);

                cpuPerc = sigar.getCpuPerc();
                num = (int)Math.ceil(cpuPerc.getCombined()*100);

                writeLogs(Double.toString(num).split("\\.")[0] + " %" + (num >= 90 ? "\tAlert" : ""));
             }
            catch(Exception e)
            {
                writeLogs(e.getMessage());
            }
        }
    }
    public void writeLogs(String logDesc)
    {
        try
        {
            PrintWriter writer;
            writer = new PrintWriter(new BufferedWriter(new FileWriter("Logs.txt", true)));
            writer.println(new java.util.Date() + "\t" + logDesc);
            writer.close();
        }
        catch(IOException e)
        {}
        catch(Exception e)
        {

        }
    }

    public static void main(String[] args) {

        CPULogger ul = new CPULogger();
        ul.startLogging();
    }

}

我怎样才能记录CPU最高的进程?

最佳答案

IMO,您可以使用以下代码来获取所有进程的列表:

    final Sigar sigar = new Sigar();        
    final long[] processes;
    try {
        processes = sigar.getProcList();
    } catch (Exception e) {
        //throw exception.
    }

然后您可以迭代所有进程并获取每个进程的 CPU 使用率:

for (final long processId : processes)  {
        try {
            ProcCpu procCpu = sigar.getProcCpu(processId);
            // compare and set max value.
        } catch (SigarException e) {
            //In case for some pid access is denied.
        }

}

然后您可以记录此最大值。您还可以查看这个link一些示例程序。

关于java - 获取CPU使用率最高的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33227718/

相关文章:

java - java中的静态接口(interface)是什么?

java - Spring-Tomcat 9 上的 JSF War 部署失败(未找到 TLDS Jars)

java - 使用 Hyperic SIGAR 获取 Java 中的系统进程列表

java - 如何在基于 Ubuntu 的 Linux 上安装 SIGAR?

java - 使用 Sigar 获取磁盘列表以读取 Java 中的可用空间

java - 如何在 Linux 上使用 SIGAR 和 maven?

maven-2 - 在 maven 中解压依赖

java - 尽管创建了应该处于 sleep 状态的新线程,但在线程 sleep 时无法选择切换按钮

java - 为什么需要关闭 Java 中文件打开的连接?

java - 尽管 sql server 工作正常,但仍获取 org.hibernate.hql.ast.QuerySyntaxException?