Jump to content 日本-日本語
日本HPホーム 製品とサービス サポートとドライバ ソリューション ご購入方法
≫  お問い合わせ
日本HPホーム
製品とサービス  >  ソフトウェアとOS  >  HP- UX Developer Edge

メモリ・リークの発見

HP-UX
Developer Edge

設定ガイド(構築手順)
コマンド・リファレンス
ホワイトペーパー
ダウンロード
パートナー製品
技術コラム
特集、特別企画
連載
ダイジェスト
カタログ・ライブラリ
HP-UXサポート
テクニカルドキュメント
HP 教育サービス
HP-UX
  各種ソフトウェア
  書籍の紹介
日本HPサイトマップ
知っておくべきセキュリティ対策
-HP-UXのセキュリティを極める-
特集:Webベースのクラスタ管理〜Serviceguardの新機能〜
HP Serviceguardクラスタ構築手順
コンテンツに進む
メモリ・リークの発見
今回は、Javaプログラムにおけるメモリ・リークの発見方法について説明します。
メモリ・リークの発見
リソースを大量に消費するメソッド・コール
メモリ・リークの発見の方法
2004年7月

リソースを大量に消費するメソッド・コール


Javaパフォーマンス・チューニングのポイントの1つは、実行時間やリソースの大半を消費しているメソッドを見つけ出すことです。前回の連載で紹介したツールHPjmeterは、こうした分析作業に最適な機能を備えています。

図1:HPjmeterによるメソッド呼び出し回数の表示
図1:HPjmeterによるメソッド呼び出し回数の表示

図1は、HPjmeterを利用し、Javaプログラム中のメソッドを呼び出し回数が多い順に一覧表示した画面です。この例では、「bel」メソッドの実行回数が他のメソッドに比べて非常に多いことが示されています。

また、HPjmeterに備わるもうひとつの計測項目である「Exclusive CPU Method Time(CPU占有時間)」を使用すれば、Javaプログラムの各メソッドの実行時間を知ることができます(図2)。

図2:HPjmeterによるメソッド実行時間の表示
図2:HPjmeterによるメソッド実行時間の表示

メモリ・リークの原因を探る


Javaプログラムの開発においてもっとも注意すべきことのひとつとして、JVMのヒープ・メモリ不足があります。Javaプログラムの実行中にJVMのヒープ・メモリが不足すると、OutOfMemoryエラーが発生し、プログラムの実行を継続できなくなったりJVMが異常終了したりします。

本連載の第2回「ガベージ・コレクション」で説明したとおり、Javaオブジェクトが必要とするメモリ領域は、JVMのヒープ・メモリから自動的に割り当てられます。また、不要になった(どこからも参照されなくなった)Javaオブジェクトはガベージ・コレクションによって収集され、そのメモリ領域は自動的に解放されます。よって、メモリ領域の確保や解放をプログラマが意識する必要がありません。そのため、Javaでは、CやC++のようなにメモリ・リークが多発することはなくなりました。

たとえばC++の場合、以下のようなコードによって、メモリ・リークが発生します。

ptr = new LargeObjectType();
//ptrを用いた処理
ptr = null;

ここでは、変数ptrにC++オブジェクトのポインタを割り当て、使用後にnullをセットしています。しかし、正しくは「delete ptr」と記述し、C++オブジェクトのメモリ領域を解放しなくてはなりません。こうしたdeleteし忘れが、C++におけるメモリ・リークのおもな発生原因です。Javaでは、このdeleteに相当する作業をJVMのガベージ・コレクタが実行してくるため、こうしたタイプのメモリ・リークは起こらなくなりました。


メモリ・リテンションとは


しかし、Javaにおいても、メモリ・リークが完全になくなったわけではありません。たとえば、JavaオブジェクトAのオブジェクト変数fooが、JavaオブジェクトBを参照しているケースを考えます。この場合、たとえBがプログラムの処理上は不要になったとしても、fooからBへの参照が存在するかぎり、Bはガベージ・コレクションの対象とはなりません。このように、プログラマが予想しないところでオブジェクトの参照が残ってしまうことを、「メモリ・リテンション」と呼びます。とくに、コレクションや配列を参照元とするメモリ・リテンションが多発すると、解放されないJavaオブジェクトが継続的に増加し、メモリ・リーク状態に陥ります。

トップへ     次のページへ


内容に関するご意見・ご質問・お問い合わせ

 
日本ITフォーラム (別途、会員登録が必要です)
 

本ページの内容は執筆時の情報に基づいており、異なる場合があります。
印刷用画面へ
プライバシー 本サイト利用時の合意事項 ウェブマスターに連絡
© 2008 Hewlett-Packard Development Company, L.P.