2015-10-04 42 views
0

其ID比方说,我有这条线从一个线程转储:JAVA查找对象基于从线程转储

waiting to lock <0x0000000301cf21a8> (a foo.bar.MyClass) 

我如何才能找到这个对象?我认为调用System.identityHashCode并将其转换为十六进制会做,但它似乎不匹配。

+0

从外观上看,这看起来像一个64位数字而不是32位,所以它绝对不是一个哈希码。它可能是内存地址或其他内部64位标识符。 – RealSkeptic

+0

是的,但任何想法,给定一个对象,我可以得到这个标识符?我尝试使用谷歌搜索线程转储分析,但没有找到这个信息 – duduamar

+1

首先,你可以通过阅读这个地址得到对象的地址: http://stackoverflow.com/questions/8820164/is-there-a-way-得到一个参考地址 –

回答

0

- 我创建了一个小的代码,其使用Unsafe打印内存地址,然后我可以将其与线程转储中看到的内容进行比较。谢谢!

+0

你能分享代码吗? :) – weima

2

注意,在你的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堆转储>选择过程>完成

打开直方图:

How to open the histogram view

在直方图视图中,您可以过滤使用正则表达式的类名。然后你就可以显示该传出类对象引用:

Histogram View filtered by class name

在参考名单,你会发现对象(或多个)引用该类:

Outgoing object references of that class

在这种情况下,例如,我们可以看到name引用(String对象)和它们各自的值AlphonseGaston。所以“阿尔方斯”和“加斯东”是这个僵局中的相关方。

笔记,

  • ,服用堆转储可以采取取决于堆大小和系统性能
  • 期间转储过程中,JVM暂停serveral的分钟。这可能导致建立的网络连接或事务超时。
  • 和堆转储将包含类似数据库的密码,客户密码,私钥,用户数据等敏感信息所以你应该小心处理转储(不通过不安全的连接传输它或将其存储在未加密的地方)!

在服务器可以创建使用堆转储jmap(作为根或运行该过程的用户):我已经使用@ guillaumegirod-vitouchkina建议

$ jmap -dump:file=heapdump.hprof <PID> 
+0

这很好,但是我希望能够知道在运行时没有提取堆 - 这会导致应用程序挂起很长时间,这在生产中我不能允许。 – duduamar

+0

优秀的答案! – isapir

+0

如果我可以不止一次地提出你的答案,我会有:) – isapir