【问题标题】:Synchronization statistics not available in the JVMTI API?JVMTI API 中没有同步统计信息?
【发布时间】:2011-04-17 00:15:13
【问题描述】:

java.lang.ThreadInfo 类提供了一些非常有用的方法,这些方法提供有关 Java 同步的统计信息。例如:

getBlockedTime() 返回自启用线程争用监控以来与此 ThreadInfo 关联的线程已阻止进入或重新进入监控器的近似累积经过时间(以毫秒为单位)。 [...]

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

我找不到从JVMTI API 访问这些信息的函数。我会忽略它还是必须自己收集这些信息?


除了同步统计,好像连个Threads id都拿不到,可以通过Thread.currentThread().getId();获取

【问题讨论】:

    标签: java jvmti


    【解决方案1】:

    这不是那么简单,但我认为您可以通过 JVMTI 事件到达阻塞时间并等待计数(请参阅与“监视器”有关的事件:“监视器竞争输入”和“监视器等待”等)。

    是线程 ID,不,它看起来不像 JVMTI 分配这些。另一方面,我不确定 ThreadInfo 中给出的 ID 实际上是指操作系统分配的任何“真实”ID。

    【讨论】:

    • @Neil-Coffey 是的,我想我必须自己收集它。是的,当我查看数字时,线程仅在一个 JVM 中被唯一标识。然而,这是我需要跟踪的另一件事,以便区分不同的线程。
    • SetTag 可能是一个简单的选项来自己跟踪线程:download.oracle.com/javase/1.5.0/docs/guide/jvmti/…
    • 是的,我认为您可以使用 SetTag。在进行大量编码之前,只需进行快速测试以确保它在您的 VM 上实际可用。
    • P.S.如果只是为了区分线程,那么您可能需要检查 JVM 传递给您的 jthread 指针是否稳定(因此您可以告诉线程“与上次相同”,因为它具有相同的指针,或与线程 B 不同,因为指针不同)。不过,老实说,我不记得是否是这种情况,而且它可能因虚拟机而异。
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多