如何查看内存地址处的对象?

How to view Object at Memory Address?

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

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)

在 voldemort.server.protocol.admin.FullScanFetchEntriesRequestHandler.(FullScanFetchEntriesRequestHandler.java:53)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

但我需要查看内存位置 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)
...

...意味着您正在 DataFileChunkSetIterator 构造函数中寻找 ReentrantReadWriteLock.readLock().lock()