TOP > 導入事例・解決事例 > メモリーリークの解決
解決事例

メモリーリークの解決

Jakarta Commons DBCPを利用したプログラムのメモリ使用量が上昇し続ける問題に対して、
ENdoSnipeを利用した問題発見・解析・対処の具体例をご紹介いたします。

※メモリリークについての詳細はこちらのページをご参照ください。

Jakarta Commons DBCP利用中にメモリリーク発生!!

シーン1

メモリ使用量の増加を発見。

プログラムにENdoSnipeを適用したところ、
BottleneckEyeのグラフより物理メモリ・仮想マシンメモリの増加を検出しました。

時間経過とともにメモリ使用量が上昇しています。

シーン2

仮想マシンメモリの増加から以下の可能性が考えられます。

メモリリークの原因と対策

シーン3

HashSet、HashMapの要素数増加を発見。

BottleneckEyeのグラフより、要素数の増加を検出しました。

複数のHashMapをメモリリーク対象として検出しました。

シーン4

メモリリーク箇所を特定。

ENdoSnipeではコンテナクラスに閾値以上の要素数が追加された場所を記録しています。
この箇所からメモリリークの原因を調査していきます。

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

シーン5

該当ソースコードから以下の結果が判明。

Jakarta Commons DBCPのPrepared Statementプーリング機能には次の特徴があります。
●プーリングしたPrepared Statementオブジェクトは接続が破棄されるまで開放されることはありません。
●このため、次の条件を満たすプログラムではPrepared Statementオブジェクトが大量にプーリングされ、
 メモリ使用量を増加させます。

  1)時刻ごとに変化し続けるSQL文をパラメータ化せずに発行する。
  2)一つの接続を再利用し続ける。

シーン6

対策

シーン7

対策結果

メモリリーク対処をしたプログラムに再度ENdoSnipeを適用したところ、メモリ使用量の増加が検出されなくなりました。

メモリ使用量が増加しないことを確認しました。

※メモリリークについての詳細はこちらのページをご参照ください。