Java 如何在内存地址查看对象?

Java 如何在内存地址查看对象?,java,jvm,jvm-crash,Java,Jvm,Jvm Crash,我的进程有一个线程转储和内存转储,其中有一个线程挂起 at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x000000070feebf40> (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)

我的进程有一个线程转储和内存转储,其中有一个线程挂起

at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x000000070feebf40> (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:967)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1283)
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727)
at voldemort.store.readonly.chunk.DataFileChunkSetIterator.<init>(DataFileChunkSetIterator.java:66)
at voldemort.store.readonly.chunk.ChunkedFileSet$ROKeyIterator.<init>(ChunkedFileSet.java:617)
at voldemort.store.readonly.ReadOnlyStorageEngine.keys(ReadOnlyStorageEngine.java:478)
at voldemort.server.protocol.admin.FullScanFetchStreamRequestHandler.<init>(FullScanFetchStreamRequestHandler.java:66)
但我需要查看内存位置0x000000070feebf40上的对象。有没有一种简单的方法可以看到这个物体?YourKit和jvisualvm都看不到此内存地址中的内容

我试着通过实例来寻找,但大多数实例都有300个,这使得分析变得非常困难


我使用了C#,在那里你可以使用WinDbg和sos插件轻松搜索内存

如果您有堆转储和要查找的对象的位置,请在VisualVM中加载该转储,并在OQL控制台中使用以下查询

select heap.findObject("0x00000000fe9d4910")

我不认为0x000000070feebf40是内存中的地址。这是对象标识哈希代码。标识哈希代码是持久性的,但内存中的地址是可变的(GC移动对象)。

在找出内存中的对象之后,您会得到什么?这是
ReentrantReadWriteLock
的一个内部对象,线程停在该对象上等待
acquire
成功(这意味着锁正忙)。要诊断任何真正的问题,最好是调查问题的根源。堆栈的这一部分:

...
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727)
at voldemort.store.readonly.chunk.DataFileChunkSetIterator.<init>(DataFileChunkSetIterator.java:66)
...
。。。
位于java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727)
位于voldemort.store.readonly.chunk.DataFileChunkSetIterator.(DataFileChunkSetIterator.java:66)
...

…表示您正在
DataFileChunkSetIterator
构造函数中查找
ReentrantReadWriteLock.readLock().lock()

伏地魔项目是开源的。为什么不检查源代码看看对象是什么?谢谢你的评论。我有400多个ReentrantReadWriteLock实例,我需要找到线程竞争的实例。一旦我得到了这个,我就可以查看这个对象的引用所在的对象,再往上看,并找出发生了什么。GC移动对象是一个很好的观点。但是地址是真实地址,而不是散列码。当然,在将来,我将在内存转储之前和之后进行线程转储,以确保对象不被移动。您是否能够使用以下命令找到对象:-)?
...
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727)
at voldemort.store.readonly.chunk.DataFileChunkSetIterator.<init>(DataFileChunkSetIterator.java:66)
...