java - 如何检查哪个线程正在持有监视器?
问题描述
我有一个性能问题(在使用并行集合和期货的复杂 Scala 代码中)。我已经使用 JFR 检查了更多细节,我可以看到问题表现为一个线程在等待监视器对象(线程似乎java.util.concurrent.ForkJoinTask#internalWait
通过调用 的wait
方法等待ForkJoinTask
)。我想知道哪个线程持有这个监视器对象(以及从哪个函数/调用堆栈输入了监视器)。JFR 向我显示了某种监视器地址,但我没有找到按此地址搜索/过滤的方法。
JMC中是否有一些视图,插件或其他方式如何检查谁以及何时锁定和释放给定的监视器?
解决方案
问题是,正在等待的监视器对象在技术上不被任何线程持有。这样的监视器没有“所有者”。通常,您无法事先知道哪个线程负责调用notify
,因为它可以是任何线程,也可以根本没有线程。
但是,如果已经通知了监视器,则会有一个 JFR 事件,其中包含有关 Notifier Thread 的信息。您可以在屏幕截图中看到它:监视器是通过scala-execution-context-global-54
线程通知的。
推荐阅读
- scala - scala 2.11 的 spark-redis 连接器
- mocha.js - Mocha --recursive 标志抛出错误
- algorithm - 计算从网格中的一个正方形到达另一个正方形的步数,并将其用于 A* 算法中的 h 成本
- c++ - mbed os 5 c++ 编程
- ios - tableView 上的 UIPanGestureRecognizer 不滚动表项
- c# - 更改 REST API 响应以从 VSTS 工具获取测试运行结果
- jenkins - 如何使用 httprequest 插件 jenkins 发送文件(zip)
- django - django - 如何保存表单的用户信息?
- javascript - 在函数内部调用类方法
- excel - Excel vba - 如何在单元格中找到第 8 位数字并评估它是否正确