TOP > 導入事例・解決事例 > メモリーリーク検出機能
解決事例

メモリーリーク検出機能

このページでは、ENdoSnipeのメモリリーク検出と原因箇所特定の機能に関する利用事例を紹介します

メモリリークの種別


Javaのメモリは主に以下の2区分に分かれおり、その区分ごとにメモリリークの発生要因は異なります。

メモリリークの種類と要因

従来のメモリリーク調査方法


従来のメモリリークの調査方法は、以下のように様々なコマンドを使って行うのが一般的でした。
  ■ jstatコマンドでJavaヒープの表示
  ■ GCログの取得
  ■ PrintClassHistgram結果の取得
  ■ psコマンド、vmstatコマンド、タスクマネージャなどでプロセス情報の取得

このように従来の手法では、各コマンドについての知識に加えて、多大な時間が必要です。
ENdoSnipeはこの問題対応コストを劇的に削減することができます。

ENdoSnipeのメモリリーク対応機能(1)


ENdoSnipeでは対象プロセスの各種情報を簡単に取得・グラフ化することが可能です。
  1.Javaヒープ・プロセス全体・システム全体のメモリ使用量、 スワップ領域のサイズを蓄積することができます。
  2.リアルタイムに更新されるグラフからメモリリークの発生を簡単に発見できます。

メモリ使用量の推移を表示

※CSVエクスポートのボタンを押せば、データをCSV形式で保存できます。

メモリの単調な増加がある場合にはメモリリークの可能性があります。

ENdoSnipeのメモリリーク対応機能(2)


GC停止時間や要素数の多いコレクション(List、Map、Set、Queueなど)の要素数を検出・グラフ化することも可能です。

要素数の多いコレクション(List、Map、Set、Queue)を自動的に検出

GC時間が徐々に伸びていることから、メモリ使用量が増加していることが推測できます。

メモリリークしている可能性があります。

ENdoSnipeのメモリリーク対応機能(3)


さらにENdoSnipeでは、メモリリーク発生箇所を特定することが可能です。
閾値(設定可能)を超えるデータの生成・追加処理を検出し、該当箇所を記録します。

メモリリークの発生時刻と発生箇所のスタックトレースを記録します。

DDDMake.java 292行目でArrayListに対するメモリリークが発生している可能性があります。

ENdoSnipeのメモリリーク対応機能(4)


さらにJDK6.0以降のJavaVMを利用している場合には、ENdoSnipeでヒープ上のオブジェクトごとの
インスタンス数・メモリ使用量を取得・グラフ化することが可能です。

JDK6.0以降では、オブジェクトごとのインスタンス数、サイズをグラフで表示できます。

この例ではオブジェクトサイズ・オブジェクト数ともにjava.util.Dateが単調増加しています。
このため、java.util.Dateを利用している箇所でメモリリークしている可能性があります。