假设我从线程转储中获得此行:
waiting to lock <0x0000000301cf21a8> (a foo.bar.MyClass)
我怎样才能找到这个对象?我以为调用System.identityHashCode并将其转换为十六进制就可以,但它似乎不匹配。
答案 0 :(得分:2)
请注意,threaddump行中的数字是虚拟内存地址,没有哈希码。
您可以通过使用Eclipse MAT等内存分析器检查JVM来实现此目的。
我使用example from Oracle demonstrating a deadlock situation,使用jstack
创建了一个threaddump,使用Mat创建了一个heapdump。
"Thread-1" prio=10 tid=0x00007fb0a00bc000 nid=0x5cc4 waiting for monitor entry [0x00007fb098b25000]
java.lang.Thread.State: BLOCKED (on object monitor)
at net.noorg.playground.Deadlock$Friend.bowBack(Deadlock.java:19)
- waiting to lock <0x00000000ebd9f320> (a net.noorg.playground.Deadlock$Friend)
at net.noorg.playground.Deadlock$Friend.bow(Deadlock.java:16)
- locked <0x00000000ebd9f368> (a net.noorg.playground.Deadlock$Friend)
at net.noorg.playground.Deadlock$2.run(Deadlock.java:34)
at java.lang.Thread.run(Thread.java:745)
双方都是
- 等待锁定&lt; 0x00000000ebd9f320 &gt; (一个net.noorg.playground.Deadlock $ Friend)
和
- 已锁定&lt; 0x00000000ebd9f368 &gt; (一个net.noorg.playground.Deadlock $ Friend)
在Mat中创建heapdump:文件&gt; Aquire heapdump&gt; 选择流程&gt;完成强>
打开直方图:
在直方图视图中,您可以使用正则表达式过滤类名。然后,您可以显示该类的传出对象引用:
在参考列表中,您将找到引用该类的对象:
如果是该示例,我们可以看到name
引用(String
个对象)及其各自的值Alphonse
和Gaston
。那么&#34; Alphonse&#34;和#34;加斯顿&#34;是这个僵局的关联方。
请注意,
在服务器上,您可以使用jmap
创建堆转储(以root身份或运行该流程的用户):
$ jmap -dump:file=heapdump.hprof <PID>
答案 1 :(得分:0)
我使用过@guillaumegirod-vitouchkina建议 - 我创建了一个使用Unsafe打印内存地址的小代码,然后我可以将它与我在线程转储中看到的内容进行比较。谢谢!