経緯
過去に、タスクマネージャや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付きのダンプファイルを取得するバッチファイルを作りました。
デスクトップや、作業フォルダに置いておくと、実行したい時にすぐ実行できるので便利です。
バッチファイルの内容はこんな感じです。
簡単で申し訳ない。。。。
バッチファイルの解説
まず、SET /P でファイル名とPIDの標準入力できる様にします。
PIDはjconsoleや、タスクマネージャでわかり、名前は適当に分かりやすい名前にしてください。
次に、NOW変数にファイル名の為の現在日時を格納します。
ファイル名にしたいので、記号や空白文字を空文字に置き換えて、数字だけにします。
最後に、jmapコマンドで、ヒープダンプを取得します。
format=bのオプションは、Eclipse Memory Analyzerで分析する為に付与しています。
ちなみにjmapコマンドのオプションに、-Fを付与すると、強制でヒープダンプを取得します。