Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to create heap dump due to ReadVirtual failed

We have a JBoss application server running in Java 6 update 45. We are running into OutOfMemoryErrors that we have most likely introduced ourselves. We'd like to analyze those and want to create a heap dump. This fails with the exception below.

Googling and searching stackoverflow has not helped me much, does anyone have an idea on how to get a heap dump from this machine?

Thanks!

Martin

The exception is:

C:\>"d:\Program Files\Java\bin\"jmap -F "-dump:format=b,file=D:\heapdumps\20130620_085902_heap.dump" 1832
Attaching to process ID 1832, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.45-b01
Dumping heap to D:\heapdumps\20130620_085902_heap.dump ...
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at sun.tools.jmap.JMap.runTool(JMap.java:179)
        at sun.tools.jmap.JMap.main(JMap.java:110)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: ReadVirtual failed!
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readBytesFromProcess0(Native Method)
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readBytesFromProcess(WindbgDebuggerLocal.java:485)
        at sun.jvm.hotspot.debugger.DebuggerBase$Fetcher.fetchPage(DebuggerBase.java:76)
        at sun.jvm.hotspot.debugger.PageCache.getPage(PageCache.java:178)
        at sun.jvm.hotspot.debugger.PageCache.getInt(PageCache.java:96)
        at sun.jvm.hotspot.debugger.DebuggerBase.readCInteger(DebuggerBase.java:355)
        at sun.jvm.hotspot.debugger.DebuggerBase.readCompOopAddressValue(DebuggerBase.java:459)
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readCompOopHandle(WindbgDebuggerLocal.java:332)
        at sun.jvm.hotspot.debugger.windbg.WindbgAddress.getCompOopHandleAt(WindbgAddress.java:122)
        at sun.jvm.hotspot.oops.Oop.getKlassForOopHandle(Oop.java:235)
        at sun.jvm.hotspot.oops.ObjectHeap.newOop(ObjectHeap.java:378)
        at sun.jvm.hotspot.oops.ObjectHeap.iterateLiveRegions(ObjectHeap.java:464)
        at sun.jvm.hotspot.oops.ObjectHeap.iterate(ObjectHeap.java:249)
        at sun.jvm.hotspot.utilities.AbstractHeapGraphWriter.write(AbstractHeapGraphWriter.java:51)
        at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:416)
        at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:56)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
        at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:77)
        ... 6 more
like image 864
SunSear Avatar asked Jun 20 '13 07:06

SunSear


People also ask

Where is heap dump in Linux?

For Linux machine you can use varieties of command like ps -A | grep java or netstat -tupln | grep java or top | grep java , depends on your application. Then you can use the command like jmap -dump:format=b,file=sample_heap_dump. hprof 1234 where 1234 is PID.

What is Heapdump?

The term Heapdump describes the JVM mechanism that generates a dump of all the live objects that are on the Java™ heap, which are being used by the running Java application. There are two dump formats, the text or classic heap dump format and the Portable Heap Dump (PHD) format.

Where is heap dump file created?

By default the heap dump is created in a file called java_pidpid. hprof in the working directory of the VM, as in the example above. You can specify an alternative file name or directory with the -XX:HeapDumpPath= option.


1 Answers

Please check below points,

  1. Run the command console as Administrator
  2. version of JDK (for jmap command) and JRE (Java app run environment) should be same.
  3. If got exception with JDK/JRE 7try the same with JDK/JRE 8

Actually I faced some issue in jmap with JDK 7, but when i moved to JDK 8, I were able to successfully generate the heap dump using below command

jmap -dump:file=d:\heapdump\myHeapDump.hprof -F

like image 148
Anil Agrawal Avatar answered Sep 24 '22 02:09

Anil Agrawal