TOP > 機能紹介 > PerformanceDoctor > ルール詳細 ~メモリリーク

ルール詳細


メッセージ

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

【ルールID】 COD.THRD.MEM_LEAK


メッセージからは、以下の内容がわかります。

  1. 閾値
  2. 対象コレクションの識別子
  3. オブジェクトのサイズ
  4. スレッド
  5. 対象コレクションのクラス名
メモリリークが発生している可能性があります。

問題の概要

メモリリークとは

メモリリークとは不要になったオブジェクトが何らかの理由で解放されず、
メモリ領域を無駄に占拠してしまっている状況です。

メモリ不足によるシステムの停止などの深刻な問題を引き起こす場合があるため、早急な対応が必要です。


ENdoSnipeは、Map、List、Set、Queueなどのコレクション要素が増え続ける場合にメモリリークとして検出します。


※ メモリリークの種別については、コチラをご覧ください。



原因の特定

1.メモリリークの発生を確認します

  1. BottleneckEyeのグラフ画面からメモリリークの発生を確認します。
    PerformanceDoctorの対象コレクション識別子と同じ系列名のグラフをみて、右肩上がりになっていることを確認します。
時間経過とともにリストの要素数が増加しています。

2.メモリリークの発生個所を特定します

  1. PerformanceDoctorで、問題となっているメモリリークのメッセージが選択されていることを確認します。
  2. 詳細ビューにスタックトレースが表示されるので、内容を確認します。
詳細ビューを確認します。

対処

「原因の特定」で問題箇所がわかりました。
No.2で特定したソースコードの内容を確認してください。
この場合は、examples.jsf.logic.impl.EmployeeLogicImpl.javeの710行目を確認します。



補足

メモリリークが発生した場合は、以下のような傾向を示すことがあります。
BottleneckEyeのグラフ画面で確認してください。


グラフ画面グラフ確認内容
CPU/メモリCPU使用率(プロセス)CPU負荷があがるため、CPU使用率が高くなります。
ヒープメモリ使用量メモリ使用量が高くなります。
VM状態GC停止時間頻繁にGCを行うため、停止時間が長くなります。
VMスループット処理に時間がかかるため、VMスループットが低下します。
レスポンス-Webレスポンス時間(最大値)処理時間が長くなります。


設定方法

ENdoSnipeは、Map、List、Set、Queueなどのコレクション要素が増え続ける場合にメモリリークとして検出します。
ENdoSnipeでメモリリークを検出したい場合は、以下の通り設定してください。
設定変更は、Javelinの設定ファイル(javelin.properties)または、BottleneckEyeのコントロール画面から
行うことができます。


No. プロパティ 設定値 概要
1 javelin.leak.collection.monitor true Collectionのメモリリーク検出を行うかどうかを設定します。
2 javelin.leak.collectionSizeThreshold 任意 メモリリークとして検出するCollection、Mapのサイズの閾値を設定します。初期値は50000です。
3 javelin.leak.collectionSizeOut true メモリリークを起こしたCollection、Mapのオブジェクトサイズを出力するかどうかを設定します。


参考

メモリリークに関する参考ページです。ご覧ください。

ENdoSnipe:メモリリーク検出機能
http://www.endosnipe.com/case/memoryleak2.html

Javaトラブルシューティングメールマガジン

Vol.004 プログラムのメモリリークを判定する方法

Vol.005 プログラムのメモリリーク発生箇所を特定する方法 第1回

Vol.006 プログラムのメモリリーク発生箇所を特定する方法 第2回

Vol.007 メモリを大量確保しないアプリケーションでOutOfMemoryErrorが発生