FeaturesPluginsDocs & SupportCommunityPartners

NetBeans IDE 6.0 での Java アプリケーションのプロファイリングの概要

NetBeans IDE 6.0 には、開発したアプリケーションの実行時の重要な情報を示すことが可能な強力なプロファイルツールが含まれています。NetBeans のプロファイルツールは、スレッドの状態や CPU のパフォーマンス、IDE 内でのユーザーが開発したアプリケーションのメモリの使用状況を容易に計測することができ、必要なオーバーヘッドは比較的低いです。

入門となるこのドキュメントでは、IDE に含まれるプロファイルツールの概要の説明と、 NetBeans で作成したプロジェクトのプロファイルをすぐに始めるためのガイドを行います。IDE 内で使用可能な様々なプロファイルタスクと、プロジェクトのプロファイルを行ったときに得られるプロファイル結果の紹介をしていきます。IDE に含まれているすべてのプロファイル機能は網羅されていません。また、アプリケーション開発で直面するであろう特定のパフォーマンスに関する問題の解決方法を得るために、プロファイル結果をどう解釈するか、という点についても説明されていません。

このドキュメントでは、Anagram Game サンプルアプリケーション (IDE に含まれている簡単な Java アプリケーションのサンプル) に関するプロファイルデータを得るためにプロファイル機能を使用していきます。Anagram game はとても簡単な Java アプリケーションプロジェクトですが、もっと大規模で複雑な Java アプリケーションのプロファイルを行う場合でも手順は同じです。Web アプリケーションであってもエンタープライズアプリケーションであっても変わりません。

このドキュメントでは、アプリケーションのプロファイルを行うためのIDE の使用方法と、以下のプロファイル結果の取得方法について説明します:

  • アプリケーションの実行時のふるまい
  • アプリケーションのメソッドによって使用された CPU 時間
  • オブジェクト生成

さらに、プロファイル結果のスナップショットの取得方法と、その比較方法についての手順も紹介します。

予想される所要時間: 40 分

このページの内容は NetBeans IDE 6.0 が対象です

目次:

前提条件

このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。

  • Java プログラミング
  • NetBeans IDE

チュートリアルに必要なソフトウェア

このチュートリアルでは、コンピュータに次のソフトウェアをインストールしておく必要があります。

プロファイルツールは NetBeans IDE に含まれているので、アプリケーションのプロファイルをはじめるための特別なセットアップは不要です。

はじめてのプロファイル

はじめてプロファイルツールを使う際には、正確なプロファイル結果が取得できるようにするためと、ツールとプロジェクトを統合するために、いくつかの初期化処理が必要です。これを行うために、まずは AnagramGame プロジェクトを作成して、調整を実行します。AnagramGame プロジェクトの最初のプロファイルを行うときに、IDE は自動的に統合を行います。

サンプルプロジェクトの作成

このドキュメントでは、Anagram Game サンプルアプリケーションのプロファイルを行います。そのためにまずは、「新規プロジェクト」ウィザードを使ってサンプルアプリケーションを作成します。

Anagram Game アプリケーションを作成するには、以下の手順を実行してください:

  1. メインメニューから「ファイル」>「新規プロジェクト」を選択します。
  2. 「新規プロジェクト」ウィザードで、カテゴリ「サンプル」>「Java」を選択します。
  3. Anagram Game プロジェクトを選択します。
  4. プロジェクトの場所を指定し、「主プロジェクトとして設定」が選択されていることを確認します。「保存」をクリックします。

「完了」をクリックすると Anagram Game サンプルプロジェクトが作成されます。Anagram Game プロジェクトがプロジェクトウィンドウに表示され、プロジェクト名は主プロジェクトであることを示す太字になっています。デフォルトでは、プロジェクトのプロファイルを行う時、IDE は主プロジェクトのプロファイルを行います。

はじめてプロファイルを使う

正確なプロファイル結果を得るためには、プロファイルに使用する Java プラットフォームごとに調整データを用意する必要があります。はじめてプロファイルツールを実行する場合、あるいは使用中の Java プラットフォームに対する有効な調整データが存在しない場合、調整の実行を行うよう求められます。

調整は一回だけ必要な処理です。しかしながら、マシンのパフォーマンスに影響を及ぼすような、大きな変更をマシン構成に対して行った場合には、調整を再度実行する必要があります。調整は以下の手順でいつでも実行することができます:

  1. メニューから「プロファイル」>「拡張コマンド」>「プロファイラの調整を実行」を選択します
  2. Java プラットフォームを選択します。「了解」をクリックします。

