我有一个线程转储和我的进程的内存转储,其中一个线程挂起
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)
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插件轻松搜索内存。
答案 0 :(得分:1)
如果您有堆转储和您尝试查找的对象的位置,请在VisualVM中加载该转储并在OQL控制台中使用以下查询
select heap.findObject("0x00000000fe9d4910")
答案 1 :(得分:0)
我认为0x000000070feebf40不是内存中的地址。这是对象标识哈希码。标识哈希码是持久的,但内存中的地址是易失性的(GC移动对象)。
答案 2 :(得分:0)
在计算出内存中的对象后,你究竟会得到什么?这是ReentrantReadWriteLock
的内部对象,线程停在该对象上等待acquire
成功(这意味着锁正忙)。要诊断任何真正的问题,最好是查看源代码。这部分堆栈:
...
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727)
at voldemort.store.readonly.chunk.DataFileChunkSetIterator.<init>(DataFileChunkSetIterator.java:66)
...
...表示您在ReentrantReadWriteLock.readLock().lock()
构造函数中寻找DataFileChunkSetIterator
。