如何检查哪个线程握住监视器?

时间:2020-08-03 10:04:31

标签: java multithreading scala jvm jfr

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

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

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