首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java线程转储中,锁id是什么意思?

在java线程转储中,锁id是什么意思?
EN

Stack Overflow用户
提问于 2014-12-11 14:02:21
回答 3查看 733关注 0票数 0

我通常在线程转储中观察到锁id (如下所示):

代码语言:javascript
复制
"Thread-pool-Bill" - Thread t@42
   java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    - locked <79f0aad8> (a java.net.SocksSocketImpl)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 

locked <79f0aad8> (a java.net.SocksSocketImpl)中,79f0aad8是什么意思?它似乎既不是对象地址,也不是对象id,因为我在堆转储中找不到它。那它是什么呢?

EN

回答 3

Stack Overflow用户

发布于 2014-12-11 15:09:31

hotspot JVM内部锁构造(监视器对象)的地址。

代码语言:javascript
复制
code for your reference
    oop o = _locked_monitors->at(i);
    instanceKlass* ik = instanceKlass::cast(o->klass());
    st->print_cr("\t- locked <" INTPTR_FORMAT "> (a %s)", (address)o, ik->external_name());

票数 1
EN

Stack Overflow用户

发布于 2014-12-11 14:10:02

你可以认为它是一个不透明的标识符。关键是其他代码片段可能正在等待那个特定的锁,它也会出现在线程转储中。所以你可以用它来匹配线程之间的等待和锁。它也可能出现在JVM线程转储死锁检测输出中--但我不确定。

该条目出现在来自synchronized方法或显式synchronized块的堆栈跟踪中,并且与上同步的对象相关。

票数 0
EN

Stack Overflow用户

发布于 2014-12-11 14:14:27

它是线程拥有锁的对象的hashcode/id。因为你的线程是可运行的,所以其他一些线程可能正在等待,也可能没有。如果另一个线程正在等待这个锁,那么线程转储的另一个条目将在其他地方显示一个阻塞的或等待锁定的线程,该线程正在等待同一id上的锁,即79f0aad8

但是由于您说您在文件中的其他地方找不到这个字符串(79f0aad8),所以:

  • 您有多个线程转储文件或
  • 线程t@42在进行线程转储时没有阻塞任何其他线程。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27416364

复制
相关文章

相似问题

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