JAVA根据来自线程转储的id查找对象

时间:2015-10-04 06:11:17

标签: java thread-dump

假设我从线程转储中获得此行:

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

我怎样才能找到这个对象?我以为调用System.identityHashCode并将其转换为十六进制就可以,但它似乎不匹配。

2 个答案:

答案 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;完成

打开直方图:

How to open the histogram view

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

Histogram View filtered by class name

在参考列表中,您将找到引用该类的对象:

Outgoing object references of that class

如果是该示例,我们可以看到name引用(String个对象)及其各自的值AlphonseGaston。那么&#34; Alphonse&#34;和#34;加斯顿&#34;是这个僵局的关联方。

请注意,

  • 采取堆转储可能需要几分钟,具体取决于堆大小和系统性能
  • 在转储过程中,JVM暂停。这可能会导致已建立的网络连接或事务超时。
  • 并且heapdump将包含敏感信息,如数据库密码,客户密码,私钥,用户数据等。因此,您应小心处理转储(不通过不安全的连接传输或未加密存储)!

在服务器上,您可以使用jmap创建堆转储(以root身份或运行该流程的用户):

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

答案 1 :(得分:0)

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