`监视java中每个线程的cpu使用情况?

时间:2009-04-16 12:27:41

标签: java multithreading cpu-usage

我想询问是否有一些简单的方法可以确定cpu usage中每个帖子的java。感谢

6 个答案:

答案 0 :(得分:21)

我相信JConsolearchived link)确实通过插件提供此类信息

JConsole Thread CPU usage, after blogs.oracle.com/lmalventosa/resource/thread_cpu_usage.jpg

它使用ThreadMXBean getThreadCpuTime()函数。

以下内容:

        long upTime = runtimeProxy.getUptime();
        List<Long> threadCpuTime = new ArrayList<Long>();
        for (int i = 0; i < threadIds.size(); i++) {
            long threadId = threadIds.get(i);
            if (threadId != -1) {
                threadCpuTime.add(threadProxy.getThreadCpuTime(threadId));
            } else {
                threadCpuTime.add(0L);
            }
        }
        int nCPUs = osProxy.getAvailableProcessors();
        List<Float> cpuUsageList = new ArrayList<Float>();
        if (prevUpTime > 0L && upTime > prevUpTime) {
            // elapsedTime is in ms
            long elapsedTime = upTime - prevUpTime;
            for (int i = 0; i < threadIds.size(); i++) {
                // elapsedCpu is in ns
                long elapsedCpu = threadCpuTime.get(i) - prevThreadCpuTime.get(i);
                // cpuUsage could go higher than 100% because elapsedTime
                // and elapsedCpu are not fetched simultaneously. Limit to
                // 99% to avoid Chart showing a scale from 0% to 200%.
                float cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 1000000F * nCPUs));
                cpuUsageList.add(cpuUsage);
            }
        }

答案 1 :(得分:15)

使用java.lang.management.ThreadMXBean。如何获取ThreadMXBean:

 ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();

然后您可以使用以下命令查询特定线程的消耗量:

 long cpuTime = tmxb.getThreadCpuTime(aThreadID);

希望它有所帮助。

答案 2 :(得分:5)

  

选项_1:代码级别

在您的业务逻辑代码中;在开始时调用start()API并在finally块中调用stop()。这样您将获得CPU时间来执行当前运行的线程的逻辑。然后记录下来。 Reference

class CPUTimer 
{
    private long _startTime = 0l;

    public void start ()
    {
        _startTime = getCpuTimeInMillis();
    }


    public long stop ()
    {
        long result = (getCpuTimeInMillis() - _startTime);
        _startTime = 0l;
        return result;
    }

    public boolean isRunning ()
    {
        return _startTime != 0l;
    }

    /** thread CPU time in milliseconds. */
    private long getCpuTimeInMillis ()
    {
        ThreadMXBean bean = ManagementFactory.getThreadMXBean();
        return bean.isCurrentThreadCpuTimeSupported() ? bean.getCurrentThreadCpuTime()/1000000: 0L;
    }
}
  

Option_2:使用插件监控级别(没有jvisualvm支持的AIX IBM框)

如果您认为现在添加代码有延迟,那么您可以选择JConsole并支持插件。我跟着this文章。从该文章下载topthreads jar并运行./jconsole -pluginpath topthreads-1.1.jar

  

Option_3:使用TOP(shift H)+ JSTACK监控级别(具有&#39; Shif + H&#39;支持的Unix机器)

关注this教程,其中top命令将提供查找顶级CPU线程(nid)的选项。在jstack输出文件中检查nid。

答案 3 :(得分:2)

尝试使用“TopThreads”JConsole插件。见http://lsd.luminis.nl/top-threads-plugin-for-jconsole/

答案 4 :(得分:1)

虽然这取决于平台,但我相信你所寻找的是ThreadMXBean:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.html。例如,您可以使用getThreadUserTime方法来获取所需内容。要检查您的平台是否支持CPU测量,可以调用isThreadCpuTimeSupported()。

答案 5 :(得分:1)

事实上,ThreadMXBean对象提供了您需要的功能(但可能并未在所有虚拟机上实现)。

在JDK 1.5中,有一个演示程序可以完全满足您的需求。它位于文件夹demo / management中,它被称为JTop.java

不幸的是,它不存在于Java6中。也许你可以在谷歌找到或下载JDK5。