java - 如何确定是什么持有锁并阻塞了我的 Java 线程?
问题描述
我在 Amazon Linux 上使用 Wildfly 11 和 Java 8。我们正在解决 CPU 使用率过高的问题,我们可以使用 Wildfly CLI 工具。我注意到我们的一些 Java 线程已经运行了很长一段时间,并且想找出原因。我找到了一个线程的 ID 并检查了它的状态......
[standalone@localhost:9990 /] /core-service=platform-mbean/type=threading/:get-thread-infos (ids=[2L])
{
"outcome" => "success",
"result" => [{
"thread-id" => 2L,
"thread-name" => "Reference Handler",
"thread-state" => "WAITING",
"blocked-time" => -1L,
"blocked-count" => 48628L,
"waited-time" => -1L,
"waited-count" => 44877L,
"lock-info" => {
"class-name" => "java.lang.ref.Reference$Lock",
"identity-hash-code" => 926576350
},
"lock-name" => "java.lang.ref.Reference$Lock@373a6ede",
"lock-owner-id" => -1L,
"lock-owner-name" => undefined,
"stack-trace" => [],
"suspended" => false,
"in-native" => false,
"locked-monitors" => [],
"locked-synchronizers" => []
}]
}
我对这里的所有内容都没有深入的了解,但似乎一个问题是锁—— "class-name" => "java.lang.ref.Reference$Lock" 。有谁知道我如何获得有关导致锁定的原因的更多信息?
解决方案
你可以使用 ssh 进入盒子吗?
如果您使用 JDK(不是 JRE)运行 Java 进程,您可以使用jstack
实用程序检查线程的状态。
如果是,您可以使用以下方法立即获取进程的所有线程的线程转储:
jstack <process_id>
您可以使用保存到文件中
jstack <process_id> > <file_name>
然后您可以检查file_name
. 您可能会弄清楚哪些线程被阻塞以及它们持有哪些锁。
jstack
命令不会停止该过程。在正在运行的进程上运行它是安全的。
至少我将从这个简单的方法开始,用于任何被阻塞的 Java 应用程序。
推荐阅读
- c# - 列表比较和替换匹配条件linq C#
- swift - Swift - 命名函数类型参数
- sql - ms 访问,需要获取具有不同列的所有行
- c++ - 为什么调用 `lower_bound` 函数不需要`std` 前缀?
- python - 命令无法在新版本的不和谐机器人上工作
- javascript - 为什么小计不能相互加起来?
- javascript - 如果值存在于 CSV Papa Parse 和 jQuery 中
- reactjs - React + Antd + Rollup 组件库“错误:无效的钩子调用。钩子只能在函数组件的主体内部调用”
- php - 如何根据与特殊数据匹配的json列检索数据
- android - 具有超时的 Android Q ConnectivityManager.requestNetwork 显示错误对话框,可停止任何后续请求