2013-06-20 12 views
6

Abbiamo un server di applicazioni JBoss in esecuzione nell'aggiornamento 45 di Java 6. Stiamo eseguendo OutOfMemoryErrors che probabilmente abbiamo introdotto noi stessi. Ci piacerebbe analizzarli e vogliamo creare un dump dell'heap. Questo fallisce con l'eccezione qui sotto.Impossibile creare il dump dell'heap dovuto a ReadVirtual non riuscito

Googling e la ricerca di stackoverflow non mi ha aiutato molto, qualcuno ha un'idea su come ottenere un dump dell'heap da questa macchina?

Grazie!

Martin

L'eccezione è:

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 
+0

[Questo bug] (http://bugs.sun.com/view_bug.do ? bug_id = 6987812) sembra correlato, tuttavia è stato contrassegnato come fisso ... – fge

+0

Sì, quello è uno di i post che ho trovato su Google, ma non dovrebbe essere un problema in un JDK 6u45 ... – SunSear

+0

Forse potresti provare, se possibile, a riprodurre con OpenJDK 6 e aprire un bug se è riproducibile? – fge

risposta

0

Hmm, ha trovato la risposta su un altro sito e questo non sembra funzionare. Ora stiamo chiedendo la JVM per fare un heap dump quando incontra un OutOfMemoryError con le seguenti opzioni:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof 

Come si trova su:

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

+1

Va bene, questo funziona bene se si ha accesso ai parametri di avvio e se il processo non è ancora in esecuzione. Tuttavia, sto anche cercando una soluzione "reale" per sbarazzarsi dell'eccezione. Sfortunatamente, il software viene fornito con una vecchia versione di JRE, motivo per cui l'aggiornamento di JRE non aiuta. Tu/qualcuno hai trovato un altro modo? – Dani

0

Si prega di controllare sotto i punti,

  1. Eseguire la console di comando come Amministratore
  2. versione di JDK (per comando jmap) e JRE (Ambiente di esecuzione dell'app Java) dovrebbe essere lo stesso.
  3. Se ha eccezione con JDK/JRE 7try lo stesso con JDK/JRE 8

In realtà ho dovuto affrontare qualche problema in jmap con JDK 7, ma quando mi sono trasferito a JDK 8, fossi in grado di generare con successo il heap dump usando sotto comando

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

Problemi correlati