2011-04-17 50 views
0

java.lang.ThreadInfo提供了一些非常有用的方法,它们提供有关Java中的同步的统计信息。例如:JVMTI API中不提供同步统计信息?

getBlockedTime()返回与此ThreadInfo相关的线程被阻塞进入或因为线程争用监视被启用重新进入监视器的近似累积时间(以毫秒为单位)。 [...]

getWaitedCount()返回与此ThreadInfo相关的线程等待通知的总次数。 [...]

我找不到从JVMTI API访问这些信息的功能。我忽略了吗?还是必须自己收集这些信息?


除了从同步统计,看来你甚至不能得到一个线程ID,可以通过使用Thread.currentThread().getId();

回答

1

这不是很简单的得到,但我认为你可以在阻塞时间到达,通过JVMTI事件等待计数(请参阅与“监视器”有关的事件:“监视器Contention Enter”和“Monitor Wait”等)。

重新提供线程ID,不,它看起来不像JVMTI指定的那样。另一方面,我不确定ThreadInfo中给出的ID实际上是指由O/S分配的任何“真实”ID。

+0

@ Neil-Coffey是的,我猜我必须自己收集它。是的,当我查看数字时,线程仅在一个JVM内唯一标识。然而,这是我需要跟踪以区分不同线程的另一件事。 – 2011-04-17 08:14:31

+0

SetTag可能是一个简单的选项来跟踪自己的线程:http://download.oracle.com/javase/1.5.0/docs/guide/jvmti/jvmti.html#SetTag – 2011-04-17 08:32:07

+0

是的我认为你可以使用SetTag 。只需做一次快速测试,确保它在您的虚拟机上实际可用,然后再进行大量编码。 – 2011-04-17 13:58:36