読者です 読者をやめる 読者になる 読者になる

jmapを使ったメモリダンプ解析(ヒープダンプ)

javaプロセスのメモリダンプを取れるツールがJ2SE1.5から導入されている。
しかし、普通にJavaプロセスIDを指定しても以下のようなエラーが出てしまう。

# jmap 14022
Attaching to process ID 14022, please wait...
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypeEntryTypeNameOffset" in any of the known library names (libjvm.so, libjvm_g.so, gamma_g)
        at sun.jvm.hotspot.HotSpotTypeDataBase.lookupInProcess(HotSpotTypeDataBase.java:388)
        at sun.jvm.hotspot.HotSpotTypeDataBase.getLongValueFromProcess(HotSpotTypeDataBase.java:369)
        at sun.jvm.hotspot.HotSpotTypeDataBase.readVMTypes(HotSpotTypeDataBase.java:102)
        at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:85)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:568)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:494)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:332)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
        at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:39)
        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:178)
        at sun.tools.jmap.JMap.main(JMap.java:110)
Debugger attached successfully.
sun.jvm.hotspot.tools.HeapSummary requires a java VM process/core!


いろいろ調べたところ
jmap -dump:format=b,file=heapDump.snapshot [PID]
でやるとちゃんととれる。

  • dump引数をちゃんと書かないとだめってことなんだろうか。

http://java.sun.com/javase/ja/6/docs/ja/technotes/tools/share/jmap.html

このユーティリティーはサポート対象外であり、将来の JDK のバージョンでは利用できなくなる可能性があります。

とあるとおりまだ試用版みたいですね。


出力されたデータ形式はバイナリになっているので、Memory Analyzerを使って中身を解析します。
http://www.eclipse.org/mat/
こりゃ使える