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

3

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

有一些免费的工具能够测量这个吗?

尝试过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)
2个回答

5
你可以使用Sun Studio性能分析器并启用锁定分析。这将显示在锁定上花费的时间。
jProfiler还有线程/监视器统计选项卡,因此您可以尝试一下。
另一种方法是通过采样线程转储来在给定间隔内进行估算并手动计算。
另一种方法是打印安全点统计信息+XX:PrintSafePointStatistics),这也会打印出“线程阻塞所花费的毫秒数”,详情请参见JVM SafePointStatistics - Can anyone help interpret it

这是预期要做的事情 :) “另一种方法是通过在给定间隔内对线程转储进行抽样并手动计算来获得估计。” - Cris

3
我认为你可以扩展Semaphor,重写acquire方法并在调用super.acquire()之前和之后记录必要的信息。

很遗憾,这段代码是在Adobe Livecycle中构建的...实际上,Livecycle中使用的是Xstream,但不是最优的方式,因为解析器在每个请求上都被实例化。 - Cris
1
如果你在使用Spring,可以尝试使用Spring-AOP来创建一个日志切面。 - Evgeniy Dorofeev
对此有些想法...不知道如何将其与Adobe LiveCycle捆绑在一起。我有大约50个这样的[ACTIVE]ExecuteThread:'5' for queue:'weblogic.kernel.Default(self-tuning)'"等待锁定weblogic.utils.classloaders.GenericClassLoader@796f84d8 BLOCKED - Cris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接