3

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

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

4

3 回答 3

1

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

在此处输入图像描述

这是针对当前锁定情况的,但历史视图将使您能够访问以前的锁定情况,并且还有一个监视器统计视图将按其类分解监视器:

在此处输入图像描述

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

于 2012-09-10T10:26:11.500 回答
1

事实上,Java SE SDK 带有一个有用的类ThreadInfo,您可以检查它以了解线程被阻塞的原因以及它正在等待什么,包括到等待点的完整堆栈跟踪,以及等待的总时间(以毫秒为单位)。

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

这是来自 JConsole 的相关屏幕截图:

在此处输入图像描述

于 2012-09-09T12:26:01.480 回答
0

挂起Object.wait()是完全合法和安全的情况,例如,当某个线程正在等待BlockingQueue. 这种等待所花费的时间不应影响应用程序的性能,除非它是死锁。

于 2012-09-09T12:22:54.120 回答