調整が終わった時点で、調整結果の情報がダイアログボックス上に表示されます。それぞれの Java プラットフォームに対応した調整データがホームディレクトリ内の .nbprofile ディレクトリに保存されます。

はじめてのプロジェクトのプロファイル

プロジェクトのプロファイルをはじめて行うときには、IDE が対象プロジェクトとプロファイルツールを統合する必要があることが、ダイアログボックスによって示されます。プロジェクトと統合するために、IDE はプロジェクトの構築スクリプトを変更し、必須となるプロファイルライブラリのための追加スクリプトをインポートします。構築スクリプトを変更する前に、IDE は元の構築スクリプトのバックアップを作成します。

プロジェクトとプロファイルツールを統合するには、ダイアログボックスで「了解」をクリックします。IDE は build.xml のバックアップを build-before-profiler.xml という名前で作成し、build.xml に以下の行を追加します:

<import file="nbproject/profiler-build-impl.xml"/>
メニューから「プロファイル」>「拡張コマンド」>「プロファイラの統合を解除」を選択することによって、元のビルドスクリプトに戻すことができます。

プロファイルタスクの選択

プロファイルを必要に応じて調整するための、いくつかの内部的な設定項目が IDE に用意されています。たとえば、生成する情報を少なくして、プロファイルのオーバーヘッドを抑えることができます。ただし、用意されている数多くの設定項目の意味するところを理解して使用するには、ある程度の時間がかかります。多くのアプリケーションにとって、ほとんどの場合はプロファイルタスクのためのデフォルト設定で十分です。

プロジェクトのプロファイルを行う際には、取得したいプロファイル情報のタイプに応じたタスクを選択するために、「プロファイルタスク」ダイアログを使用します。次の表に、プロファイルタスクと、タスクを実行することで得られるプロファイル結果を示します。

プロファイルタスク 結果
アプリケーションの監視 スレッドのアクティビティーやメモリーの割り当てなど、ターゲット JVM のプロパティーに関する概要を取得する場合に選択します。
CPU パフォーマンスの解析 メソッドの実行時間やメソッドが呼び出された回数など、アプリケーションのパフォーマンスに関する詳細データを取得する場合に選択します。
アプリケーションのメモリ使用の解析 オブジェクトの割り当てとガベージコレクションに関する詳細データを確認する場合に選択します。

「プロファイルタスクの選択」ダイアログボックスはプロファイルタスクを実行するための主要なインターフェースです。タスクを選択した後に、取得される結果を最適なものにするためにタスクの設定を変更することができます。それぞれのプロファイルタスクでは、それぞれのタスクをベースにしたカスタムプロファイルタスクを作って保存することもできます。カスタムプロファイルタスクを作ると、カスタムタスクは「プロファイルタスクの選択」ダイアログボックスにリスト表示されるので、後で簡単に選択して実行することができます。カスタムプロファイルタスクを作るときには 「プロファイルタスクの選択」ダイアログボックスで「詳細設定」をクリックして、より詳細な設定を行うことができます。

それでは、Anagram Game のプロファイルを行って、それぞれのプロファイルタスクのデモを進めます。

アプリケーションの監視

「監視」タスクを選択すると、ターゲットアプリケーションは計測されずに起動されます。アプリケーションの監視では、ターゲットとなる JVM の、いくつかの重要な情報に関する大まかな内容を得ることができます。アプリケーションの監視はきわめて低いオーバーヘッドで行われるので、アプリケーションを長時間にわたって実行させることができます。

Anagram Game アプリケーションを監視するには、以下の手順を実行してください:

  1. AnagramGame が主プロジェクトとして設定されていることを確認してください。
  2. メインメニューから「プロファイル」>「主プロジェクトをプロファイル」を選択します。
  3. 「プロファイルタスクの選択」ダイアログボックスで「監視」を選択します。
  4. 「実行」をクリックします。

「実行」をクリックすると、IDE はアプリケーションを起動し IDE の左の区画にプロファイルウィンドウを開きます。「Profiler」ウィンドウ内のコントロールを使用すると、次の操作を実行できます。

  • プロファイルタスクの制御
  • 現在のプロファイルタスクの状態の確認
  • プロファイル結果の表示
  • プロファイル結果スナップショットの管理
  • 基本的な遠隔測定統計の確認

