Java 查找等待的对象

Java 查找等待的对象,java,debugging,concurrency,profiling,Java,Debugging,Concurrency,Profiling,我们使用jvisualvm分析了我们的应用程序,发现它在Object.wait()中花费了大量时间 如何找到调用此方法的对象?挂在对象上。wait()是完全合法和安全的情况,例如,当某个线程正在某个线程中等待新元素时,可能会发生这种情况。除非是死锁,否则此等待所花费的时间不应影响应用程序的性能。事实上,Java SE SDK附带了一个有用的类,您可以检查该类以了解线程被阻塞的原因及其等待的内容,包括到等待点的完整堆栈跟踪,以及等待所花费的总时间(毫秒) 您可以通过java.lang.manage

我们使用jvisualvm分析了我们的应用程序,发现它在Object.wait()中花费了大量时间


如何找到调用此方法的对象?

挂在
对象上。wait()
是完全合法和安全的情况,例如,当某个线程正在某个线程中等待新元素时,可能会发生这种情况。除非是死锁,否则此等待所花费的时间不应影响应用程序的性能。

事实上,Java SE SDK附带了一个有用的类,您可以检查该类以了解线程被阻塞的原因及其等待的内容,包括到等待点的完整堆栈跟踪,以及等待所花费的总时间(毫秒)

您可以通过
java.lang.management
包使用此类,特别是
ManagementFactory.getThreadMXBean()
然后可以使用此类以编程方式检查被阻止的线程

以下是JConsole的相关屏幕截图:


如果您不受jvisualvm的限制,在中,您可以右键单击锁定图中的对象,并在heap walker中检查它

这是针对当前锁定情况的,但是历史视图将允许您访问以前的锁定情况,并且还有一个监视器统计视图,该视图将按监视器的类对监视器进行细分:


免责声明:我的公司开发了JProfiler。

wait是对象的静态成员吗?wait是从对象继承的方法。它通常在并发对象尝试访问监视器(即使用同步方法的类)时调用。JVM通过调用wait()将第二个调用者置于等待状态。因为它不知道调用方的类型,所以只能执行Object.wait()欢迎使用评测。和。更多。这些链接很有趣,但对于许多应用程序来说,所描述的技术将是多余的。其次,Sun(现在的Oracle)在VisualVM和JConsole上投入了大量精力,因此不使用它们是愚蠢的(以一个有着SIGKILL产生的线程转储经验的人的身份进行写作)。@noahz:如果在这方面花费足够的精力就能让事情变得有价值就好了。归根结底,你对速度的需求到底有多大,因为SO充满了问题和对效果的评论:我的剖析器令人困惑,但似乎没有向我显示任何瓶颈,所以我想我会假设没有瓶颈。我不是说它不好。我只是对我的哪个活动对象正在等待感兴趣。从仅仅看到系统在Object.wait()上花费了一半的周期,我学到了很多。所以问题是“谁”在等待以及为什么;-)花在等待上的时间绝对会影响应用程序的性能。对不起,我对JMX很在行。我可以从viusalvm访问它吗?或者我需要编写额外的监控代码吗?两者都可以。VisualVM使用API监控JVM,您可以使用API编写自己的自定义监控/评测组件。