【发布时间】:2018-09-10 20:09:10
【问题描述】:
我在 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" 。有谁知道我如何获得有关导致锁定的原因的更多信息?
【问题讨论】:
-
您还可以通过在命令行输入
kill -QUIT <processid>来获取线程转储。 FWIW,锁通常不会导致高 CPU。 -
您是否可以更改 JVM 参数?我是的,您可以启用远程 JMX 访问并远程触发线程和堆转储。
标签: java multithreading locking wildfly cpu-usage