我通常在线程转储中观察到锁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,因为我在堆转储中找不到它。那它是什么呢?
发布于 2014-12-11 15:09:31
hotspot 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());
发布于 2014-12-11 14:10:02
你可以认为它是一个不透明的标识符。关键是其他代码片段可能正在等待那个特定的锁,它也会出现在线程转储中。所以你可以用它来匹配线程之间的等待和锁。它也可能出现在JVM线程转储死锁检测输出中--但我不确定。
该条目出现在来自synchronized方法或显式synchronized块的堆栈跟踪中,并且与上同步的对象相关。
发布于 2014-12-11 14:14:27
它是线程拥有锁的对象的hashcode/id。因为你的线程是可运行的,所以其他一些线程可能正在等待,也可能没有。如果另一个线程正在等待这个锁,那么线程转储的另一个条目将在其他地方显示一个阻塞的或等待锁定的线程,该线程正在等待同一id上的锁,即79f0aad8
但是由于您说您在文件中的其他地方找不到这个字符串(79f0aad8),所以:
https://stackoverflow.com/questions/27416364
复制相似问题