【发布时间】:2020-08-03 10:04:31
【问题描述】:
我遇到了性能问题(在使用并行集合和期货的复杂 Scala 代码中)。我使用 JFR 检查了更多细节,我可以看到问题表现为一个线程在等待监视器对象(该线程似乎正在通过调用 wait 的 ForkJoinTask 方法在 java.util.concurrent.ForkJoinTask#internalWait 中等待)。我想知道哪个线程持有这个监视器对象(以及从哪个函数/调用堆栈输入了监视器)。 JFR 向我显示了某种监视器地址,但我没有找到按此地址搜索/过滤的方法。
JMC 中是否有一些视图、插件或其他方式来检查谁以及何时锁定和释放给定的监视器?
【问题讨论】:
-
"jstack -l pid" 应该可以工作,不知道如何在 JFR 中做到这一点。
-
监视器等待时间不够长,我无法手动触发 jstack(通常不到 1 秒)。我能够指示 JFR 每秒进行一次线程转储,这通常会达到所需的时间范围,但是我只能看到这些转储中的线程调用堆栈,而不是所采用的监视器列表。
标签: java multithreading scala jvm jfr