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

Java 测量线程锁定监视器的时间,java,performance,locking,profiling,Java,Performance,Locking,Profiling,我有一个信号量上的锁争用,我想测量锁被保留了多少时间 有没有免费的测量工具 尝试了VisualVM,我看到了锁争用,但我对时代更感兴趣 谢谢你的建议 我有50个 "[ACTIVE] ExecuteThread: '226' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x00000001099fa000 nid=0x41e waiting for monitor entry [0xfffffffe5a

我有一个信号量上的锁争用,我想测量锁被保留了多少时间

有没有免费的测量工具

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

谢谢你的建议

我有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)
“[ACTIVE]ExecuteThread:'226'用于队列:'weblogic.kernel.Default(自调优)'”守护进程prio=3 tid=0x00000001099fa000 nid=0x41e等待监视器条目[0xfffffffe5a8f9000]
java.lang.Thread.State:阻塞(在对象监视器上)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:292)
-等待锁定(weblogic.utils.classloaders.GenericClassLoader)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:248)
在weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:176)
位于com.thoughtworks.xstream.core.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:69)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:247)
位于com.thoughtworks.xstream.xstream.dynamicallyRegisterConverter(xstream.java:723)
位于com.thoughtworks.xstream.xstream.setupConverters(xstream.java:696)
位于com.thoughtworks.xstream.xstream.(xstream.java:445)
位于com.thoughtworks.xstream.xstream.(xstream.java:385)
位于com.thoughtworks.xstream.xstream.(xstream.java:342)

我认为您可以在调用super.acquire()前后扩展信号量、覆盖acquire并记录必要的信息

您可以使用并启用锁评测。这将显示在锁中花费的时间

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

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


另一种方法是打印安全点统计数据(
+XX:PrintSafePointStatistics
),这也会打印出“线程被阻止的时间(以毫秒为单位)”,有关详细信息,请参见。

不幸的是,代码是在Adobe Livecycle中构建的。。。它实际上是Livecycle以非最佳方式使用的Xstream,因为解析器是在每个请求上实例化的。如果您在Spring中,您可以尝试使用Spring-AOP创建日志方面。。。不知道如何将其与adobe livecycle捆绑。我有50个[ACTIVE]ExecuteThread:'5'用于队列:'weblogic.kernel.Default(自调优)'“等待锁定weblogic.utils.ClassLoader。GenericClassLoader@796f84d8Blocked这就是我们要做的:)“另一种方法是通过在给定的时间间隔内对线程转储进行采样并手动计算来获得估计值。”