NetBeans IDEでのエンタープライズ・アプリケーションのプロファイリングNetBeans IDEには、エンタープライズ・アプリケーションの実行時の動作に関する重要な情報を提供できる強力なプロファイリング・ツールが含まれています。プロファイリング・ツールを使用して、簡単にスレッドの状態をモニターしたり、アプリケーションのCPUパフォーマンスやメモリー使用状況に関するデータを取得したりできます。 このドキュメントでは、プロファイリング・ツールを使用して、アプリケーション・サーバーにWARとしてデプロイされている単純なエンタープライズ・アプリケーションに関するデータを取得します。このドキュメントでは、IDEを使用して次に関するプロファイリング結果を取得する方法を示します。
ローカルに登録されたTomcat、GlassFishサーバーまたはJBossインストールにアプリケーションをデプロイしている場合は、ほとんど構成せずに数回のマウス・クリックのみでアプリケーションをプロファイルできます。プロジェクトをプロファイリングするプロセスは、IDEで「実行」コマンドを使用する場合と非常に似ています。メイン・メニューから「プロファイリング」>「メイン・プロジェクトのプロファイル」を選択することで、エンタープライズ・アプリケーション・プロジェクトまたは個々のWebおよびEJBモジュールのプロファイリングを簡単に開始できます。 目次 ![]() このチュートリアルに従うには、次のソフトウェアとリソースが必要です。
注意:
IDEでのエンタープライズ・アプリケーションのプロファイリングについてエンタープライズ・アプリケーションをプロファイリングするときは、ほとんどの場合、アプリケーションのパフォーマンスを解析してプロジェクトのメソッドの実行時間を確認します。これにより、アプリケーションのトラブルシューティングを行い、パフォーマンスの向上を試みることができます。場合によっては、ガベージ・コレクションを最適化するためにメモリー使用状況に関するデータも入手します。 エンタープライズ・アプリケーション、EJBモジュールおよびWebアプリケーションをプロファイリングするためのプロセスは、基本的に「実行」コマンドを使用してプロジェクトを実行する場合と同じです。プロファイリング・タスクを選択し、プロファイリング・オプションを指定したら、「プロファイリング・タスクの選択」ダイアログ・ボックスで「実行」をクリックしてプロファイリング・セッションを開始します。プロファイリング・セッションを開始すると、IDEによって次が実行されます。
プロファイリング・オプションによっては、IDEの「プロファイリングのライブ結果」タブにプロファイリング結果がただちに表示され始めます。プロファイリング用ルート・メソッドを指定したときなど、場合によっては、結果を表示する前にWebブラウザでいくつかのアクションを実行する必要がある場合があります。 エンタープライズ・アプリケーション・プロジェクトのプロファイリングIDEで作成するエンタープライズ・アプリケーションは通常、Webアーカイブ(WAR)としてアプリケーション・サーバーにデプロイされるWebアプリケーション・プロジェクトか、またはWebアプリケーションと追加ライブラリを含み、エンタープライズ・アプリケーション・アーカイブ(EAR)としてデプロイされるエンタープライズ・アプリケーション・プロジェクトのどちらかです。 アプリケーションをEARアーカイブとしてデプロイする場合は、サブプロジェクトとライブラリを含むNetBeansエンタープライズ・アプリケーション・プロジェクトを作成できます。エンタープライズ・アプリケーション・プロジェクトには、ソース・ファイルは含まれず、アプリケーションのビルドとデプロイに関する情報とサーバー構成のメタデータのみが含まれます。エンタープライズ・アプリケーション・プロジェクトでは、一般にアプリケーションのビジネス・ロジックがEJBモジュールに含まれ、プレゼンテーション・レイヤーのソース・コードがWebモジュールに含まれます。 エンタープライズ・アプリケーション・プロジェクトのすべてのソースが存在する場合、アプリケーションをプロファイリングする最も適切で簡単な方法は、プロジェクトの1つのサブプロジェクトではなく、エンタープライズ・アプリケーション・プロジェクトをプロファイルすることです。これにより、必要なすべてのコードがコンパイルおよびデプロイされ、アプリケーションが正常に動作します。次のいずれかを実行することで、エンタープライズ・アプリケーション・プロジェクトをプロファイルできます。
エンタープライズ・アプリケーションをプロファイリングするときは、プロファイリング用ルート・メソッドを指定し、インストゥルメント・フィルタを使用してプロファイルされるクラスを制限することにより、プロファイリング結果の関連性を高めることができます。これは、プロファイリングのオーバーヘッドがアプリケーションのパフォーマンスに与える影響を最小限に抑え、プロファイリング結果の関連性を高めるのに役立ちます。 Webアプリケーションと異なり、エンタープライズ・アプリケーションを実行するときは、ブラウザが常に自動的に開くとはかぎりません。(これはプロジェクトの構成によって異なります。)これは、場合によってはWebアプリケーションのフロント・エンドを手動で起動してから、EJBモジュール内のビジネス・ロジックなどのコードをWebブラウザから呼び出す必要があることを意味します。 EJBおよびWebモジュール・サブプロジェクトのプロファイリング任意のEJBモジュールまたはWebモジュール・プロジェクトからプロファイリング・セッションを開始できます。この場合、次のいずれかの方法を試すことをお薦めします。
サンプル・プロジェクトの作成このドキュメントでは、ServletStatelessサンプル・アプリケーションをプロファイルします。ServletStatelessアプリケーションは、IDEにサンプル・プロジェクトとして含まれている単純なエンタープライズWebアプリケーションです。 ServletStatelessアプリケーションを作成するには、次の手順を実行します。
「終了」をクリックすると、IDEによってServletStatelessサンプル・プロジェクトが作成されます。「プロジェクト」ウィンドウにServletStatelessプロジェクトが表示されます。 注意:
アプリケーションのモニタリングアプリケーションをモニタリングすると、スレッドのアクティビティやメモリーの割当てなど、ターゲットJVMのプロパティに関する概要を取得できます。アプリケーションのモニタリングにかかるオーバーヘッドは非常に低いため、このモードではアプリケーションを長時間実行できます。「モニター」タスクを選択した場合、ターゲット・アプリケーションはインストゥルメントなしで起動されます。 ServletStatelessアプリケーションをモニターするには、次の手順を実行します。
「実行」をクリックすると、IDEによってアプリケーションがビルドされ、プロファイル・モードでサーバーが起動され、サーバーにアプリケーションがデプロイされます。次に、IDEがアプリケーションにアタッチされ、データの取得が開始されます。 ターゲットJVM内のスレッド上のデータが「スレッド」タブに表示されます。「スレッド」タブには、すべてのスレッド、サーバー・スレッドおよびアプリケーション内のスレッド上のデータが表示されます。 「プロファイラ」ウィンドウの「遠隔測定の概要」ボタンをクリックして「VM遠隔測定の概要」ウィンドウを開くことにより、追加のモニタリング情報を表示できます。「VM遠隔測定の概要」ウィンドウでは、モニタリング・データの概要をリアル・タイムですばやく取得できます。「VM遠隔測定の概要」ウィンドウ内のいずれかのグラフをダブルクリックすると、そのグラフのより大きいバージョンを開くことができます。 エンタープライズ・アプリケーションをモニタリングするときは、メモリー(ヒープ)グラフとメモリー(GC)グラフを使用して、アプリケーションのメモリー使用状況をすばやく確認できます。グラフの上にカーソルを置くと、詳細情報を示すツールチップを開くことができます。ヒープ・サイズや生存中世代の数が徐々に増加している場合は、メモリー・リークを示している可能性があります。メモリー・リークが疑われる場合は、アプリケーションのメモリー使用状況をプロファイルすることをお薦めします。 ![]() アプリケーションのパフォーマンスの解析「CPUパフォーマンスを解析」タスクを使用して、アプリケーションのメソッド・レベルのCPUパフォーマンス(実行時間)とメソッドが呼び出された回数に関するデータを確認できます。アプリケーション全体のパフォーマンスを解析するか、またはプロファイリング・ルートを選択してプロファイリングをアプリケーション・コードの一部に制限するかを選択できます。 ![]() 「プロファイリング・タスク」ウィンドウで「CPUパフォーマンスを解析」タスクを選択したときは、次のいずれかのオプションを選択することで、プロファイルするアプリケーションの部分を選択できます。
Webアプリケーションのプロファイリングに関するヒント
注意:Windowsマシン上のGlassFishアプリケーション・サーバーでWebアプリケーションをプロファイリングする場合、スペースが使用されているパス(デフォルトのC:\Program Files\netbeans-7.4へのインストールなど)にNetBeans IDEがインストールされていると、プロファイリング用サーバーの起動が失敗することがあります。これを回避するには、NetBeans IDEのインストール・ディレクトリをパスにスペースが含まれない場所(C:\netbeans-7.4など)にインストールまたはコピーします。 アプリケーションのサンプリングアプリケーション全体の動作の概要が必要であり、メソッドをインストゥルメントしない場合は、簡易オプションを選択してください。簡易プロファイル・モードでは、IDEが定期的にスタック・トレースを取得します。簡易プロファイル・モードのオーバーヘッドは、詳細プロファイル・モードより少なくなります。 この課題では、簡易プロファイル・モードを選択して、アプリケーションのパフォーマンスを解析します。
![]() 「プロファイリングのライブ結果」タブで、Servlet2Statelessクラス内のサーブレットのserviceメソッドの実行時間と、このメソッドが1回呼び出されたことを確認できます。 すべてのメソッドのインストゥルメント「アプリケーションをプロファイル」モードでは、アプリケーションのメソッドがインストゥルメントされます。アプリケーションのパフォーマンスをより正確に測定できますが、プロファイリングのオーバーヘッドはサンプル・モードを選択した場合より大きくなります。プロファイリング用ルート・メソッドを指定すると、インストゥルメントされるメソッドが制限され、プロファイリングのオーバーヘッドを削減できます。一部のアプリケーションでは、アプリケーション全体をプロファイリングすると、大量のプロファイリング・データが生成されてアプリケーションが使用できなくなるか、またはアプリケーションがクラッシュする原因になる可能性があるため、ルート・メソッドを指定することが、詳細な、または現実的なパフォーマンス・データを取得するための唯一の方法である場合があります。 この課題では、エンタープライズ・アプリケーション内のすべてのメソッドをインストゥルメントすることにより、アプリケーションのパフォーマンスを解析します。
「ドリルダウン」ボタンをクリックすると、サーブレットやリスナーなど、アプリケーションの様々な領域で費やされた相対的な時間のグラフィカル表現を表示できます。グラフィックをクリックして、表示されているプロファイリング結果にドリルダウンできます。 ![]() アプリケーションのインストゥルメントでは、アプリケーションをプロファイリングするときに常にある程度のオーバーヘッドが発生します。このような単純なアプリケーションではオーバーヘッドがあまり目立ちませんが、複雑なアプリケーションではオーバーヘッドがかなり大きくなる可能性があります。プロファイリング用ルート・メソッドを選択してプロファイルされるクラスを制限することで、オーバーヘッドを削減できます。 プロファイリング用ルート・メソッドの使用この課題では、アプリケーションの一部のみをプロファイルします。パフォーマンスのボトルネックがどこにあるかわかっていると思われる場合や、コードの特定の部分(たとえば、1つまたは少数のサーブレットのみ)をプロファイルする場合は、このプロファイリング方法を使用するようにしてください。この方法では通常、プロファイリングによって発生するオーバーヘッドが、すべてのアプリケーション・メソッドをインストゥルメントする場合に比べてかなり小さくなります。アプリケーションの一部のみをインストゥルメントすることで、本当に必要なデータのみが収集され、表示されます。 アプリケーションの一部をプロファイルするには、1つまたは複数のプロファイリング用ルート・メソッドを設定する必要があります。IDEは、プロファイリング用ルート・メソッドに入っているスレッドによってコールされたメソッドのみをインストゥルメントします。たとえば、StatelessSessionBeanクラスのsayHelloメソッドをルート・メソッドとして設定し、「プロジェクト・クラスだけをプロファイル」フィルタを使用すると、このメソッドが呼び出され、アプリケーション・スレッドがこのメソッドに入ったときにIDEがメソッドのインストゥルメントを開始します。このアプリケーションでは、initコンストラクタはsayHelloの前に呼び出されるため、インストゥルメントされません。 ![]() 「すべてのクラスをプロファイル」フィルタを選択すると、IDEはsayHelloによってコールされたJavaコア・クラスを含むすべてのメソッドをインストゥルメントします。 ![]() 注意: より複雑なアプリケーションでは、複数のルート・メソッドを指定することもできます。個々のメソッド、クラス全体およびパッケージをプロファイリング・ルートとして選択できます。 プロファイリング・ルートを指定してアプリケーションのパフォーマンスを解析するには、次の手順を実行します。
インストゥルメント・フィルタの使用CPUパフォーマンスを解析するときは、ドロップダウン・リストからインストゥルメント・フィルタを選択し、プロファイリングを必要なソース・コードに制限することで、プロファイリングのオーバーヘッドを削減できます。フィルタを使用して、インストゥルメントされるパッケージまたはクラスを指定できます。次のデフォルト・フィルタから選択するか、カスタム・フィルタを作成できます。
カスタム・フィルタを作成して、特定のプロジェクトや特定タイプのプロファイリングで使用できます。たとえば、Oracle WebLogic Server上のWebアプリケーションをプロファイリングするときに使用するインストゥルメント・フィルタが必要な場合は、「フィルタ・セットを編集」をクリックして、Javaコア・クラス、Oracle WebLogicクラスおよびNetBeansクラスを除外するフィルタ・セットを作成できます(HTTPモニターが有効になっている場合に便利です)。フィルタ・セットに「WebLogic Webapp Exclusive」などの名前を設定しておき、WebLogicサーバーにデプロイされたアプリケーションをプロファイリングするときに、「フィルタ」ドロップダウン・リストからそのフィルタを選択できます。 ![]() 「フィルタ」ドロップダウン・リストから「簡易フィルタ」を選択し、「簡易フィルタの設定」ダイアログ・ボックスを開くことで、簡易なインストゥルメント・フィルタを定義できます。インストゥルメントされるパッケージまたはクラスの一覧をすばやく編集できます。これにより、「フィルタ」ドロップダウン・リストから選択できる簡易フィルタが作成されます。 ![]() インストゥルメント・フィルタの定義と使用の詳細は、IDEのプロファイリングに関するドキュメントを参照してください。 アプリケーションのメモリー使用状況の解析IDEのプロファイリング・ツールを使用して、エンタープライズ・アプリケーションのメモリー使用状況を解析し、オブジェクト割当てやガベージ・コレクションに関する詳細なデータを取得できます。「メモリー使用状況を解析」タスクによって、ターゲット・アプリケーション内で割り当てられているオブジェクトに関するデータ(割り当てられたオブジェクトの数、型、場所など)が提供されます。 メモリー使用状況をプロファイリングするときは、プロファイリング用ルート・メソッドやインストゥルメント・フィルタを設定できないため、サーバーの実行中に作成されたすべてのオブジェクトがトラックされます。このため、複雑なアプリケーション・サーバーでは、プロファイリングのオーバーヘッドやメモリーの消費量が大きくなる可能性があります。したがって、このタイプのプロファイリングを実行する前に、マシンの潜在的な制限事項について知っておくようにしてください。プロファイリングのオーバーヘッドを軽減するため、10個に1個の割合でのみオブジェクトをプロファイルするように設定を変更できます。オブジェクト割当てのスタック・トレースの記録を無効化(制限)することもできます。 メモリー・リークを検出するためにエンタープライズ・アプリケーションをプロファイリングするときは、「生存中世代」のメトリックを使用すると非常に便利なことがあります。このツールは、ガベージ・コレクションのサイクルを経て生存する様々なオブジェクト世代の数をトラックすることにより、アプリケーションのメモリー使用量が著しく大きくなる前にメモリー・リークを検出できます。 メモリー・パフォーマンスを解析するには、次のオプションのいずれかを選択することによって、取得するデータの量を選択します。
「詳細」オプションを選択した場合は、次のオプションも設定できます。
「プロファイリング・タスクの選択」ウィンドウの「オーバーヘッド」メーターは、ユーザーが選択したプロファイリング・オプションに応じて、プロファイリングのオーバーヘッドの大まかな増減を示します。 ここで、IDEを使用してエンタープライズ・アプリケーションのメモリー・パフォーマンスを解析します。存続している世代に関する情報を取得する場合は、「詳細」オプションを選択する必要があります。または、ライブ・オブジェクトに関するデータが必要な場合は、簡易オプションを選択できます。
「実行」をクリックすると、IDEによってアプリケーションがコンパイルされ、プロファイル・モードでサーバーが起動され、サーバーにアプリケーションがデプロイされます。プロファイリング結果を表示するには、「プロファイラ」ウィンドウ内の「ライブ結果」をクリックして「ライブ結果」ウィンドウを開きます。「ライブ結果」ウィンドウに、ターゲットJVMに割り当てられたオブジェクトのサイズと数に関する情報が表示されます。結果には、エンタープライズ・アプリケーションによって割り当てられたオブジェクトに加えて、アプリケーション・サーバーによって割り当てられたオブジェクトもすべて含まれています。 ![]() デフォルトでは、結果は「ライブ・バイト数」の数でソートされて表示されますが、列ヘッダーをクリックすると結果の表示方法を変更できます。また、リストの下にあるフィルタ・ボックスにクラス名を入力して結果をフィルタすることもできます。 関連項目このドキュメントでは、GlassFishアプリケーション・サーバーにデプロイされたエンタープライズ・アプリケーションをプロファイリングするときにプロファイリング・データを取得する基本的な方法について説明しました。 このドキュメントで説明されていないプロファイリング設定および機能の詳細は、製品に含まれ、「ヘルプ」メニュー項目から使用できるドキュメントを参照してください。
関連ドキュメントについては、次のリソースを参照してください。
|
Documentation |