プロファイルウィンドウ内のコントロールやメインメニューを使って関しデータの参照が可能なウィンドウを開くことができます。「遠隔測定の概要」ウィンドウを使って、監視データの概要をリアルタイムに得ることができます。

  • 「ウィンドウ」>「プロファイル」>「遠隔測定の概要」を選択して「出力」ウィンドウ上に概要を表示させます。「遠隔測定」ウィンドウを開くと、プロファイルセッションの間の任意のタイミングで、監視データを見ることができます。

「遠隔測定の概要」によってアプリケーションの状態を素早く知ることができます。グラフ上にカーソルを置くと、グラフに表示されているデータのより詳細な計測値を見ることができます。「遠隔測定の概要」ウィンドウに表示されているグラフはどれでも、ダブルクリックすることで、より大きく詳細なバージョンのグラフを開くことができます。

CPU パフォーマンスの解析

「CPU」タスクを選択すると、IDE はアプリケーションのメソッドレベルのパフォーマンス (実行時間) をプロファイルし、結果をリアルタイムで表示します。アプリケーション全体のパフォーマンス解析かアプリケーションコードの一部のプロファイルを選ぶことができます。特定のコード部分のプロファイルまで詳細化することもできます。

CPU パフォーマンスを解析するには、以下のオプションの中の一つを選んで、アプリケーションのどれくらいをプロファイルするのか選択します:

  • アプリケーション全体」このモードでは、プロファイルされるアプリケーションのすべてのメソッドが計測されます。IDE は、スレッドがメソッド内に入ったときと出た時点の記録を行い、それぞれのメソッドで消費された時間を知ることができるようにします。
  • アプリケーションの一部」このモードでは、アプリケーションのコードの限られた一部分を計測しプロファイルします。この指定によってプロファイルのオーバーヘッドは劇的に削減されます。

    アプリケーションの一部をプロファイルするためには、まず一つもしくは複数の Root メソッドを指定する必要があります。Root メソッドは、計測の開始点として指定する、ソースコード内のメソッドやクラス、パッケージです。アプリケーションのスレッドのうちの一つが計測の開始点に入って出るまでの間、プロファイルデータが集められます。アプリケーションのスレッドのうちの一つが Root メソッドに入るまで、プロファイルデータは収集されません。

    注意: アプリケーション全体のパフォーマンスをプロファイルすることで非常に多くのデータが生成され、アプリケーションを使用不能にしたりクラッシュを引き押したりする場合があるので、いくつかのアプリケーションでは、このオプションが詳細で実用的なパフォーマンスデータを得るための唯一の方法となります。

さらに、計測されるソースをフィルターを使って制限することで、どの程度の量のコードがプロファイルされるかを調整することができます。

それでは、Anagram Game アプリケーションの CPU パフォーマンスを解析するために IDE を使用していきます。「アプリケーションの一部」オプションを選択して、WordLibrary.java をプロファイルの root として選びます。このクラスをプロファイルの Root として選ぶことで、プロファイルをこのクラス内のメソッドに限定します。

  1. (もし実行している場合には) 前回のプロファイルセッションを停止します。停止させるには「プロファイラ」ウィンドウの停止ボタンをクリックします。
  2. メインメニューから「プロファイル」>「主プロジェクトをプロファイル」を選択します。
  3. 「プロファイルタスク」ダイアログボックスで「CPU」を選択します。
  4. 「アプリケーションの一部」を選択します。
    このオプションを使用するには Root メソッドを指定する必要があります。
  5. 定義」ボタンをクリックして「Root メソッドの指定」ダイアログボックスを開きます。
  6. 「プロジェクトから追加」をクリックし、「Root メソッドを選択」ダイアログを開きます。
  7. 「Root メソッドを選択」ダイアログで AnagramGame ノードを展開し、Sources/com/toy/anagrams/lib/WordLibrary を選択します。「了解」をクリックします。
  8. 「Root メソッドの指定」ダイアログボックスで「了解」をクリックします。WordLibrary が Root メソッドとしてリストアップされたことが確認できるはずです。「プロファイルタスクの選択」で、プロファイルの Root として選択されたメソッドを一つ、確認できます。プロジェクトのプロファイルを行う際には、複数の Root メソッドを指定することができます。また、編集 をクリックして選択された Root メソッドを変更することもできます。
  9. フィルタとして「プロジェクトクラスだけをプロファイル」を選択します。
    フィルターによって計測するクラスを制限することができます。この場合はプロジェクト内のクラスがプロファイルされます。「フィルタ値を表示」をクリックしてフィルタリングされたクラスのリストを確認することもできます。IDE によってあらかじめ用意されているプロファイルフィルターか、独自のカスタムフィルタを選ぶことができます。
  10. 「プロファイルタスクの選択」ダイアログボックスで「実行」をクリックします。

