daybreaksnow's diary

私を私と呼びたい

Javaメモリリーク調査ログ(Linux)

CentOS6.4で動いているプロセスを対象に、以下の2点を調査した。

  • 起動直後、取込後、再取込後のヒープ使用量を取得し、どのオブジェクトが増えている(残り続けている)のか調べる
  • GCのログを取り、メモリリークがないか調べる

ヒープダンプ調査手順

  1. linux-x64用のJDKをダウンロード(jmapがJDKに含まれるため)
  2. 検証環境にコピー、JDKのtar解凍
  3. psで調査対象のプロセスIDを取得
  4. jmapでダンプ取得

    jdk/bin/jmap -dump:format=b,file=XXX.hprof プロセスID
    

    Dumping heap to /home/hoge/jdk/XXX.hprof...
    と表示されるのでしばらく待つ。


  5. WinSCPでダンプファイルを受け取り、Eclipse Memory Analyzerのヒストグラムでメモリ上のインスタンスを確認する

Java実行オプション

調査対象のVM引数に以下を追加

 -XX:+PrintGCTimeStamps
 -Xloggc:gc.log
 -XX:+PrintGCDetails
 -XX:+HeapDumpOnOutOfMemoryError

tomcat

以下のファイルを作成
・ /usr/local/tomcat7/bin/setenv.sh

CATALINA_OPTS="$CATALINA_OPTS -XX:+PrintGCDetails -Xloggc:/home/tomcat_gc.log"

※-XX:+PrintGCTimeStampsは認識されなかったが、自動で付加されていた


ダンプを取るのに利用したシェル

#!/bin/sh

# 引数チェック
if [ $# -lt 2 ]; then
 echo 引数に出力先ファイル名、PIDを指定してください。
 exit 1
fi

OUT_FILE=$1
PID=$2
OPT=$3
DATE=`date +%y%m%d`_`date +%H%M`

/home/hoge/tool/jdk1.7.0_21/bin/jmap ${OPT} -dump:format=b,file=${OUT_FILE}_${DATE}.hprof ${PID}