锁定id在java线程转储中意味着什么

时间:2014-12-11 06:02:21

标签: java multithreading

我经常在线程转储中看到锁定id(如下所示):

"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,因为我无法从堆转储中找到它。它是什么?

3 个答案:

答案 0 :(得分:0)

您可以将其视为不透明的标识符。关键是其他代码片段可能正在等待特定的锁定,这也会出现在线程转储中。因此,您可以使用它来匹配线程之间的等待和锁定。它也可能出现在JVMs线程转储死锁检测输出中 - 但我不确定。

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

答案 1 :(得分:0)

它是Thread拥有锁的对象的hashcode / id。因为你的线程是RUNNABLE所以其他一些线程可能会或可能不会等待它。如果另一个线程正在等待这个锁,那么你的线程转储将在其他地方显示另一个条目,显示一个BLOCKED或WAITING线程,它等待锁定同一个id,即79f0aad8

但是既然你说你在文件的其他地方找不到这个字符串(79f0aad8),那么:

  • 您有多个线程转储文件或
  • 线程在获取线程转储时,线程t @ 42没有阻塞任何其他线程。

答案 2 :(得分:0)

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

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());