2013-06-20 37 views
6

Mamy serwer aplikacji JBoss działający w aktualizacji Java 6 45. Występujemy w OutOfMemoryErrors, które najprawdopodobniej wprowadziliśmy sami. Chcielibyśmy je przeanalizować i chcieć utworzyć zrzut sterty. Nie powiedzie się to z wyjątkiem poniżej.Nie można utworzyć zrzutu sterty ze względu na błąd ReadVirtual

Googlowanie i wyszukiwanie stackoverflow nie pomogło mi wiele, czy ktoś ma pomysł, jak uzyskać zrzut sterty z tego komputera?

Dzięki!

Martin

Wyjątkiem jest:

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

[Ten błąd] (http://bugs.sun.com/view_bug.do ? bug_id = 6987812) wydaje się być spokrewniony, jednak został oznaczony jako naprawiony ... – fge

+0

Tak, to jeden z posty, które znalazłem w Googlingu, ale nie powinno to być problemem w JuK 6u45 ... – SunSear

+0

Może mógłbyś spróbować, jeśli to możliwe, odtworzyć za pomocą OpenJDK 6 i otworzyć błąd, jeśli jest on odtwarzalny? – fge

Odpowiedz

0

Hmm, znaleźć odpowiedź na innej stronie internetowej, to nie wydają się działać. Jesteśmy teraz z prośbą JVM zrobić zrzut stosu po napotkaniu OutOfMemoryError z następujących opcji:

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

Jak znaleźć na stronie:

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

+1

W porządku, działa to dobrze, jeśli masz dostęp do parametrów uruchamiania i jeśli proces nie jest jeszcze uruchomiony. Jednak także szukam "prawdziwego" rozwiązania, aby pozbyć się wyjątku. Niestety, oprogramowanie jest dostarczane ze starą wersją JRE, dlatego aktualizacja JRE nie pomaga. Czy ktoś inny znalazł inną drogę? – Dani

0

Proszę sprawdzić poniżej punktach

  1. Uruchom konsolę poleceń jako Administrator
  2. wersja JDK (dla polecenia jmap) i środowisko JRE (Środowisko uruchomieniowe aplikacji Java) powinno być takie samo.
  3. Jeśli dostaje wyjątek z JDK/JRE 7try samo z JDK/JRE 8

Właściwie wychodził jakiś problem w jmap z JDK 7, ale gdy przeniósł się do JDK 8, ja byliśmy w stanie skutecznie generowania zrzut stosu za pomocą poniższego polecenia

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