我在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”。有谁知道我如何获得有关导致锁定的原因的更多信息?
答案 0 :(得分:2)
您可以使用ssh进入包装箱吗?
如果您正在使用JDK(而非JRE)运行Java进程,则可以使用jstack
实用程序检查线程的状态。
如果是,则可以使用以下命令立即获取进程中所有线程的线程转储:
jstack <process_id>
您可以使用保存到文件中
jstack <process_id> > <file_name>
然后,您可以在file_name
中检查线程和线程锁的状态。您可能会弄清楚哪些线程被阻塞以及它们持有哪些锁。
jstack
命令不会停止该过程。在正在运行的进程中运行它是安全的。
至少对于所有被阻止的Java应用程序,我将从这种简单的方法开始。