首页 > 解决方案 > 如何检查哪个线程正在持有监视器?

问题描述

我有一个性能问题(在使用并行集合和期货的复杂 Scala 代码中)。我已经使用 JFR 检查了更多细节,我可以看到问题表现为一个线程在等待监视器对象(线程似乎java.util.concurrent.ForkJoinTask#internalWait通过调用 的wait方法等待ForkJoinTask)。我想知道哪个线程持有这个监视器对象(以及从哪个函数/调用堆栈输入了监视器)。JFR 向我显示了某种监视器地址,但我没有找到按此地址搜索/过滤的方法。

在此处输入图像描述

JMC中是否有一些视图,插件或其他方式如何检查谁以及何时锁定和释放给定的监视器?

标签: javamultithreadingscalajvmjfr

解决方案


问题是,正在等待的监视器对象在技术上不被任何线程持有。这样的监视器没有“所有者”。通常,您无法事先知道哪个线程负责调用notify,因为它可以是任何线程,也可以根本没有线程。

但是,如果已经通知了监视器,则会有一个 JFR 事件,其中包含有关 Notifier Thread 的信息。您可以在屏幕截图中看到它:监视器是通过scala-execution-context-global-54线程通知的。


推荐阅读