首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找出持有锁并阻塞我的Java线程的是什么?

如何找出持有锁并阻塞我的Java线程的是什么?
EN

Stack Overflow用户
提问于 2018-09-11 04:09:11
回答 1查看 1K关注 0票数 1

我在Amazon Linux上使用带有Java 8的Wildfly 11。我们正在解决CPU利用率过高的问题,并且可以使用Wildfly CLI工具。我注意到我们的一些Java线程已经运行了相当长的一段时间,并想找出原因。我找到了一个线程的ID并检查了它的状态...

代码语言:javascript
复制
[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”。有谁知道我怎样才能获得更多关于锁的原因的信息?

EN

回答 1

Stack Overflow用户

发布于 2018-09-11 04:40:35

您能使用ssh到达机器吗?

如果您正在使用JDK (而不是JRE)运行Java process,那么您可以使用jstack实用程序检查线程的状态。

如果是,您可以使用以下命令立即获得进程的所有线程的线程转储:

代码语言:javascript
复制
jstack <process_id>

您可以使用以下命令保存到文件中

代码语言:javascript
复制
jstack <process_id> > <file_name>

然后,您可以在file_name中检查线程和线程锁的状态。您可能会找出哪些线程被阻塞,以及它们持有哪些锁。

jstack命令不会停止进程。在正在运行的进程上运行它是安全的。

至少,对于任何被阻塞的Java应用程序,我将从这个简单的方法开始。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52264794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档