企業IT最適化のゴールを目指す

メモリリークが多発! メモリの開放漏れはこうやって見つけるCosminexus V8 Review

システムダウンやスローダウンを招くWebアプリケーションサーバのメモリリーク。Cosminexusのメモリ解析機能はこのメモリリークの回避を支援する。

» 2009年02月09日 08時00分 公開
[ITmedia]

メモリリークの原因究明は困難

 Javaアプリケーションにおける不要なJavaオブジェクトは、Java VMが自動的に判断をしてガベージコレクション(GC)を行い、使用メモリを開放している。Java VMが自動判断を行う条件としてはJavaオブジェクトが使われなくなったこと、すなわち他のJavaオブジェクトから参照されなくなったことであるが、この参照が意図しないところで残っていることがある。これがメモリリークにつながり、最終的にはメモリ不足でシステムダウンという現象を引き起こす。

 メモリリークの典型的な例として、アプリケーションプログラムのモジュール間で共用するテーブルなどに登録していくオブジェクトの登録解除漏れや、決まった時間だけ使用するキャッシュなどの削除漏れがある。このメモリリークを発見することはなかなか難しく、アプリケーション開発者がアプリケーションプログラムにデバッグロジックを埋め込んだり、解析ツールを適用して原因を特定する方法が一般的に行われている。

 しかし、多くの場合は大量のログ出力に伴う負荷や解析ツールの負荷を伴うため、本番の運用環境での適用は制限される。また、デバッグロジックの埋め込みや解析ツールの適用によりアプリケーションプログラムの挙動が変わってしまう場合もあり原因究明がより困難になる。

メモリリークへの対処は難しい

Cosminexus標準搭載のJavaVMのヒープ領域状態表示で原因を素早く特定

 この問題を解決するのがCosminexusのメモリ解析機能である。標準搭載されているJava VMにヒープ領域の状態を表示する機能があらかじめ組み込まれているため、アプリケーションプログラムの変更は不要であり、本番環境での適用も可能である。特に外部コマンドにからの適用であることからサーバの再起動をすることなく情報を採取できるのである。表示される情報は、実際のヒープ領域を走査していることから、アプリケーションプログラムのコーデイングを机上で追いかけても見過ごしてしまうバグを発見できる。

 ヒープ領域の状態を表示する機能には統計情報出力と参照関係情報出力がある。

(a)統計情報出力機能

 統計情報出力機能は、オブジェクトサイズの統計情報であり、各クラスが何個のインスタンスオブジェクトを生成していて合計サイズがどのくらいかを知ることができる。これによりどのクラスがメモリを圧迫しているか、また存在していないはずのクラスの存在を見つけることもでき、メモリリークの発見を可能にする。

(b)参照関係情報出力機能

 参照関係情報出力機能は、特定のクラスのインスタンスと参照関係にあるインスタンスを表示する。これは例えば1つ目の機能であるクラスが予定外に大きい場合や削除しているはずなのに残存している場合などにそのクラスが何のクラスから参照されているかを知ることができ、問題の参照関係を究明することができる。さらに、このインスタンスがヒープ領域上のNew領域やOld領域などどの領域に存在していることも表示するようにしており、より細かいメモリリーク解決を支援している。

メモリの参照関係情報出力例

 次回はJavaバッチアプリケーションの実行について解説する。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