blob: 906bb325e64e7d3db4735e3b878d83bf0ecf6700 [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= NetBeans IDEでのエンタープライズ・アプリケーションのプロファイリング
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: NetBeans IDEでのエンタープライズ・アプリケーションのプロファイリング - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, NetBeans IDEでのエンタープライズ・アプリケーションのプロファイリング
NetBeans IDEには、エンタープライズ・アプリケーションの実行時の動作に関する重要な情報を提供できる強力なプロファイリング・ツールが含まれています。プロファイリング・ツールを使用して、簡単にスレッドの状態をモニターしたり、アプリケーションのCPUパフォーマンスやメモリー使用状況に関するデータを取得したりできます。
このドキュメントでは、プロファイリング・ツールを使用して、アプリケーション・サーバーにWARとしてデプロイされている単純なエンタープライズ・アプリケーションに関するデータを取得します。このドキュメントでは、IDEを使用して次に関するプロファイリング結果を取得する方法を示します。
* アプリケーションの実行時動作
* アプリケーションのメソッドによって使用されたCPU時間
* オブジェクト作成
ローカルに登録されたTomcatGlassFishサーバーまたはJBossインストールにアプリケーションをデプロイしている場合は、ほとんど構成せずに数回のマウス・クリックのみでアプリケーションをプロファイルできます。プロジェクトをプロファイリングするプロセスは、IDEで「実行」コマンドを使用する場合と非常に似ています。メイン・メニューから「プロファイリング」>「メイン・プロジェクトのプロファイル」を選択することで、エンタープライズ・アプリケーション・プロジェクトまたは個々のWebおよびEJBモジュールのプロファイリングを簡単に開始できます。
*このチュートリアルに従うには、次のソフトウェアとリソースが必要です。*
|===
|ソフトウェアまたはリソース |必須バージョン
|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |7.3、7.4、8.0、Java EEバンドル版
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java Development Kit (JDK)+] |JDK 7または8
|GlassFishサーバー |3.1, 4.0
|===
[NOTE]
====
* プロファイラを初めて使用する場合は、タスクのモニタリングとプロファイリングの概要について説明しているlink:../java/profiler-intro.html[+NetBeans IDEでのJavaアプリケーションのプロファイリングの概要+]を読むことをお薦めします。
* NetBeans IDE 7.2またはそれ以前を使用している場合は、link:../../72/javaee/profiler-javaee.html[+NetBeans IDE 7.2でのエンタープライズ・アプリケーションのプロファイリング+]を参照してください。
* このドキュメントでは、GlassFishサーバーにデプロイされたエンタープライズ・アプリケーションをプロファイルします。開発中にエンタープライズ・アプリケーションまたはWebアプリケーションをプロファイリングする場合に推奨される最も単純な構成は、アプリケーションをローカルのTomcatGlassFishまたはJBossサーバー上で実行しているときです。
====
== IDEでのエンタープライズ・アプリケーションのプロファイリングについて
エンタープライズ・アプリケーションをプロファイリングするときは、ほとんどの場合、アプリケーションのパフォーマンスを解析してプロジェクトのメソッドの実行時間を確認します。これにより、アプリケーションのトラブルシューティングを行い、パフォーマンスの向上を試みることができます。場合によっては、ガベージ・コレクションを最適化するためにメモリー使用状況に関するデータも入手します。
エンタープライズ・アプリケーション、EJBモジュールおよびWebアプリケーションをプロファイリングするためのプロセスは、基本的に「実行」コマンドを使用してプロジェクトを実行する場合と同じです。プロファイリング・タスクを選択し、プロファイリング・オプションを指定したら、「プロファイリング・タスクの選択」ダイアログ・ボックスで「実行」をクリックしてプロファイリング・セッションを開始します。プロファイリング・セッションを開始すると、IDEによって次が実行されます。
* アプリケーションをコンパイルする
* ターゲット・サーバーをプロファイリング・モードで起動する
* アプリケーションをデプロイする
* アプリケーションにアタッチする
* WebブラウザでWebページを開く(プロジェクト・プロパティで指定された場合)
* 「プロファイリングのライブ結果」タブを開く
プロファイリング・オプションによっては、IDEの「プロファイリングのライブ結果」タブにプロファイリング結果がただちに表示され始めます。プロファイリング用ルート・メソッドを指定したときなど、場合によっては、結果を表示する前にWebブラウザでいくつかのアクションを実行する必要がある場合があります。
=== エンタープライズ・アプリケーション・プロジェクトのプロファイリング
IDEで作成するエンタープライズ・アプリケーションは通常、Webアーカイブ(WAR)としてアプリケーション・サーバーにデプロイされるWebアプリケーション・プロジェクトか、またはWebアプリケーションと追加ライブラリを含み、エンタープライズ・アプリケーション・アーカイブ(EAR)としてデプロイされるエンタープライズ・アプリケーション・プロジェクトのどちらかです。
アプリケーションをEARアーカイブとしてデプロイする場合は、サブプロジェクトとライブラリを含むNetBeansエンタープライズ・アプリケーション・プロジェクトを作成できます。エンタープライズ・アプリケーション・プロジェクトには、ソース・ファイルは含まれず、アプリケーションのビルドとデプロイに関する情報とサーバー構成のメタデータのみが含まれます。エンタープライズ・アプリケーション・プロジェクトでは、一般にアプリケーションのビジネス・ロジックがEJBモジュールに含まれ、プレゼンテーション・レイヤーのソース・コードがWebモジュールに含まれます。
エンタープライズ・アプリケーション・プロジェクトのすべてのソースが存在する場合、アプリケーションをプロファイリングする最も適切で簡単な方法は、プロジェクトの1つのサブプロジェクトではなく、エンタープライズ・アプリケーション・プロジェクトをプロファイルすることです。これにより、必要なすべてのコードがコンパイルおよびデプロイされ、アプリケーションが正常に動作します。次のいずれかを実行することで、エンタープライズ・アプリケーション・プロジェクトをプロファイルできます。
* エンタープライズ・アプリケーション・プロジェクトがメイン・プロジェクトとして設定されている場合は、IDEツールバーから「メイン・プロジェクトのプロファイル」をクリックするか、メイン・メニューで「プロファイル」>「メイン・プロジェクトのプロファイル」を選択します。
* 「プロジェクト」ウィンドウでエンタープライズ・アプリケーション・プロジェクトのノードを右クリックし、ポップアップ・メニューから「プロファイル」を選択します。
エンタープライズ・アプリケーションをプロファイリングするときは、プロファイリング用ルート・メソッドを指定し、インストゥルメント・フィルタを使用してプロファイルされるクラスを制限することにより、プロファイリング結果の関連性を高めることができます。これは、プロファイリングのオーバーヘッドがアプリケーションのパフォーマンスに与える影響を最小限に抑え、プロファイリング結果の関連性を高めるのに役立ちます。
Webアプリケーションと異なり、エンタープライズ・アプリケーションを実行するときは、ブラウザが常に自動的に開くとはかぎりません。(これはプロジェクトの構成によって異なります。)これは、場合によってはWebアプリケーションのフロント・エンドを手動で起動してから、EJBモジュール内のビジネス・ロジックなどのコードをWebブラウザから呼び出す必要があることを意味します。
=== EJBおよびWebモジュール・サブプロジェクトのプロファイリング
任意のEJBモジュールまたはWebモジュール・プロジェクトからプロファイリング・セッションを開始できます。この場合、次のいずれかの方法を試すことをお薦めします。
* *EJBモジュールのプロファイリング。*この方法を選択した場合、EJBモジュール・プロジェクトは一般にWebブラウザを開くように構成されていないため、通常はWebブラウザまたは別のクライアントからアプリケーション・コードを手動で呼び出す必要があります。EJBモジュールがサーバーにデプロイされたら、アプリケーション機能のデバッグや評価の場合と同じ方法で(通常はWebアプリケーションのフロント・エンドを起動してから、Webブラウザでアクションを実行することにより)、そのコードをコールするようにしてください。
* *Webモジュールのプロファイリング。*この方法を選択した場合は、Webモジュール・プロジェクトをプロファイリングする前に、EJBモジュールをコンパイルしてサーバーにデプロイする必要があります。通常、EJBのコードはブラウザ内でのなんらかのユーザー・アクションの結果として実行されます。このアクションがWebアプリケーション・コードによって実行または処理されると、EJBコードがそのコール・ツリーに表示されます。
== サンプル・プロジェクトの作成
このドキュメントでは、ServletStatelessサンプル・アプリケーションをプロファイルします。ServletStatelessアプリケーションは、IDEにサンプル・プロジェクトとして含まれている単純なエンタープライズWebアプリケーションです。
ServletStatelessアプリケーションを作成するには、次の手順を実行します。
1. メイン・メニューから「ファイル」>「新規プロジェクト」([Ctrl]-[Shift]-[N]、Macの場合は[⌘]-[Shift]-[N])を選択します。
2. 新規プロジェクト・ウィザードで、「サンプル」>「Java EE」カテゴリを選択します。
3. Servlet Statelessプロジェクトを選択します。「次」をクリックします。
4. プロジェクトの場所を指定します。「終了」をクリックします。
「終了」をクリックすると、IDEによってServletStatelessサンプル・プロジェクトが作成されます。「プロジェクト」ウィンドウにServletStatelessプロジェクトが表示されます。
[NOTE]
====
* デフォルトでは、IDEを使用してプロジェクトをプロファイルすると、複数のプロジェクトが開いている場合は、「プロジェクト」ウィンドウで選択したプロジェクトがプロファイルされます。メイン・メニューから「実行」>「メイン・プロジェクトとして設定」を選択し、プロジェクトをメイン・プロジェクトとして設定した場合は、メイン・プロジェクトがデフォルトでプロファイルされます。「プロジェクト」ウィンドウでプロジェクト・ノードを右クリックし、ポップアップ・メニューから「プロファイル」を選択できます。
* ``.jsp`` ページやサーブレットなどのファイルをプロファイルする場合は、そのファイルを右クリックして、ポップアップ・メニューから「ファイルをプロファイル」を選択します。動作は「(メイン)プロジェクトをプロファイル」とほぼ同じですが、プロファイリング・セッションを開始すると、プロジェクトのデフォルトのWebページではなく、選択されたWebページがブラウザで開きます。
====
== アプリケーションのモニタリング
アプリケーションをモニタリングすると、スレッドのアクティビティやメモリーの割当てなど、ターゲットJVMのプロパティに関する概要を取得できます。アプリケーションのモニタリングにかかるオーバーヘッドは非常に低いため、このモードではアプリケーションを長時間実行できます。「モニター」タスクを選択した場合、ターゲット・アプリケーションはインストゥルメントなしで起動されます。
ServletStatelessアプリケーションをモニターするには、次の手順を実行します。
1. 「実行」>「メイン・プロジェクトとして設定」>「ServletStateless」を選択し、プロジェクトをメイン・プロジェクトとして設定します。
プロジェクトをメイン・プロジェクトとして設定すると、「プロジェクト」ウィンドウでは、そのプロジェクト名が太字で表示されます。
[start=2]
. メイン・メニューから「プロファイル」>「メイン・プロジェクトのプロファイル」を選択します。
NOTE: プロファイリング用のJavaプラットフォームを選択するプロンプトが表示された場合は、JDK 1.7またはJDK 1.8を選択します。
[start=3]
. 「プロファイリング・タスクの選択」ダイアログ・ボックスで「モニター」を選択します。
[start=4]
. 「実行」をクリックします。
NOTE: プロファイラを以前に使用したことがない場合は、「実行」をクリックできるようになる前に、プロファイラを調整するためのプロンプトが表示される場合があります。プロファイラの調整の詳細は、link:../java/profiler-intro.html[+NetBeans IDEでのJavaアプリケーションのプロファイリングの概要+]のlink:../java/profiler-intro.html#calibrate[+初めてのプロファイラの使用+]の項を参照してください。
「実行」をクリックすると、IDEによってアプリケーションがビルドされ、プロファイル・モードでサーバーが起動され、サーバーにアプリケーションがデプロイされます。次に、IDEがアプリケーションにアタッチされ、データの取得が開始されます。
ターゲットJVM内のスレッド上のデータが「スレッド」タブに表示されます。「スレッド」タブには、すべてのスレッド、サーバー・スレッドおよびアプリケーション内のスレッド上のデータが表示されます。
「プロファイラ」ウィンドウの「遠隔測定の概要」ボタンをクリックして「VM遠隔測定の概要」ウィンドウを開くことにより、追加のモニタリング情報を表示できます。「VM遠隔測定の概要」ウィンドウでは、モニタリング・データの概要をリアル・タイムですばやく取得できます。「VM遠隔測定の概要」ウィンドウ内のいずれかのグラフをダブルクリックすると、そのグラフのより大きいバージョンを開くことができます。
エンタープライズ・アプリケーションをモニタリングするときは、メモリー(ヒープ)グラフとメモリー(GC)グラフを使用して、アプリケーションのメモリー使用状況をすばやく確認できます。グラフの上にカーソルを置くと、詳細情報を示すツールチップを開くことができます。ヒープ・サイズや生存中世代の数が徐々に増加している場合は、メモリー・リークを示している可能性があります。メモリー・リークが疑われる場合は、アプリケーションのメモリー使用状況をプロファイルすることをお薦めします。
image::images/monitor-memory-telemetry.png[title="GCの情報を示すメモリー(GC)グラフ"]
== アプリケーションのパフォーマンスの解析
CPUパフォーマンスを解析」タスクを使用して、アプリケーションのメソッド・レベルのCPUパフォーマンス(実行時間)とメソッドが呼び出された回数に関するデータを確認できます。アプリケーション全体のパフォーマンスを解析するか、またはプロファイリング・ルートを選択してプロファイリングをアプリケーション・コードの一部に制限するかを選択できます。
image::images/sample-task.png[title="「プロファイリング・タスクの選択」ダイアログ・ボックスの「CPU」ペインで選択された「サンプル・アプリケーション」モード"]
「プロファイリング・タスク」ウィンドウで「CPUパフォーマンスを解析」タスクを選択したときは、次のいずれかのオプションを選択することで、プロファイルするアプリケーションの部分を選択できます。
* *簡易(サンプリング)。*このモードでは、IDEはアプリケーションをサンプリングし、定期的にスタック・トレースを取得します。このオプションは、メソッドをインストゥルメントする方法と比較して正確性が低下しますが、オーバーヘッドは低くなります。このオプションは、インストゥルメントが必要になる可能性のあるメソッドを見つけるのに役立ちます。
* *詳細(インストゥルメント済)。*このモードでは、プロファイルされたアプリケーションのメソッドがインストゥルメントされます。IDEでは、スレッドがプロジェクトのメソッドに入った時刻と出た時刻が記録されるため、各メソッド内で費やされた時間の長さを確認できます。メソッドに入るときは、スレッドによって「メソッドに入る」イベントが生成されます。メソッドから出るときは、スレッドによって対応する「メソッドから出る」イベントが生成されます。この両方のイベントのタイムスタンプが記録されます。これらのデータはリアル・タイムで処理されます。
アプリケーション内のすべてのメソッドをインストゥルメントするか、または1つ以上の*ルート・メソッド*を指定することによってインストゥルメントをアプリケーションのコードのサブセットに制限するかを選択できます。ルート・メソッドを指定すると、プロファイリングのオーバーヘッドを大幅に削減できます。ルート・メソッドは、ユーザーがインストゥルメントのルートとして指定する、ソース・コード内のメソッド、クラス、またはパッケージです。プロファイリング・データは、アプリケーションのスレッドのいずれかがインストゥルメントのルートに入ったときと出たときに収集されます。アプリケーションのスレッドのいずれかがルート・メソッドに入るまで、プロファイリング・データは収集されません。ルート・メソッドは、ソース・コード内でポップアップ・メニューを使用するか、または「*カスタマイズ*」をクリックして「プロファイリング・ルートの編集」ダイアログ・ボックスを開くことによって指定できます。
*Webアプリケーションのプロファイリングに関するヒント*
* エンタープライズ・アプリケーションは、通常、Javaコア・クラスに加えて、ターゲット・サーバーのクラスに含まれる多数のメソッドを呼び出します。このため、インストゥルメントされるソースを制限するためのフィルタを選択することが重要です。エンタープライズ・アプリケーションをプロファイリングするときは、「*プロジェクト・クラスだけをプロファイリング*」フィルタを使用することをお薦めします。
* プロファイリング結果は、プロファイリング・セッションが開始されるとすぐに収集されます。詳細方式の使用時にプロファイリング用ルート・メソッドが指定されていない場合は、サーバーの起動(特に、Webアプリケーションのリスナーおよびフィルタの初期化)の直後にいくつかの興味深いデータを取得できます。プロファイリング用ルート・メソッドを指定すると、選択したルート・メソッドによっては、このデータを取得できない可能性があります。
* 通常はリスナーやフィルタに関するデータは必要ないため、「収集結果をリセット」をクリックしてそのデータをクリアできます。Webブラウザでのアクションの結果としてなんらかのコード(通常はJavaBeans、カスタム・タグ、またはその両方を使用するJSPページの表示やサーブレットの ``doGet`` / ``doPost`` メソッドの処理)が呼び出されると、最初に使用可能なデータが収集されます。アプリケーションが初めて起動したときに収集されるデータは、多くの場合、Webアプリケーションの起動動作のみを表していることに注意してください。
* JSPページは、初めて表示されると、サーバーの内部でサーブレットにコンパイルされ、コール・ツリーやメソッドのタイミングに影響を与えます。また、サーブレットや他のアプリケーション・コードの動作は、最初の実行時とアプリケーションが継続的に実行される実際の本番環境とで少し異なる可能性があります。実際のアプリケーション・パフォーマンスをより的確に表すプロファイリング・データを取得するには、時間を測定する前に、プロファイルされるコードに対してある程度のワークロードをかけるようにしてください(コール・ツリーがこの影響を受けないようにしてください)。これは、負荷ジェネレータを使用して簡単に行うことができます。(詳細は、link:../java/profile-loadgenerator.html[+NetBeans IDEでの負荷ジェネレータの使用+]を参照してください。)様々なブラウザのキャッシュ機能も、パフォーマンスに影響を与える可能性があります。
NOTE: Windowsマシン上のGlassFishアプリケーション・サーバーでWebアプリケーションをプロファイリングする場合、スペースが使用されているパス(デフォルトの ``C:\Program Files\netbeans-7.4`` へのインストールなど)にNetBeans IDEがインストールされていると、プロファイリング用サーバーの起動が失敗することがあります。これを回避するには、NetBeans IDEのインストール・ディレクトリをパスにスペースが含まれない場所( ``C:\netbeans-7.4`` など)にインストールまたはコピーします。
=== アプリケーションのサンプリング
アプリケーション全体の動作の概要が必要であり、メソッドをインストゥルメントしない場合は、簡易オプションを選択してください。簡易プロファイル・モードでは、IDEが定期的にスタック・トレースを取得します。簡易プロファイル・モードのオーバーヘッドは、詳細プロファイル・モードより少なくなります。
この課題では、簡易プロファイル・モードを選択して、アプリケーションのパフォーマンスを解析します。
1. 「プロファイラ」ウィンドウの「停止」ボタンをクリックして、モニタリング・セッションを停止します。
2. メイン・メニューから「プロファイル」>「メイン・プロジェクトのプロファイル」を選択します。
3. 「プロファイリング・タスクの選択」ダイアログ・ボックスで「CPU」を選択します。
4. *「簡易(サンプリング)」*モードを選択します。
5. 「フィルタ」ドロップダウン・リストから「*プロジェクト・クラスだけをプロファイル*」を選択します。「実行」をクリックします。
NOTE: このフィルタは、インストゥルメント対象クラスをエンタープライズ・アプリケーション・プロジェクト内のクラスに限定します。フィルタされたクラスの一覧を表示するには、「*フィルタ値を表示*」をクリックします。
image::images/sample-task.png[title="「プロファイリング・タスクの選択」ダイアログ・ボックスの「CPU」ペインで選択された「サンプル・アプリケーション」モード"]
ダイアログ内の目盛りを見ると、オーバーヘッドが比較的小さいことがわかります。
[start=6]
. 「プロファイラ」ウィンドウの「プロファイリングのライブ結果」ボタンをクリックして、「プロファイリングのライブ結果」タブを開きます。
image::images/sample-task-results.png[title="「サンプル・アプリケーション」モードの結果"]
「プロファイリングのライブ結果」タブで、 ``Servlet2Stateless`` クラス内のサーブレットの ``service`` メソッドの実行時間と、このメソッドが1回呼び出されたことを確認できます。
=== すべてのメソッドのインストゥルメント
「アプリケーションをプロファイル」モードでは、アプリケーションのメソッドがインストゥルメントされます。アプリケーションのパフォーマンスをより正確に測定できますが、プロファイリングのオーバーヘッドはサンプル・モードを選択した場合より大きくなります。プロファイリング用ルート・メソッドを指定すると、インストゥルメントされるメソッドが制限され、プロファイリングのオーバーヘッドを削減できます。一部のアプリケーションでは、アプリケーション全体をプロファイリングすると、大量のプロファイリング・データが生成されてアプリケーションが使用できなくなるか、またはアプリケーションがクラッシュする原因になる可能性があるため、ルート・メソッドを指定することが、詳細な、または現実的なパフォーマンス・データを取得するための唯一の方法である場合があります。
この課題では、エンタープライズ・アプリケーション内のすべてのメソッドをインストゥルメントすることにより、アプリケーションのパフォーマンスを解析します。
1. 「プロファイラ」ウィンドウの「停止」ボタンをクリックして、モニタリング・セッションを停止します。
2. メイン・メニューから「プロファイル」>「メイン・プロジェクトのプロファイル」を選択します。
3. 「プロファイリング・タスクの選択」ダイアログ・ボックスで「CPU」を選択します。
4. *「詳細(インストゥルメント済)」*モードを選択します。
5. 「フィルタ」ドロップダウン・リストから「*プロジェクト・クラスだけをプロファイル*」を選択します。「実行」をクリックします。
image::images/advanced-cpu-task.png[title="「プロファイリング・タスクの選択」ダイアログ・ボックスの「CPU」ペインで選択された「アプリケーションをプロファイル」モード"]
ダイアログ内の目盛りを見ると、オーバーヘッドが「簡易(サンプリング)」プロファイル・モードより大きいことがわかります。
[start=6]
. 「プロファイラ」ウィンドウの「プロファイリングのライブ結果」ボタンをクリックして、「プロファイリングのライブ結果」タブを開きます。
「プロファイリングのライブ結果」タブに ``Servlet2Stateless`` クラス内のサーブレットの ``init`` および ``service`` メソッドの実行時間が表示され、各メソッドが1回ずつ呼び出されたことを確認できます。 ``StatelessSessionBean`` クラス内の ``init`` メソッドも呼び出されました。
image::images/cpu-pane1-results.png[title="「アプリケーションをプロファイル」モードの結果"]
NOTE: デフォルトでは、自動リフレッシュ・モードがアクティブになっているため、表示されるデータは数秒ごとに更新されます。自動リフレッシュ・モードは、ツールバーの「自動リフレッシュ」ボタンをクリックすることでアクティブ化および非アクティブ化できます。
収集されるデータの読みやすさを向上させるため、「プロファイリングのライブ結果」ウィンドウのホット・スポット・ビューで結果フィルタを使用して、表示される結果をフィルタできます。結果フィルタは、結果の表示をフィルタするのみであり、インストゥルメントされるクラスには影響しません。結果フィルタを使用すると、定義されたパターン「で始まる」、「を含む」または「で終わる」結果がフィルタされます。より複雑な正規表現をフィルタリングに使用することもできます。データは、最初の結果表の列に表示されたとおりのパッケージ/クラス/メソッド名に基づいてフィルタされます。複数のパターンをスペースまたはカンマとスペースで区切って指定できます。
[start=7]
. Webブラウザで、フィールドに自分の名前を入力して「問合せを送信」をクリックします。
image::images/cpu-pane1-results1.png[title="「アプリケーションをプロファイル」モードの結果"]
「問合せを送信」をクリックすると、「プロファイリングのライブ結果」タブが更新され、Webブラウザでのアクションが反映されたことがわかります。ボタンのクリックにより、 ``StatelessSessionBean`` クラス内の ``sayHello`` メソッドが呼び出され、 ``init`` メソッドが再度呼び出されました。 ``Servlet2Stateless`` 内のサーブレットの ``service`` メソッドも再度呼び出されました。タブには、各メソッドに費やされた時間も表示されます。
「ドリルダウン」ボタンをクリックすると、サーブレットやリスナーなど、アプリケーションの様々な領域で費やされた相対的な時間のグラフィカル表現を表示できます。グラフィックをクリックして、表示されているプロファイリング結果にドリルダウンできます。
image::images/drill-down.png[title="アプリケーション内のサーブレットで費やされた相対的な時間のドリルダウン・グラフ"]
アプリケーションのインストゥルメントでは、アプリケーションをプロファイリングするときに常にある程度のオーバーヘッドが発生します。このような単純なアプリケーションではオーバーヘッドがあまり目立ちませんが、複雑なアプリケーションではオーバーヘッドがかなり大きくなる可能性があります。プロファイリング用ルート・メソッドを選択してプロファイルされるクラスを制限することで、オーバーヘッドを削減できます。
=== プロファイリング用ルート・メソッドの使用
この課題では、アプリケーションの一部のみをプロファイルします。パフォーマンスのボトルネックがどこにあるかわかっていると思われる場合や、コードの特定の部分(たとえば、1つまたは少数のサーブレットのみ)をプロファイルする場合は、このプロファイリング方法を使用するようにしてください。この方法では通常、プロファイリングによって発生するオーバーヘッドが、すべてのアプリケーション・メソッドをインストゥルメントする場合に比べてかなり小さくなります。アプリケーションの一部のみをインストゥルメントすることで、本当に必要なデータのみが収集され、表示されます。
アプリケーションの一部をプロファイルするには、1つまたは複数のプロファイリング用ルート・メソッドを設定する必要があります。IDEは、プロファイリング用ルート・メソッドに入っているスレッドによってコールされたメソッドのみをインストゥルメントします。たとえば、 ``StatelessSessionBean`` クラスの ``sayHello`` メソッドをルート・メソッドとして設定し、「プロジェクト・クラスだけをプロファイル」フィルタを使用すると、このメソッドが呼び出され、アプリケーション・スレッドがこのメソッドに入ったときにIDEがメソッドのインストゥルメントを開始します。このアプリケーションでは、 ``init`` コンストラクタは ``sayHello`` の前に呼び出されるため、インストゥルメントされません。
image::images/profileroot-sayhello-project.png[title="アプリケーション内のサーブレットで費やされた相対的な時間のドリルダウン・グラフ"]
「すべてのクラスをプロファイル」フィルタを選択すると、IDE ``sayHello`` によってコールされたJavaコア・クラスを含むすべてのメソッドをインストゥルメントします。
image::images/profileroot-sayhello-all.png[title="アプリケーション内のサーブレットで費やされた相対的な時間のドリルダウン・グラフ"]
NOTE: より複雑なアプリケーションでは、複数のルート・メソッドを指定することもできます。個々のメソッド、クラス全体およびパッケージをプロファイリング・ルートとして選択できます。
プロファイリング・ルートを指定してアプリケーションのパフォーマンスを解析するには、次の手順を実行します。
1. 「プロファイラ」ウィンドウの「停止」ボタンをクリックして、以前のプロファイリング・セッションを停止します(まだ実行されている場合)。
2. メイン・メニューから「プロファイル」>「メイン・プロジェクトのプロファイル」を選択します。
3. 「プロファイリング・タスクの選択」ダイアログ・ボックスで「CPU」を選択します。
4. *「詳細(インストゥルメント済)」*モードを選択します。
5. 「*カスタマイズ*」をクリックして「プロファイリング・ルートの編集」ダイアログ・ボックスを開きます。
アプリケーションの一部をプロファイルするには、最初にルート・メソッドを指定する必要があります。プロファイリング・ルートを選択することで、プロファイリングをプロファイリング・ルートに入っているスレッドによってコールされたメソッドに制限します。
[start=6]
. 「プロファイリング・ルートの編集」ダイアログ・ボックスの「ビューを選択」ドロップダウン・リストで、「Webアプリケーション・ビュー」を選択します。
[start=7]
. ServletStatelessノードを展開して、「サーブレット」パッケージ内の ``service`` メソッドを選択します。「OK」をクリックします。
image::images/edit-profiling-roots.png[title="「プロファイリング・ルートの編集」ダイアログの「Webアプリケーション・ビュー」"]
または、「パッケージ表示」を選択してアプリケーション内のすべてのソース・パッケージを表示し、 ``servlet.stateless`` パッケージに含まれる ``Servlet2Stateless`` クラスの ``service`` メソッドを選択することもできます。
image::images/edit-profiling-roots-pkg.png[title="「プロファイリング・ルートの編集」ダイアログの「パッケージ表示」"]
NOTE: ``Servlet2Stateless`` コンストラクタが選択されていないことに注意してください。「プロファイリング・ルートの編集」ダイアログを使用して、インストゥルメントをクラス内の特定のメソッドに制限できます。インストゥルメントを特定のメソッドに制限しない場合は、「パッケージ表示」を使用してクラスまたはパッケージ全体を選択できます。たとえば、「プロファイリング・ルートの編集」ダイアログ・ボックスの「パッケージ表示」で ``Servlet2Stateless`` クラスを選択すると、IDE ``init`` コンストラクタと ``service`` メソッドをインストゥルメントします。
「詳細」ボタンをクリックすると、「プロファイリング・ルートの編集(詳細)」ダイアログ・ボックスに ``service`` メソッドが唯一のルート・メソッドとして表示されることがわかります。「追加」をクリックし、メソッドの署名とクラスを入力することでメソッドを明示的に定義できます。
image::images/edit-profilingroots-pkg-adv.png[title="「プロファイリング・ルートの編集(詳細)」ダイアログ"]
[start=8]
. 「プロファイリング・ルートの編集」ダイアログ・ボックスで「OK」をクリックします。
「プロファイリング・タスクの選択」ダイアログ・ボックスで、詳細プロファイリング・モードがカスタム・プロファイリング・ルートを使用して実行されることを確認できます。「*編集*」をクリックすると、選択したルート・メソッドを表示および変更できます。これで、ルート・メソッドを指定しなかった場合に比べてプロファイリングのオーバーヘッドが小さくなりました。
[start=9]
. 「フィルタ」ドロップダウン・リストから「*プロジェクト・クラスだけをプロファイル*」を選択します。「実行」をクリックします。
image::images/advanced-cpu-task-custom.png[title="カスタム・プロファイリング・ルート付きで選択された「アプリケーションをプロファイル」モード"]
「実行」をクリックすると、IDEによってアプリケーションがビルドおよびデプロイされ、Webブラウザが開いてサーブレットのページが表示されます。
IDEの「プロファイリングのライブ結果」タブにプロファイリング結果が表示されます。
image::images/cpu-pane2-results.png[title="プロファイリング・ルートを使用してメソッドをインストゥルメントした結果"]
プロファイリング・ルートとして指定したメソッドの結果のみがIDEに表示されることがわかります。アプリケーション・スレッドは、プロファイリング・ルートに入った後、アプリケーション内の他のメソッドに入っていません。
アプリケーションはプロファイリング・ルートに入った後で他のメソッドに入っていますが、インストゥルメント・フィルタによってインストゥルメントがプロジェクトの一部のクラスに制限されているため、これらの他のメソッドは表示されません。
[start=10]
. Webブラウザで、フィールドに自分の名前を入力して「問合せを送信」をクリックします。
image::images/cpu-pane2-results1.png[title="sayHelloメソッドの呼出し後にプロファイリング・ルートを使用してメソッドをインストゥルメントした結果"]
「問合せを送信」をクリックすると、「プロファイリングのライブ結果」タブが更新され、Webブラウザでのアクションが反映されたことがわかります。ボタンのクリックにより、 ``StatelessSessionBean`` クラス内の ``sayHello`` メソッドが1回呼び出されました。 ``service`` メソッドも再度呼び出されました。
結果には、アプリケーションのパフォーマンスが表示されますが、長期間実行されているアプリケーションのパフォーマンスが正確に表されていない可能性があります。より現実的な条件下でWebアプリケーションのパフォーマンスをエミュレートする1つの方法は、負荷ジェネレータ・スクリプトを実行することです。
[start=11]
. ブラウザで前のステップを数回繰り返してから、「プロファイリングのライブ結果」タブの「結果のリセット」をクリックして結果をクリアします。
[start=12]
. プロファイリング結果がリセットされたら、もう一度自分の名前を入力して「問合せを送信」をクリックします。
image::images/cpu-pane2-results2.png[title="sayHelloメソッドの呼出し後にプロファイリング・ルートを使用してメソッドをインストゥルメントした結果"]
プロファイリング結果を見ると、ほとんどの場合、パフォーマンスが向上していることがわかります。
=== インストゥルメント・フィルタの使用
CPUパフォーマンスを解析するときは、ドロップダウン・リストからインストゥルメント・フィルタを選択し、プロファイリングを必要なソース・コードに制限することで、プロファイリングのオーバーヘッドを削減できます。フィルタを使用して、インストゥルメントされるパッケージまたはクラスを指定できます。次のデフォルト・フィルタから選択するか、カスタム・フィルタを作成できます。
* *すべてのクラスをプロファイル。*Webアプリケーションまたはエンタープライズ・アプリケーションをプロファイリングするときにこのフィルタを選択すると、コアJavaクラスやサーバー・クラスを含むすべてのクラスがインストゥルメントされます。これほど多くのクラスをインストゥルメントすると、*非常に*大きなオーバーヘッドが発生する可能性があるため、このフィルタを選択する場合は注意が必要です。
* *プロジェクト・クラスだけをプロファイリング*。エンタープライズ・アプリケーションをプロファイリングする場合は、このフィルタを使用して、インストゥルメントされるコードをプロジェクト内のクラスに制限することをお薦めします。サーバー・クラスはインストゥルメントされません。
* *プロジェクトとサブプロジェクトのクラスをプロファイル。*Webアプリケーション、EJBモジュール、クラス・ライブラリなどのサブプロジェクトを含むエンタープライズ・アプリケーション・プロジェクトをプロファイリングする場合は、このフィルタを選択して、インストゥルメント対象コードをサブプロジェクト内のクラスに制限できます。
カスタム・フィルタを作成して、特定のプロジェクトや特定タイプのプロファイリングで使用できます。たとえば、Oracle WebLogic Server上のWebアプリケーションをプロファイリングするときに使用するインストゥルメント・フィルタが必要な場合は、「フィルタ・セットを編集」をクリックして、Javaコア・クラス、Oracle WebLogicクラスおよびNetBeansクラスを除外するフィルタ・セットを作成できます(HTTPモニターが有効になっている場合に便利です)。フィルタ・セットに「WebLogic Webapp Exclusive」などの名前を設定しておき、WebLogicサーバーにデプロイされたアプリケーションをプロファイリングするときに、「フィルタ」ドロップダウン・リストからそのフィルタを選択できます。
image::images/custom-filter.png[title="プロジェクトを初めてプロファイリングする場合に表示されるダイアログ・ボックス"]
「フィルタ」ドロップダウン・リストから「簡易フィルタ」を選択し、「簡易フィルタの設定」ダイアログ・ボックスを開くことで、簡易なインストゥルメント・フィルタを定義できます。インストゥルメントされるパッケージまたはクラスの一覧をすばやく編集できます。これにより、「フィルタ」ドロップダウン・リストから選択できる簡易フィルタが作成されます。
image::images/set-quick-filter.png[title="プロジェクトを初めてプロファイリングする場合に表示されるダイアログ・ボックス"]
インストゥルメント・フィルタの定義と使用の詳細は、IDEのプロファイリングに関するドキュメントを参照してください。
== アプリケーションのメモリー使用状況の解析
IDEのプロファイリング・ツールを使用して、エンタープライズ・アプリケーションのメモリー使用状況を解析し、オブジェクト割当てやガベージ・コレクションに関する詳細なデータを取得できます。「メモリー使用状況を解析」タスクによって、ターゲット・アプリケーション内で割り当てられているオブジェクトに関するデータ(割り当てられたオブジェクトの数、型、場所など)が提供されます。
メモリー使用状況をプロファイリングするときは、プロファイリング用ルート・メソッドやインストゥルメント・フィルタを設定できないため、サーバーの実行中に作成されたすべてのオブジェクトがトラックされます。このため、複雑なアプリケーション・サーバーでは、プロファイリングのオーバーヘッドやメモリーの消費量が大きくなる可能性があります。したがって、このタイプのプロファイリングを実行する前に、マシンの潜在的な制限事項について知っておくようにしてください。プロファイリングのオーバーヘッドを軽減するため、10個に1個の割合でのみオブジェクトをプロファイルするように設定を変更できます。オブジェクト割当てのスタック・トレースの記録を無効化(制限)することもできます。
メモリー・リークを検出するためにエンタープライズ・アプリケーションをプロファイリングするときは、「生存中世代」のメトリックを使用すると非常に便利なことがあります。このツールは、ガベージ・コレクションのサイクルを経て生存する様々なオブジェクト世代の数をトラックすることにより、アプリケーションのメモリー使用量が著しく大きくなる前にメモリー・リークを検出できます。
メモリー・パフォーマンスを解析するには、次のオプションのいずれかを選択することによって、取得するデータの量を選択します。
* *簡易。*このオプションが選択されている場合、プロファイラはアプリケーションをサンプリングして、ライブ・オブジェクトに限定されたデータを提供します。ライブ・オブジェクトとは、ガベージ・コレクタによって回収されていないアクセス可能(およびアクセス不能)なすべてのオブジェクトです。このオプションは、ライブ・オブジェクトのみ追跡し、計測時に割当てを追跡しません。このオプションを選択した場合は、スタック・トレースを記録したり、プロファイリング・ポイントを使用したりすることはできません。このオプションを選択すると、「詳細」オプションよりもオーバーヘッドが大幅に削減されます。
* *詳細。*このオプションを選択すると、割り当てられたオブジェクトの数、タイプおよび場所に関する情報を取得できます。割り当てられたオブジェクトとは、アプリケーションを起動してから(またはプロファイラでの収集結果が最後にリセットされてから)これまでに作成されたオブジェクトです。ターゲットJVMによって現在ロードされているすべてのクラス(および新規にロードされる各クラス)が計測され、オブジェクト割当てに関する情報が生成されます。メモリ使用状況の分析時にプロファイリング・ポイントを使用する場合、またはコール・スタックを記録する場合は、このオプションを選択する必要があります。このオプションを選択すると、簡易オプションよりもプロファイリング・オーバーヘッドが増加します。
「詳細」オプションを選択した場合は、次のオプションも設定できます。
* *完全なオブジェクト・ライフスタイルを記録。*存続している世代数など、各オブジェクトのすべての情報を記録するには、このオプションを選択します。
* *割当てのスタック・トレースを記録。*完全なコール・スタックを記録するには、このオプションを選択します。このオプションでは、メモリー・スナップショットを表示する際にメソッド呼出しの逆呼出しツリーを表示できます。
* *定義済みプロファイリング・ポイントを使用。*プロファイリング・ポイントを有効にするには、このオプションを選択します。無効なプロファイリング・ポイントは無視されます。選択解除されている場合は、プロジェクト内のすべてのプロファイリング・ポイントが無視されます。
「プロファイリング・タスクの選択」ウィンドウの「オーバーヘッド」メーターは、ユーザーが選択したプロファイリング・オプションに応じて、プロファイリングのオーバーヘッドの大まかな増減を示します。
ここで、IDEを使用してエンタープライズ・アプリケーションのメモリー・パフォーマンスを解析します。存続している世代に関する情報を取得する場合は、*「詳細」*オプションを選択する必要があります。または、ライブ・オブジェクトに関するデータが必要な場合は、*簡易*オプションを選択できます。
1. 「プロファイラ」ウィンドウの「停止」ボタンをクリックして、以前のプロファイリング・セッションを停止します(まだ実行されている場合)。
「停止」をクリックすると、IDEがアプリケーションからデタッチされます。
[start=2]
. メイン・メニューから「プロファイル」>「メイン・プロジェクトのプロファイル」を選択します。
[start=3]
. 「プロファイリング・タスクの選択」ダイアログ・ボックスで「*メモリー*」を選択します。
[start=4]
. *「詳細」*を選択します。
[start=5]
. *「完全なオブジェクト・ライフサイクルを記録」*を選択して、存続している世代に関するデータを取得します。
NOTE: このオプションを選択すると、「オーバーヘッド」メーターが大幅に増加します。エンタープライズ・アプリケーションをプロファイリングするときは、収集されるデータ量のため、ほとんどの場合、IDE用のメモリーを増やす必要がありあります。
[start=6]
. 「*定義済みプロファイリング・ポイントを使用*」を選択解除します(選択されている場合)。「実行」をクリックします。
image::images/profile-memory-advanced.png[title="「メモリー」タスクとオプションが表示された「プロファイリング・タスクの選択」ダイアログ"]
「実行」をクリックすると、IDEによってアプリケーションがコンパイルされ、プロファイル・モードでサーバーが起動され、サーバーにアプリケーションがデプロイされます。プロファイリング結果を表示するには、「プロファイラ」ウィンドウ内の「ライブ結果」をクリックして「ライブ結果」ウィンドウを開きます。「ライブ結果」ウィンドウに、ターゲットJVMに割り当てられたオブジェクトのサイズと数に関する情報が表示されます。結果には、エンタープライズ・アプリケーションによって割り当てられたオブジェクトに加えて、アプリケーション・サーバーによって割り当てられたオブジェクトもすべて含まれています。
image::images/profile-memory-results.png[title="メモリー使用状況のプロファイリングの結果が表示された「プロファイリング結果」タブ"]
デフォルトでは、結果は「ライブ・バイト数」の数でソートされて表示されますが、列ヘッダーをクリックすると結果の表示方法を変更できます。また、リストの下にあるフィルタ・ボックスにクラス名を入力して結果をフィルタすることもできます。
link:/about/contact_form.html?to=3&subject=Feedback:%20Profiling%20Enterprise%20Applications[+このチュートリアルに関するご意見をお寄せください+]
== 関連項目
このドキュメントでは、GlassFishアプリケーション・サーバーにデプロイされたエンタープライズ・アプリケーションをプロファイリングするときにプロファイリング・データを取得する基本的な方法について説明しました。
このドキュメントで説明されていないプロファイリング設定および機能の詳細は、製品に含まれ、「ヘルプ」メニュー項目から使用できるドキュメントを参照してください。
関連ドキュメントについては、次のリソースを参照してください。
* link:http://wiki.netbeans.org/wiki/view/NetBeansUserFAQ#section-NetBeansUserFAQ-Profiler[+NetBeansプロファイラのFAQ+]
NetBeans IDEでのアプリケーションのプロファイリングに関連した、よくある質問を含むドキュメント
* link:http://wiki.netbeans.org/wiki/view/FaqProfilerProfileFreeForm[+FAQ: 自由形式プロジェクトのプロファイリング+]
* link:../java/profiler-screencast.html[+スクリーンキャスト: プロファイリング・ポイント、ドリルダウン・グラフ、ヒープ・ウォーカ+]
NetBeans IDEのいくつかのプロファイリング機能を示すデモ。
* link:../../../community/magazine/html/04/profiler.html[+詳細なプロファイリング: 実行理論+]
* link:http://profiler.netbeans.org/index.html[+profiler.netbeans.org+]
NetBeansプロファイラ・プロジェクトのサイト
* link:http://blogs.oracle.com/nbprofiler/[+NetBeansプロファイラのブログ+]
* link:http://profiler.netbeans.org/mailinglists.html[+NetBeansプロファイラのメーリング・リスト+]
* link:http://profiler.netbeans.org/docs/help/5.5/index.html[+NetBeansプロファイラ5.5の使用+]
<<top,先頭>>