「見える化」でJavaシステムを診断する
このページでは、ENdoSnipeのメモリリーク検出と原因箇所特定の機能に関する利用事例を紹介します
Javaのメモリは主に以下の2区分に分かれおり、その区分ごとにメモリリークの発生要因は異なります。
従来のメモリリークの調査方法は、以下のように様々なコマンドを使って行うのが一般的でした。
■ jstatコマンドでJavaヒープの表示
■ GCログの取得
■ PrintClassHistgram結果の取得
■ psコマンド、vmstatコマンド、タスクマネージャなどでプロセス情報の取得
このように従来の手法では、各コマンドについての知識に加えて、多大な時間が必要です。
ENdoSnipeはこの問題対応コストを劇的に削減することができます。
ENdoSnipeでは対象プロセスの各種情報を簡単に取得・グラフ化することが可能です。
1.Javaヒープ・プロセス全体・システム全体のメモリ使用量、スワップ領域のサイズを蓄積することができます。
2.リアルタイムに更新されるグラフからメモリリークの発生を簡単に発見できます。
※CSVエクスポートのボタンを押せば、データをCSV形式で保存できます。
メモリの単調な増加がある場合にはメモリリークの可能性があります。
GC停止時間や要素数の多いコレクション(List、Map、Set、Queueなど)の要素数を検出・グラフ化することも可能です。
GC時間が徐々に伸びていることから、メモリ使用量が増加していることが推測できます。
メモリリークしている可能性があります。
さらにENdoSnipeでは、メモリリーク発生箇所を特定することが可能です。
閾値(設定可能)を超えるデータの生成・追加処理を検出し、該当箇所を記録します。
DDDMake.java 292行目でArrayListに対するメモリリークが発生している可能性があります。
さらにJDK6.0以降のJavaVMを利用している場合には、ENdoSnipeでヒープ上のオブジェクトごとの
インスタンス数・メモリ使用量を取得・グラフ化することが可能です。
この例ではオブジェクトサイズ・オブジェクト数ともにjava.util.Dateが単調増加しています。
このため、java.util.Dateを利用している箇所でメモリリークしている可能性があります。