java cpu使用情况监控

时间:2010-01-14 05:50:29

标签: java cpu-usage

有没有办法使用纯Java监控CPU使用率?

6 个答案:

答案 0 :(得分:10)

在文章的评论中有一个宝石,与kgiannakakis联系在一起:

javasysmon

  

JavaSysMon管理流程和   报告有用的系统性能   指标跨平台。你可以想   它作为跨平台版本   UNIX`top'命令,以及   杀死进程的能力。它进来了   单个JAR文件的形式/.../ p>

-works,适用于Windows,Mac OS X,Linux和Solaris。

答案 1 :(得分:7)

如何使用jmx mbeans?

final OperatingSystemMXBean myOsBean= 
            ManagementFactory.getOperatingSystemMXBean();
double load = myOsBean.getSystemLoadAverage();

答案 2 :(得分:6)

可以使用jMX bean来计算CPU负载。请注意,这会测量java程序的CPU负载,而不是整个系统负载。 (问题没有说明哪个)

初​​始化:

    ThreadMXBean newBean = ManagementFactory.getThreadMXBean();
    try
    {
        if (this.newBean.isThreadCpuTimeSupported())
            this.newBean.setThreadCpuTimeEnabled(true);
        else
            throw new AccessControlException("");
    }
    catch (AccessControlException e)
    {
        System.out.println("CPU Usage monitoring is not available!");
        System.exit(0);
    }

然后作为你的循环(假设你的应用程序使用循环,否则衡量CPU使用率的重点是什么?)使用:

    long lastTime = System.nanoTime();
    long lastThreadTime = newBean.getCurrentThreadCpuTime();

    while (true)
    {
        // Do something that takes at least 10ms (on windows)
        try
        {
            int j = 0;
            for (int i = 0; i < 20000000; i++)
                j = (j + i) * j / 2;
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
        }

        // Calculate coarse CPU usage:
        long time = System.nanoTime();
        long threadTime = newBean.getCurrentThreadCpuTime();
        double load = (threadTime - lastThreadTime) / (double)(time - lastTime);
        System.out.println((float)load);

        // For next iteration.
        lastTime = time;
        lastThreadTime = threadTime;
    }

你需要使用双精度,因为long不适合浮点数(虽然它可能在99.9999999999999999%的时间内有效)

  

如果您所做的“某事”花费的时间少于约1.6毫秒(Windows),那么返回的值根本不会增加,您将永远错误地测量0%的CPU。

因为getCurrentThreadCpuTime非常不准确(延迟小于100毫秒),所以平滑它有很大帮助:

    long lastTime = System.nanoTime();
    long lastThreadTime = newBean.getCurrentThreadCpuTime();

    float smoothLoad = 0;
    while (true)
    {
        // Do something that takes at least 10ms (on windows)
        try
        {
            int j = 0;
            for (int i = 0; i < 2000000; i++)
                j = (j + i) * j / 2;
            Thread.sleep(10);
        }
        catch (InterruptedException e)
        {
        }

        // Calculate coarse CPU usage:
        long time = System.nanoTime();
        long threadTime = newBean.getCurrentThreadCpuTime();
        double load = (threadTime - lastThreadTime) / (double)(time - lastTime);
        // Smooth it.
        smoothLoad += (load - smoothLoad) * 0.1; // damping factor, lower means less responsive, 1 means no smoothing.
        System.out.println(smoothLoad);

        // For next iteration.
        lastTime = time;
        lastThreadTime = threadTime;
    }

答案 3 :(得分:1)

使用纯Java无法做到这一点。有关一些想法,请参阅此article

答案 4 :(得分:1)

也许如果卡住了,你可能会通过在后台线程中运行间歇性的bogomips计算器来“感知”cpu可用性,并平滑和规范化其发现。 ......值得一试:?

答案 5 :(得分:0)

如果您使用的是linux - 只需使用jconsole - 您将获得Java内存管理的所有内容