Java 线程转储分析:如何找到有关发生死锁的对象的更多信息?

问题描述 投票:0回答:1

我有一个 Java 线程转储,它清楚地表明我的应用程序中存在死锁:

"pool-2-thread-1":
  waiting to lock monitor 0x00007f17b0040120 (object 0x00000000f731a9e0, a com.MyClass),
  which is held by "pool-6-thread-1"

"pool-6-thread-1":
  waiting to lock monitor 0x00007f17b803cfc0 (object 0x00000000f72e7e90, a com.MyOtherClass),
  which is held by "pool-2-thread-1"

现在我想了解哪些特定对象是锁,这两个线程正在等待。我有类名,但我的应用程序中有很多这种类型的实例。我想了解哪个特定实例导致了此问题。理想的方法是打印该实例的 toString() 。

所以问题是:

  1. “0x00007f17b803cfc0”是什么意思?
  2. 如何在“0x00007f17b803cfc0”和 JVM 中的对象之间建立关系?
java jvm deadlock thread-dump
1个回答
0
投票

0x00007f17b803cfc0 是对象在内存中所在的地址。您可以进行堆转储,然后使用转储分析器找到该对象。要进行转储,您可以使用 jmap 命令,要在某个地址查找对象,您可以使用 VisualVM。

这是获取转储的示例

jmap -dump:live,format=b,file=heapdump.hprof <PID>
© www.soinside.com 2019 - 2024. All rights reserved.