我经常在线程转储中看到锁定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,因为我无法从堆转储中找到它。它是什么?
答案 0 :(得分:0)
您可以将其视为不透明的标识符。关键是其他代码片段可能正在等待特定的锁定,这也会出现在线程转储中。因此,您可以使用它来匹配线程之间的等待和锁定。它也可能出现在JVMs线程转储死锁检测输出中 - 但我不确定。
该条目从同步方法或显式同步块出现在堆栈跟踪中,并与同步的对象相关。
答案 1 :(得分:0)
它是Thread拥有锁的对象的hashcode / id。因为你的线程是RUNNABLE所以其他一些线程可能会或可能不会等待它。如果另一个线程正在等待这个锁,那么你的线程转储将在其他地方显示另一个条目,显示一个BLOCKED或WAITING线程,它等待锁定同一个id,即79f0aad8
但是既然你说你在文件的其他地方找不到这个字符串(79f0aad8),那么:
答案 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());