我们使用 jvisualvm 分析了我们的应用程序,发现它在 Object.wait() 中花费了很多时间。
如何找到调用此方法的对象?
我们使用 jvisualvm 分析了我们的应用程序,发现它在 Object.wait() 中花费了很多时间。
如何找到调用此方法的对象?
如果您不限于 jvisualvm,在JProfiler中,您可以右键单击锁定图中的对象并在堆遍历器中检查它。
这是针对当前锁定情况的,但历史视图将使您能够访问以前的锁定情况,并且还有一个监视器统计视图将按其类分解监视器:
免责声明:我公司开发 JProfiler。
事实上,Java SE SDK 带有一个有用的类ThreadInfo,您可以检查它以了解线程被阻塞的原因以及它正在等待什么,包括到等待点的完整堆栈跟踪,以及等待的总时间(以毫秒为单位)。
您可以通过java.lang.management
包使用此类,特别是ManagementFactory.getThreadMXBean()
您可以使用此类以编程方式检查阻塞的线程。
这是来自 JConsole 的相关屏幕截图:
挂起Object.wait()
是完全合法和安全的情况,例如,当某个线程正在等待BlockingQueue
. 这种等待所花费的时间不应影响应用程序的性能,除非它是死锁。