Sler系SEの技術ブログ
ヒープダンプを簡単に取得するメモ #Windows #Java

kght6123

経緯
過去に、タスクマネージャやJconsoleで負荷を見つつ、
ヒープダンプを随時取得しメモリーリークの証拠を得たいことがあり、調べた内容のメモになります。
JVMベースの言語は多いので、参考になれば・・・?と思います
ヒープダンプの取得方法
主に、VMオプションを指定し、OutOfMemoryエラーが発生した際に取得する方法と、
jmapコマンドを使って取得する方法の二つがあります。
今回は随時、取得したいので、VMオプションとjmapコマンドを組み合わせました。
- OutOfMemoryError発生時に取得するオプション
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dump-oome.hprof - jmapコマンドで取得する
%JAVA_HOME%/bin/jmap -dump:format=b,file=heapdump_manual.hprof %PID%
毎回、コマンドプロンプト開いて実行するのは、面倒ですよね。。。
バッチファイル化
そこで、バッチファイルを実行して、PIDと名称を入力すれば、
カレントフォルダに名称+PID付きのダンプファイルを取得するバッチファイルを作りました。
デスクトップや、作業フォルダに置いておくと、実行したい時にすぐ実行できるので便利です。
バッチファイルの内容はこんな感じです。
rem heapdump.bat
@echo off
SET /P "NAME=名前を入力してください>"
SET /P "PID=PIDを入力してください>"
set TIME_TMP=%time: =0%
set NOW=%date:/=%%TIME_TMP:~0,2%%TIME_TMP:~3,2%%TIME_TMP:~6,2%
%JAVA_HOME%\bin\jmap.exe "-dump:format=b,file=%~dp0\heapdump-%PID%-%NAME%-%NOW%.hprof" %PID%
rem -Fを付けると強制
rem %JAVA_HOME%\bin\jmap.exe "-F" "-dump:format=b,file=%~dp0\heapdump-%PID%-%NAME%-%NOW%.hprof" %PID%
@echo on
簡単で申し訳ない。。。。
バッチファイルの解説
まず、SET /P でファイル名とPIDの標準入力できる様にします。
PIDはjconsoleや、タスクマネージャでわかり、名前は適当に分かりやすい名前にしてください。
次に、NOW変数にファイル名の為の現在日時を格納します。
ファイル名にしたいので、記号や空白文字を空文字に置き換えて、数字だけにします。
最後に、jmapコマンドで、ヒープダンプを取得します。
format=bのオプションは、Eclipse Memory Analyzerで分析する為に付与しています。
ちなみにjmapコマンドのオプションに、-Fを付与すると、強制でヒープダンプを取得します。