「実行」をクリックすると、IDE はアプリケーションを起動してプロファイルセッションを開始します。プロファイル結果を見るには、「プロファイラ」ウィンドウの「ライブ結果」をクリックし「プロファイルのライブ結果」ウィンドウを開きます。「プロファイルのライブ結果」ウィンドウはその時点の収集されたプロファイルデータを表示します。デフォルトでは数秒毎にデータがリフレッシュされます。CPU パフォーマンスを解析する時は、「プロファイルのライブ結果」ウィンドウはそれぞれのメソッドで費やされた時間と、それぞれのメソッドの呼び出された数を表示します。Anagram Game アプリケーションでは、最初は 2 つのメソッドだけが呼び出されます。

Anagram Game で替え字の問題を解くと、IDE は操作に応じて呼び出された他のメソッドを表示し、アプリケーションがそれぞれのメソッドでどのくらいの時間を費やしたのかを示します。

メソッド名を右ボタンクリックして「ソースへ移動」を選択することにより、リスト表示されているメソッドのソースコードに簡単に移動することができます。「ソースへ移動」をクリックすると、ソースエディタ上にクラスが表示されます。

アプリケーションのメモリー使用の解析

「メモリー使用の解析」タスクは、オブジェクト数や型、オブジェクトが割り当てられた箇所などの、アプリケーションに割り当てられたオブジェクトに関するデータを表示します。

メモリーパフォーマンスを解析するには、以下のオプションの中の一つを選んで、どの程度のデータを取得するのかを設定します。

  • オブジェクトの作成のみ記録」このオプションが選択されると、対象とする JVM によってロードされたすべてのクラス (およびロードされた新たなクラス) が計測され、オブジェクト割り当てに関する情報が生成されます。
  • オブジェクト作成とガベージコレクションの両方を記録」このオプションが選択されると、アプリケーションのプロファイルによって、それぞれの型についていくつのオブジェクトが生存しているのか、といったオブジェクトの生存情報を得ることができます。割り当てに関するデータとともに、サイズ、平均年齢が示されます。

1 番目のオプションは 2 番目のオプションのサブセットです。パフォーマンスやメモリ使用に対するオーバーヘッドはより少なくてすみます。「プロファイルタスクの選択」ウィンドウ内の「オーバーヘッド」メーターは、選択したプロファイルオプションに応じてプロファイルによるオーバーヘッドの増加もしくは減少のだいたいの様子を示しています。

それでは、Anagram Game アプリケーションのメモリパフォーマンスを解析するために IDE を使用していきます。「オブジェクト作成とガベージコレクションの両方を記録」オプションを選択します。また、「割り当てのスタックトレースを記録」も選択します。IDE は、完全な呼び出しスタックの記録を行います。このオプションを選択することによって、メモリのスナップショットを取得するときに、オブジェクトが割り当てられたメソッドの逆呼び出しツリーを見ることができるようになります。

  1. (もし実行している場合には) 前回のプロファイルセッションを停止します。停止させるには「プロファイラ」ウィンドウの停止ボタンをクリックします。停止ボタンをクリックすると Anagram Game アプリケーションも終了します。
  2. メインメニューから「プロファイル」>「主プロジェクトをプロファイル」を選択します。
  3. 「プロファイルタスクの選択」ダイアログボックスで「メモリー」を選択します。
  4. 「オブジェクト作成とガベージコレクションの両方を記録」を選択します。
  5. 「追跡単位」はデフォルト値の 10 のままにしておきます。

    このオプションはスタックをサンプリングする間隔/比率を設定するものです。値として 10 を設定することは、それぞれのクラスについて 10 回オブジェクトが割り当てられた時点でのみ記録が行われる。ということを意味します。それぞれのオブジェクトについてのすべての情報を記録するには、値を 1 に設定します。しかしながら、1 を設定することはプロファイルによるオーバーヘッドの多大な増加を招きます。

  6. 割り当てのスタックトレースを記録」を選択します。
    このオプションを選択することによって「オーバーヘッド」メーターがいっきに増加することに注意してください。この場合は、対象としているアプリケーションは小さなものなので、パフォーマンスへの影響は許容範囲に収まります。
  7. 「実行」をクリックします。

