寻找等待的对象

时间:2012-09-09 11:42:58

标签: java debugging concurrency profiling

我们使用jvisualvm描述了我们的应用程序,发现它在Object.wait()中花了很多时间。

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

3 个答案:

答案 0 :(得分:1)

实际上,Java SE SDK附带了一个有用的类ThreadInfo,您可以检查它以了解线程被阻塞的原因以及它等待的内容,包括等待点的完整堆栈跟踪以及总数花在等待的时间。

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

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

enter image description here

答案 1 :(得分:1)

如果您不限于jvisualvm,则可以在JProfiler中右键单击锁定图中的对象并在堆步行器中检查它。

enter image description here

这是针对当前的锁定情况,但历史记录视图将允许您访问以前的锁定情况,还有一个监视器统计信息视图,它将按类别分解监视器:

enter image description here

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

答案 2 :(得分:0)

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