我有一个 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() 。
所以问题是:
0x00007f17b803cfc0 是对象在内存中所在的地址。您可以进行堆转储,然后使用转储分析器找到该对象。要进行转储,您可以使用 jmap 命令,要在某个地址查找对象,您可以使用 VisualVM。
这是获取转储的示例
jmap -dump:live,format=b,file=heapdump.hprof <PID>