実習 1.2: ヒープ・ダンプのキャプチャー
始める前に、実習 1.1: 必要なリソースのインポートを完了する必要があります。
シナリオ
Web プロキシー・アプリケーションの一部として 3 層からなるキューイング・システムがあるとします。キューイング・システムの各層にはそれぞれ独自のキューがあります。テスト・チームは、アプリケーションがメモリー・リークを起こしていると判断し、それがキューイング・システムにあるのではないかと推測しています。
あなたは、そのキューのうちの 1 つの開発者として、どの層がメモリー・リークの原因になっているのかを調べる業務を与えられました。
概要
メモリー・リークの分析を実行するには、2 つの Java ヒープ・ダンプをキャプチャーする必要があります。
ヒープとは、Java 仮想マシン (JVM) の実行中に Java オブジェクトを格納するために使用するメモリー・ブロックです。Java のヒープ・メモリーは、ガーベッジ・コレクターによって管理されており、参照されなくなった Java オブジェクトのメモリー割り当ては自動的に解除されます。
ヒープ・ダンプとは、ある特定の瞬間におけるヒープ内容のイメージです。
アプリケーション実行中の 2 つの時点の間に、メモリー使用量がどの程度変化しているかを調べるために、2 つのヒープ・ダンプが必要になります。組み込みのアルゴリズムでヒープを比較し、メモリー内にある不要になったオブジェクトを識別します。
アルゴリズムは、潜在的なリークを識別するために次の指標を分析します: 2 回のヒープ・ダンプの間に常にメモリー内に
存在するオブジェクト、2 回目のヒープにおける特定のクラスのオブジェクト数、そして、オブジェクトに対する参照の数です。
ヒープ・ダンプのキャプチャーの準備
ヒープ・ダンプをキャプチャーするには、「プロファイルおよびロギング」パースペクティブに切り替える必要があります。
- 「ソフトウェア開発プラットフォーム (Software Development Platform)」メニュー・バーから、「ウィンドウ」>「パースペクティブを開く」>「その他」を順にクリックします。「パースペクティブの選択」ダイアログ・ボックスが開きます。
- ダイアログ・ボックスの左下部分にある「すべて表示」をクリックします。チェック・ボックスにチェック・マークが付きます。
- パースペクティブのリストから、「プロファイルおよびロギング」を選択して「OK」をクリックします。
- 「使用可能化の確認」ダイアログ・ボックスが開いたら、「常に機能を使用可能にし、今後このメッセージを表示しない」をクリックして、次に「OK」をクリックします。
- 「ソフトウェア開発プラットフォーム (Software Development Platform)」から「プロファイルおよびロギング」パースペクティブに切り替わります。
ヒープ・ダンプのキャプチャー
このチュートリアルのために、ヒープ・ダンプのキャプチャーを手動で行います。(代わりに、時間間隔をセットしてヒープ・ダンプを自動でキャプチャーするか、既存のヒープ・ダンプをインポートすることもできます。)
ヒープ・ダンプをキャプチャーするには
- アプリケーションを実行します。
- メニュー・バーから「実行」>「プロファイル」を順にクリックします。 「プロファイル」ダイアログ・ボックスが開きます。
- 「構成」リストで、「Java アプリケーション」をダブルクリックします。リスト内に「New_configuration」エントリーが表示されます。
- 「名前」フィールドに「ThreeTierQueue_MemLkAnalysis」と入力します。
- 「メイン」タブで、「プロジェクト」フィールドの横にある「参照」をクリックします。「プロジェクトの選択」ダイアログ・ボックスが開きます。
- 「ThreeTierQueue」を選択して「OK」をクリックします。
- 「メイン・クラス」フィールドの横にある「検索」をクリックします。
- 「メイン型の選択」ダイアログ・ボックスで「TestThreeTierQueue」を選択してから「OK」をクリックします。
- 「プロファイル」ダイアログ・ボックスで「プロファイル作成」タブをクリックします。
- 「概要」サブタブで、「メモリー・リーク分析 - 手動ヒープ・ダンプ (Memory Leak Analysis - Manual heap dumps)」プロファイル・セットのチェック・ボックスにチェック・マークを付けます。(「プロファイル・セット」は、実行時に収集されるプロファイル・データのタイプを定義します。)
- 「プロファイル」をクリックします。アプリケーションが実行され、画面表示が次のように切り替わります。
- プロセスに対する「プロファイル」リソースと、「自動リーク分析 (Automatic Leak Analysis)」のプロファイル・タイプを表示するエントリーが、プロファイル・モニターに表示されます。
- 「リーク候補 (Leak Candidates)」ビューが開き、次に行う指示を伴う「現在の状況 (Current Status)」メッセージが表示されます。
注: Agent Controller が使用不可であるというセキュリティー・メッセージを受け取った場合は、データの収集に失敗したときをお読みください。
- ヒープ・ダンプのキャプチャー
- メニュー・バーから、「ウィンドウ」>「ビューの表示」>「コンソール」を順にクリックして「コンソール」ビューを開き、アプリケーションの処理を追跡することができます。
- 30 秒ほどアプリケーションを立ち上げたままにしておき、プロファイルを作成したいすべてのクラスがロードされ初期化されたことを確認します。
- 「リーク候補 (Leak Candidates)」ビューの指示に従い、「ヒープ・ダンプのキャプチャー (Capture Heap Dump)」ツールバー・ボタン
をクリックして、ヒープ比較の開始点となる基本のヒープ・ダンプをキャプチャーします。プロファイル・モニターに、ヒープ・ダンプを表示するための追加のエントリーが表れます。
- しばらくの間、アプリケーションを実行させたままにして、もう一度「リーク候補 (Leak Candidates)」ビューの指示に従って 2 回目のヒープ・ダンプを同じようにキャプチャーします。
プロファイル・モニターに、2 回目のヒープ・ダンプのエントリーが表示されます。
- 「コンソール」ビューの「終了」ボタン
をクリックして、プロセスを終了します。
データの収集に失敗したとき
プロファイル・データを収集する前に、あらかじめ Agent Controller を実行している必要があります。Agent Controller が使用できないというメッセージを受け取った場合、Agent Controller がインストール済みであることを確認してから、手動で起動して、もう一度試してみてください。インストールの詳細については、インストール・ガイドを参照してください。インストール・ガイドには、LaunchPad を使用してアクセスできます。また、製品 CD の disk1/install.html からもご利用になれます。
データの収集を終えたら、実習 1.3: リーク候補の分析を開始する準備が整いました。