我熟悉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)。
我该如何测量我的线程?上述过程中可能会出现什么问题?
谢谢先进。
你有没有通过jconsole/visualvm进行确认?我用同样的方式,没有任何问题,也许当你调用这个方法的时候,它可能就没有问题了。如果您通过jconsole mbean界面调用相同的命令,您应该看到一个非零数字...您也可以尝试getThreadUserTime(id) – Toby
@Toby,感谢您的回复。对于大多数线程我收到零值,而不是所有的人;所以我猜,我在我的代码中正确的位置调用了这些过程。使用JConsole强制我不要结束程序并连接到它,但是JConsole为系统中的线程(阻塞,等待,运行)提供了分析,而不是为终止的线程分析。 JVisualVM也持有同样的想法。 – Syke