= メモリリークの解消法 = == ガベージコレクション頻度のログをとり、それを可視化する == 目的:GCの頻度とヒープ領域使用量のざっくりとした状況を把握する。 === VM引数の-Xloggcを使用して、GCのログをファイルに記録する。 === 以下はlogディレクトリのgc.logファイルに書き込む例。 {{{ java -Xloggc:log/gc.log server.jar }}} === GCViewerを使う === [[http://www.tagtraum.com/gcviewer-download.html|gcviewer]]をインストールし、先のgc.logを読み込ませる。 {{attachment:gcviewer.png}} グラフの各要素の意味は以下の通り。 {{attachment:gcviewer2.png}} == Eclipse Memory Analyzerを使う == 目的:メモリリークが確実な場合に、リークの原因(どのオブジェクトがリークしているか)を把握する。 === 実行中のVMのヒープ状態をダンプする === JDKに付属のjmapコマンドを使用する。 ==== Linuxの場合 ==== {{{ jmap -heap:format=b プロセス番号 }}} ==== Windowsの場合 ==== jpsコマンドを使用して実行中のVMのプロセス番号を特定する。 {{{ jmap -dump:format=b,file=heap.bin プロセス番号 }}} いずれの場合にもheap.binというファイルにヒープ状態が格納される。 === Eclipse Memory Analyzer(MAT)を使う === 利用中のEclipseに組み込む必要はない。スタンドアロンのアプリケーションを以下からダウンロードし、解凍して実行する。 [[http://www.eclipse.org/mat/|http://www.eclipse.org/mat/]] ==== heap.binの準備 ==== MATにheap.binを読み込ませると、heap.binと同じフォルダに作業用ファイルを勝手に作成してしまう。このため、新しいフォルダを作成してそこにheap.binを移動しておく。 ==== heap.binの読込み ==== File>Open Heap Dumpで読み込ませる。