java cpu使用监控

java cpu使用监控,java,cpu-usage,Java,Cpu Usage,有没有一种方法可以使用纯Java监控CPU使用情况?使用纯Java是不可能的。查看此部分了解一些想法。如果遇到问题,您可以通过在后台线程中运行间歇式bogomips计算器,并平滑和正常化其结果来“感知”cpu可用性。 …值得一试否:?在kgiannakakis链接的文章评论中有一块宝石: JavaSysMon管理进程和 报告有用的系统性能 跨平台的度量。你可以思考 作为跨平台版本的 UNIX“top”命令,以及 杀死进程的能力。它进来了 单个JAR文件的形式/ -适用于Windows、Mac

有没有一种方法可以使用纯Java监控CPU使用情况?

使用纯Java是不可能的。查看此部分了解一些想法。

如果遇到问题,您可以通过在后台线程中运行间歇式bogomips计算器,并平滑和正常化其结果来“感知”cpu可用性。
…值得一试否:?

在kgiannakakis链接的文章评论中有一块宝石:

JavaSysMon管理进程和 报告有用的系统性能 跨平台的度量。你可以思考 作为跨平台版本的 UNIX“top”命令,以及 杀死进程的能力。它进来了 单个JAR文件的形式/


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

使用jmx mbeans如何

final OperatingSystemMXBean myOsBean= 
            ManagementFactory.getOperatingSystemMXBean();
double load = myOsBean.getSystemLoadAverage();
您可以使用JMXbean来计算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;
    }

如果您使用的是linux—只需使用
jconsole
—您就可以了解java内存管理的所有内容

,这是一个合理的想法。不过,您必须使用适当的微基准技巧(运行一段时间,在计时之前预热所有循环,使用
System.nanoTime()
)。在时间间隔内,性能也会有相当大的波动。在Windows平台上为我提供-1。文档说-1表示不受支持。但是在linux上,我得到的值比操作系统所说的要小,所以我假设这是当前JVM使用的CPU负载
    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;
    }