6

Java 6 アップデート 45 で実行されている JBoss アプリケーション サーバーがあります。それらを分析し、ヒープ ダンプを作成したいと考えています。これは、以下の例外で失敗します。

グーグルとstackoverflowの検索はあまり役に立ちませんでした。このマシンからヒープダンプを取得する方法について誰か考えがありますか?

ありがとう!

マーティン

例外は次のとおりです。

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
4

2 に答える 2

1

以下の点をご確認の上、

  1. コマンド コンソールを管理者として実行します。
  2. JDK(jmapコマンド用)とJRE(Javaアプリ実行環境)のバージョンが同じである必要があります。
  3. JDK/JRE 7 で例外が発生した場合は、JDK/JRE 8 で同じことを試してください。

実際、JDK 7 の jmap でいくつかの問題に直面しましたが、JDK 8 に移行すると、以下のコマンドを使用してヒープ ダンプを正常に生成できました。

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

于 2016-12-21T07:18:13.320 に答える
0

うーん、別のウェブサイトで答えを見つけましたが、これはうまくいくようです。次のオプションを使用して、JVM が OutOfMemoryError に遭遇したときにヒープ ダンプを作成するように要求しています。

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

次の場所で見つかりました:

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

于 2013-07-15T13:53:07.453 に答える