「実行」をクリックすると、IDE はアプリケーションを起動してプロファイルセッションを開始します。プロファイル結果を見るには、「プロファイラ」ウィンドウの「ライブ結果」をクリックし「プロファイルのライブ結果」ウィンドウを開きます。「ライブ結果」ウィンドウはプロジェクト内の割り当てられたオブジェクトのサイズと数に関する情報を表示します。

デフォルトでは、結果は「ライブバイト数」によってソートされています。列のタイトルをクリックすることによって結果の表示方法を変更することができます。リストの下にあるフィルター部分にクラス名を入力することによって、結果をフィルタリングすることもできます。

スナップショットの作成

プロファイルセッションが継続しているときに、スナップショットを取得してプロファイル結果を得ることができます。スナップショットとは、取得した時点でのプロファイルデータを示しています。スナップショットはライブ結果とは以下の点で異なっています:

  • スナップショットは、プロファイルセッションが実行中でなくても確認できます。
  • スナップショットには、ライブ結果よりも詳細なプロファイルデータの記録が含まれます。
  • スナップショットは簡単に比較できます (メモリースナップショット)。

プロジェクトのスナップショットを開くときにプロファイルセッションが実行している必要はないので、プロファイルウィンドウの保存スナップショットのリストから、いつでも任意の砂婦ショットを選んで「開く」をクリックすることによって、スナップショットを開くことができます。

メモリスナップショットの作成と比較

Anagram Game アプリケーションでは、スナップショットを取得して String 型のオブジェクトの割り当てスタックトレースを見てみます。その後 2 つめのスナップショットを取得して比較してみます。メモリーのスナップショットが開かれているのであれば、別に保存済みのメモリースナップショットとの比較を行うことができます。

  1. プロファイルセッションが引き続き実行していることを確認してください。(もしプロファイルセッションが呈している場合には、メモリーパフォーマンス解析の手順を繰り返して「プロファイルのライブ結果」ウィンドウを開いてください。
  2. プロファイル結果ウィンドウで java.lang.String を含んでいる行を右ボタンクリックして、「スナップショットを作成して割り当てスタックトレースを表示」を選択します。IDE によってメモリースナップショットが取得され、スナップショットが「割り当てスタックトレース」タブが選択された状態で表示されます。ここで、オブジェクトをインスタンス化したメソッドの逆呼び出しツリーを見ることができます。
  3. スナップショットのツールバーにある「プロジェクトに砂婦ショットを保存」ボタンをクリック (または Ctrl+S を押下) して、メモリースナップショットをプロジェクト内に保存します。プロジェクトにスナップショットを保存することで、スナップショットはプロファイラウィンドウ内で Anagram Game の保存スナップショットのリストに追加されます。デフォルトでは、スナップショットのデータそのものは、プロジェクトの nbproject/private/profiler ディレクトリに保存されます。保存されたスナップショットには .nps 拡張子が付けられます。

    注: スナップショットはファイルシステム上のどこにでも保存することができますが、プロファイラウィンドウにリスト表示されるのは、プロジェクト内のデフォルトの位置に保存されたスナップショットのみです。スナップショットをイメージファイル (.png) として保存して IDE を使わずに内容を見ることもできます。

  4. さらにスナップショットを得るには、「プロファイルのライブ結果」ウィンドウのツールバーで「収集結果のスナップショットを作成」ボタンをクリック (または、「プロファイラ」ウィンドウで「スナップショットを作成」ボタンをクリック) します。スナップショットの保存
  5. メモリースナップショットのウィンドウの中の一つを表示させて、スナップショットツールバーにある「差を比較」ボタンをクリックします。
  6. 2 つめのメモリースナップショットを「比較するスナップショットを選択」ダイアログボックスで選んで「了解」をクリックします。「ライブの比較」ウィンドウが開き、2 つのメモリースナップショットの差が表示されます。

関連項目

NetBeans IDE 6.0 でのアプリケーションのプロファイルの概要は以上です。このドキュメントでは、単純な NetBeans プロジェクトのプロファイル方法と、プロファイル結果の取得方法に関する基本的なデモを行いました。ここで説明された手順は、殆どのプロジェクトのプロファイルに適用することができます。エンタープライズアプリケーションや自由形式アプリケーションなどの、より複雑なプロジェクトのプロファイルを行うには、追加の設定が必要になります。

プロファイルの設定と機能に関するより詳細な説明はこのドキュメントには含まれていません。「ヘルプ」メニューからアクセスすることが可能な、製品に同梱されているドキュメントを参照してください。

関連するドキュメントについては、以下のリソースを参考にしてください:

ページの先頭へ

Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Open ESB - The Open Enterprise Service Bus Powered by