[英]How to check which thread is holding the monitor?
我有一个性能问题(在使用并行 collections 和期货的复杂 Scala 代码中)。 我使用 JFR 检查了更多详细信息,我可以看到问题表现为在监视器 object 上等待的线程(该线程似乎在java.util.concurrent.ForkJoinTask#internalWait
通过调用ForkJoinTask
的wait
方法等待) . 我想知道哪个线程拥有这个监视器 object(以及从哪个 function / 调用堆栈输入监视器)。 JFR 向我显示了某种监视器地址,但我没有找到按此地址搜索/过滤的方法。
JMC中是否有一些视图,插件或其他方式如何检查谁以及何时锁定和释放给定的监视器?
问题是,正在等待的监视器 object 在技术上不被任何线程持有。 这样的监视器没有“所有者”。 通常,您无法事先知道哪个线程负责调用notify
,因为它可以是任何线程,也可以根本没有线程。
但是,如果已经通知了监视器,则会有一个 JFR 事件,其中包含有关 Notifier Thread 的信息。 您可以在屏幕截图中看到它:监视器由scala-execution-context-global-54
线程通知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.