测量线程锁定监视器的时间

Posted

技术标签:

【中文标题】测量线程锁定监视器的时间【英文标题】:Measuring the time a thread locks the monitor 【发布时间】:2013-06-04 13:47:24 【问题描述】:

我在信号量上有锁争用,我想测量锁的保留时间。

有没有一些免费的工具可以测量这些东西?

尝试了 Visual VM,我看到了锁争用,但我对时代更感兴趣。

感谢您的任何建议。

我有 50 个这样的

"[ACTIVE] ExecuteThread: '226' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x00000001099fa000 nid=0x41e waiting for monitor entry [0xfffffffe5a8f9000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:292)
    - waiting to lock <0xfffffffeb063ebb0> (a weblogic.utils.classloaders.GenericClassLoader)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:176)
    at com.thoughtworks.xstream.core.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:69)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.thoughtworks.xstream.XStream.dynamicallyRegisterConverter(XStream.java:723)
    at com.thoughtworks.xstream.XStream.setupConverters(XStream.java:696)
    at com.thoughtworks.xstream.XStream.<init>(XStream.java:445)
    at com.thoughtworks.xstream.XStream.<init>(XStream.java:385)
    at com.thoughtworks.xstream.XStream.<init>(XStream.java:342)

【问题讨论】:

【参考方案1】:

您可以使用Sun Studio Performance Analyzer 并启用锁定分析。这将显示您在锁中花费的时间。

jProfiler 还具有线程/监视器统计选项卡,因此您可以尝试一下。

另一种方法是通过在给定的时间间隔内对线程转储进行采样并手动计算来获得估计值。

另一种方法是打印安全点统计信息 (+XX:PrintSafePointStatistics),这还会打印出“线程阻塞的毫秒数”,了解详情见JVM SafePointStatistics - Can anyone help interpret it。

【讨论】:

这是打算做的 :) “另一种方法是通过在给定的时间间隔内对线程转储进行采样并手动计算来获得估计值。”【参考方案2】:

我认为您可以在调用 super.acquire() 之前和之后扩展 Semaphor、覆盖获取并记录必要的信息。

【讨论】:

不幸的是,代码是在 Adob​​e Livecycle 中构建的......它实际上是 Livecycle 以非最佳方式使用的 Xstream,因为每个请求都会实例化解析器 如果你在 Spring 中,你可以尝试使用 Spring-AOP 创建一个 Logging Aspect。 想到...不知道如何将它与 adobe livecycle 捆绑在一起。我有 50 个这样的 [ACTIVE] ExecuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)'" 等待锁定 weblogic.utils.classloaders.GenericClassLoader@796f84d8 BLOCKED

以上是关于测量线程锁定监视器的时间的主要内容,如果未能解决你的问题,请参考以下文章

是否可以锁定显示器的不同区域?

什么监视器被线程阻塞? [关闭]

JAVA SE基础篇59.同步块并发容器和死锁

zbb20180929 thread notify()与notifyAll()的区别

C# 线程同步之排它锁/Monitor监视器类

Java 监视器而不是二进制信号量