其ID比方说,我有这条线从一个线程转储:JAVA查找对象基于从线程转储
waiting to lock <0x0000000301cf21a8> (a foo.bar.MyClass)
我如何才能找到这个对象?我认为调用System.identityHashCode并将其转换为十六进制会做,但它似乎不匹配。
其ID比方说,我有这条线从一个线程转储:JAVA查找对象基于从线程转储
waiting to lock <0x0000000301cf21a8> (a foo.bar.MyClass)
我如何才能找到这个对象?我认为调用System.identityHashCode并将其转换为十六进制会做,但它似乎不匹配。
注意,在你的threaddump行数是虚拟内存地址,没有一个哈希码。
您可以通过内存分析器像Eclipse MAT检查JVM做到这一点。
我参加了example from Oracle demonstrating a deadlock situation,使用jstack
和使用Mat创建了一个线程转储。
"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)
双方都
- 等待锁定< 0x00000000ebd9f320>(一net.noorg.playground.Deadlock $朋友)
和
- 锁定< 0x00000000ebd9f368>(一net.noorg.playground.Deadlock $朋友)
在垫创建堆转储:文件> AQUIRE堆转储>选择过程>完成
打开直方图:
在直方图视图中,您可以过滤使用正则表达式的类名。然后你就可以显示该传出类对象引用:
在参考名单,你会发现对象(或多个)引用该类:
在这种情况下,例如,我们可以看到name
引用(String
对象)和它们各自的值Alphonse
和Gaston
。所以“阿尔方斯”和“加斯东”是这个僵局中的相关方。
笔记,
在服务器可以创建使用堆转储jmap
(作为根或运行该过程的用户):我已经使用@ guillaumegirod-vitouchkina建议
$ jmap -dump:file=heapdump.hprof <PID>
从外观上看,这看起来像一个64位数字而不是32位,所以它绝对不是一个哈希码。它可能是内存地址或其他内部64位标识符。 – RealSkeptic
是的,但任何想法,给定一个对象,我可以得到这个标识符?我尝试使用谷歌搜索线程转储分析,但没有找到这个信息 – duduamar
首先,你可以通过阅读这个地址得到对象的地址: http://stackoverflow.com/questions/8820164/is-there-a-way-得到一个参考地址 –