2014-12-11 76 views
0

我平时观察到的锁的ID(如下)在线程转储:什么是锁的ID在Java线程转储意味着

"Thread-pool-Bill" - Thread [email protected] 
    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,因为我无法从堆转储中找到它。那它是什么?

回答

0

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

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

0

其线程拥有锁的对象的哈希码/ ID。既然你的线程是RUNNABLE,所以其他线程可能会或可能不会等待它。如果另一个线程正在等待此锁,那么线程转储将在另一个地方显示阻塞或等待线程正在等待锁定在相同的ID上,即79f0aad8

但是既然你说你找不到这个字符串(79f0aad8 )在文件中其他地方所以无论是:

  • 你有多个线程转储文件或
  • 线程线程t @ 42拍摄的线程转储时未阻止任何其他线程。
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());