我们使用jvisualvm描述了我们的应用程序,发现它在Object.wait()中花了很多时间。
如何找到调用此方法的对象?
答案 0 :(得分:1)
实际上,Java SE SDK附带了一个有用的类ThreadInfo,您可以检查它以了解线程被阻塞的原因以及它等待的内容,包括等待点的完整堆栈跟踪以及总数花在等待的时间。
您可以通过java.lang.management
包使用此类,特别是ManagementFactory.getThreadMXBean()
然后您可以使用此类以编程方式检查被阻止的线程。
以下是JConsole的相关屏幕截图:
答案 1 :(得分:1)
如果您不限于jvisualvm,则可以在JProfiler中右键单击锁定图中的对象并在堆步行器中检查它。
这是针对当前的锁定情况,但历史记录视图将允许您访问以前的锁定情况,还有一个监视器统计信息视图,它将按类别分解监视器:
免责声明:我公司开发JProfiler。
答案 2 :(得分:0)
挂在Object.wait()
上是完全合法和安全的情况,例如,当某个线程正在等待BlockingQueue
中的新元素时,可能会发生这种情况。花在等待上的时间不应影响应用程序的性能,除非它是一个死锁。