2011-06-23 35 views
0

我熟悉Java线程监控分析测量

http://download.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

我想测试\配置文件\措施很多CPU时间是如何做的线程获取。 添加以下到我的线程的构造函数:

ManagementFactory.getThreadMXBean().setThreadCpuTimeEnabled(true); 
if(!ManagementFactory.getThreadMXBean().isCurrentThreadCpuTimeSupported()) 
    System.err.println("measure is not supported."); 
ManagementFactory.getThreadMXBean().setThreadContentionMonitoringEnabled(true); 
if(!ManagementFactory.getThreadMXBean().isCurrentThreadCpuTimeSupported()) 
    System.err.println("contention is not supported."); 

然后,当线程完成它的执行,我执行:

long tID = Thread.currentThread().getId(); 
long execTime = ManagementFactory.getThreadMXBean().getThreadCpuTime(tID); 

但对于大多数我的线程,对此我绝对肯定的它们确实占用了CPU,我得到的执行时间为零(execTime == 0)。

我该如何测量我的线程?上述过程中可能会出现什么问题?

谢谢先进。

+0

你有没有通过jconsole/visualvm进行确认?我用同样的方式,没有任何问题,也许当你调用这个方法的时候,它可能就没有问题了。如果您通过jconsole mbean界面调用相同的命令,您应该看到一个非零数字...您也可以尝试getThreadUserTime(id) – Toby

+0

@Toby,感谢您的回复。对于大多数线程我收到零值,而不是所有的人;所以我猜,我在我的代码中正确的位置调用了这些过程。使用JConsole强制我不要结束程序并连接到它,但是JConsole为系统中的线程(阻塞,等待,运行)提供了分析,而不是为终止的线程分析。 JVisualVM也持有同样的想法。 – Syke

回答

0

看看Thread Top,这一切都完成了,不需要重新发明轮子。

+0

我从Java VirtualVM(jvirtualvm)获取我的java进程ID并执行ThreadTop网站上的其中一个示例,但我得到的结果都是异常。 – Syke

+0

还有另一个类似的项目在这里:https://bitbucket.org/sindrit/jtop/ – mindas

+0

你想谷歌我??或者提供给我一个解决方案? – Syke