ヘッダーをスキップ
Oracle® Fusion Middleware Oracle JDeveloperによるアプリケーションの開発
12c (12.1.2)
E48018-02
  目次へ移動
目次

前
 
次
 

13 Javaプロジェクトの最適化

JDeveloperには、Javaプロジェクトの最適化、コード監査、プロファイリング、およびユニット・テストに対応できる多数の機能が用意されています。

最適化では、コードの改善および保守を困難にしている不具合が検出されます。JDeveloperの最適化ツールは、不具合を見つけ出して修正し、プログラムの高速実行、サイズ縮小、すぐれた保守容易性を実現するのに役立ちます。

JDeveloperのコード監査ツールを使用すると、このような不具合を検出および修正できます。コード監査は、構文が正しいかどうかではなく、プログラミング規格に準拠しているかどうかを調べるものです。コードは、コンパイルが不可能または実行不可能な場合も監査できます。

プロファイラは、プログラムに関する統計を収集して、パフォーマンスの問題を診断できるようにします。プロファイラは、実行中のプログラムによるプロセッサおよびメモリーのリソースの使用状況を監視し、ログに記録します。また、統計を収集して、パフォーマンスの問題をより容易に診断し、コードの非効率な部分を修正できるようにします。

JDeveloperには、アプリケーションをテストするために「新規ギャラリ」からアクセス可能なJUnitウィザードがあり、テスト・フィクスチャ、テスト・ケース、およびテスト・スイートを作成できます。JUnitなどの自動テストツールにより、通常の、信頼できるユニット・テストをより簡単に実行できます。JUnitは、JDeveloperにインストールおよび統合できるオプション機能です。

この章には次の項が含まれます:

13.1 Javaプロジェクトの最適化について

JDeveloperでは、Javaコードの品質およびパフォーマンスを分析するためのツールが提供されています。これらのツールを使用すると、コードの品質とプログラミング・スキルの両方が向上します。JDeveloperの監査機能を使用すると、Javaコードがプログラミング規格に準拠しているかどうかを分析できます。

最適化の前に、まず最適化が必要かどうかを検討します。

13.2 コード監査の理解

監査とは、プログラミング規格を定義している規則およびメトリックに準拠しているかどうかについてのコードの静的な分析のことです。ソフトウェアのコード監査は、バグ、セキュリティ侵害またはプログラミング規則違反を発見する目的で行われる、プログラミング・プロジェクト内のソース・コードの包括的な分析です。

プロファイルを作成してカスタマイズし、使用する規則を選択して個々の規則のパラメータを設定できます。詳細は、それぞれのコード監査規則およびコード測定を参照してください。

JDeveloperのコード監査およびコード測定の機能は拡張できます。コード監査およびコード測定は、それぞれカスタマイズおよび拡張可能なソース・コード分析および変換フレームワークのある2つの側面です。コード監査およびコード測定用のパブリックAPIは、oracle.jdeveloper.auditパッケージです。

Javaコードを監査するには、次のようにします。

監査レポートには、ルール違反および測定結果がツリーに編成されて表示されます。ツリーの各行は構成メンバーまたは違反のいずれかに対応しており、その構成メンバーまたは理論上の違反に対するすべての測定値が含まれます。構成メンバーは、メソッド、クラス、ファイル、プロジェクトまたはワークスペースです。

13.2.1 コード監査ルールの理解

コード監査規則は、静的かつ定性的なコード分析です。

コード監査プロファイルで、プロパティを設定することによって個別ルールの有効化や構成を実行できます。コード構成メンバーが規則に従っていない場合、規則違反が報告されます。一部の規則には自動修正が定義されており、ユーザーが適用を選択できます。

ルールには、表13-1に示すプロパティが含まれています。

表13-1 ルール・プロパティ

プロパティ 説明

デフォルト修正

この規則の違反に対する修正が使用されるのは、「デフォルトの修正を適用」が構成メンバーに適用されている場合です。

パターン

規則と異なる識別子を検出するフィルタとして使用される正規表現です。

重大度

コード監査レポートで規則違反をソートする場合に使用します。

可視性

アクセス・レベルのキーワードに基づくしきい値です。違反は、可視性が選択されているクラスまたはメソッドで発生した場合にのみ報告されます。


13.2.2 コード監査メトリックの理解

監査のコード測定は、静的かつ量的なコード分析です。

コード監査プロファイルで、個別メトリックの有効化と構成が実行できます。コード測定は、しきい値を使用して設定します。コード構成メンバーがしきい値を超えると、しきい値超過の測定がコード監査レポートに報告されます。

JDeveloperでは、表13-2に示すメトリックが測定されます。

表13-2 コード監査メトリック

メトリック 説明

継承ツリーの深度(DIT)

クラスの継承ツリーの深さ。通常、java.lang.ObjectのDITは1、java.lang.Objectを直接拡張したクラスのDITは2のようになります。

文の数(NOS)

Java文でのメソッド、クラスまたは他の構成メンバーのサイズ。

循環的複雑度(V(G))

メソッドのブランチの複雑さ。メソッドを含む構成メンバー(クラスやプロジェクトなど)には、そのメソッドについて測定されたうち最大の複雑度が割り当てられます。値が10を超える場合は通常、問題ありと判断されます。


13.2.3 コード監査ツールの使用

監査ツールを使用すると、監査レポートを表示したり、規則違反やしきい値を超える測定結果を調査および修正できます。コード監査が開始されると、「ログ」ウィンドウに新しいタブが作成され、このタブにコード監査レポートが表示されます。

監査とは、プログラミング規格を定義している規則およびメトリックに準拠しているかどうかについてのコードの静的な分析のことです。コード監査では、コードの改善および保守を困難にしている不具合が検出されます。JDeveloperの監査ツールを使用すると、このような不具合を検出および修正できます。コンパイルが不可能または実行不可能な場合でも、コードの監査は可能です。

13.2.4 「コード監査」ウィンドウの「レポート」パネルの使用

コード監査レポートとは、構成に編成されたツリーとして表示される規則違反およびコード測定結果のセットのことです。構成には、メソッド、クラス、パッケージ、ファイル、プロジェクトまたはワークスペースがあります。監査プロファイルに規則が含まれている場合、表には「重大度」列が含まれ、指定した構成の重大度が表示されます。監査プロファイルにメトリックが含まれている場合、表にはメトリックごとに列が追加され、構成の測定結果が表示されます。

列のコンテンツを基にレポートをソートするには、列ヘッダーをクリックします。ソート順序を逆にするには、再度クリックします。

13.2.5 「コード監査」ウィンドウのツールバーの使用

「ログ」ウィンドウのツールバーから、表13-3に示した操作を実行できます。

表13-3 「コード監査」ウィンドウのツールバー・アイコン

アイコン 名前 説明

「リフレッシュ」アイコン


リフレッシュ

同じプロファイルを使用して同じ選択項目に対してコード監査を再実行する場合にクリックします。

「取消」アイコン


取消

実行中の監査を中断する場合にクリックします。結果の一部が表示される場合があります。

「エクスポート」アイコン


エクスポート

レポートをファイルに保存できる「結果のエクスポート」ダイアログを開く場合にクリックします。結果は、XML、HTMLまたはプレーン・テキストで保存できます。

「すべて展開」アイコン


すべて展開

レポート内のすべてのコンテナ・ノードを展開し、すべての行を表示する場合にクリックします。

「すべて閉じる」アイコン


すべて閉じる

レポート内のすべてのコンテナ・ノードを閉じ、トップレベルの構成以外のすべてを非表示にする場合にクリックします。

「構成をグループ化」アイコン


構成をグループ化

表示するコンテナ構成のタイプを指定できる「グループ化」ダイアログを開く場合にクリックします。構成別にグループ化すると、結果の適切な編成、不具合および違反の迅速な追跡、結果を簡単に分析できます。

「修正」アイコン


修正

ドロップダウン・メニューから規則違反に対する修正を選択します。個々の規則違反に対して、その違反タイプに定義されている修正から選択します。グループ構成には、「デフォルトの修正を適用」のみを選択できます。これにより、そのタイプに定義されているデフォルトの修正(存在する場合)が適用されます。

「しきい値を超えるもののみ表示」アイコン


しきい値を超えるもののみ表示

許容範囲内にある測定結果の表示を切り替えます。しきい値は、コード測定の設定可能なプロパティの1つです。


13.2.6 「コード監査」ウィンドウのポップアップ・メニューの使用

1つ以上の構成(コンテナ・ノード)または規則違反(リーフ・ノード)を選択し、右クリックしてポップアップ・メニューを開きます。ポップアップ・メニューから、選択した構成または規則違反に対して、表13-4に示す操作を実行できます。

表13-4 「コード監査」ウィンドウのポップアップ・メニュー項目

名前 説明

デフォルトの修正を適用

選択した各規則違反または選択した構成内のすべての違反にデフォルトの修正(存在する場合)を適用する場合に選択します。デフォルトの修正は、「ツール」「プリファレンス」「コード監査: プロファイル」ページを使用して定義できます。

<修正>の適用

構成内の選択した規則違反に対してこの修正を適用する場合に選択します。

<規則>について

この規則違反に対して適用される規則の説明を表示する場合に選択します。

<規則>違反を非表示

選択した規則のすべての違反をレポートから削除する場合に選択します。

非表示の違反を表示

前に非表示にしたすべての違反をリストアする場合に選択します。

しきい値を超えるもののみ表示

許容範囲内にある測定結果の表示を切り替える場合にクリックします。

取消

実行中のコード監査を終了する場合に選択します。

リフレッシュ

コード監査を再実行する場合に選択します。

グループ化

表示するコンテナ構成のタイプを指定できる「グループ化」ダイアログを開く場合に選択します。

すべて展開

レポート内のすべてのコンテナ・ノードを展開し、すべての行を表示する場合にクリックします。

すべて閉じる

レポート内のすべてのコンテナ・ノードを閉じ、トップレベルの構成以外のすべてを非表示にする場合にクリックします。

ソースに移動

規則違反があった位置でソース・ファイルを開く場合に選択します。必要に応じて、ファイルを編集して違反を修正できます。

エクスポート

レポートをファイルに保存できる「結果をエクスポート」ダイアログを開く場合に選択します。


13.2.7 JDeveloperでJavaコードを監査する方法

JDeveloperのコード監査ツールを使用すると、コードの改善および保守を困難にしている不具合が検出されます。コードは、コンパイルが不可能または実行不可能な場合も監査できます。監査のフォーカスは、コード監査の規則およびコード測定のセットであるプロファイルによって定義されます。

Javaコードを監査するには、次のようにします。

  1. Javaプログラムの分析に使用する規則、コード・アシスト、コード測定を指定するコード監査プロファイルを作成します。コード監査プロファイルで、プロパティの設定によって個別の規則やメトリックを有効にしたり、構成できます。コード構成メンバーが規則に従っていない場合、規則違反が報告されます。詳細は、第13.2.9項「コード監査プロファイルの作成方法」を参照してください。

  2. 監査レポートを実行します。

  3. 完了した監査レポートで規則違反をインスペクトします。詳細は、第13.2.20項「コード監査レポートの違反またはコード測定結果のインスペクト方法」を参照してください。

    監査レポートには、ルール違反および測定結果がツリーに編成されて表示されます。ツリーの各行は構成メンバーまたは違反のいずれかに対応しており、その構成メンバーまたは理論上の違反に対するすべての測定値が含まれます。構成メンバーは、メソッド、クラス、ファイル、プロジェクトまたはワークスペースです。

  4. コード監査規則違反を、手動でソースを編集して修正できます。一部の規則違反については、自動修正を選択して修正します。詳細は、第13.2.21項「コード監査規則違反の修正方法」を参照してください。

  5. 監査を再実行する場合には、規則、コード・アシストおよびメトリックを有効化または無効化するか、またはそれらの構成を変更することによって、コード監査プロファイルを変更できます。詳細は、第13.2.9項「コード監査プロファイルの作成方法」を参照してください。

完了したコード監査レポートをXMLファイル、HTML形式またはテキスト・ファイルとして保存できます。詳細は、第13.2.19項「コード監査レポートの保存方法」を参照してください。書式設定は、/jdev//audit/stylesheetsディレクトリ(このディレクトリはコード監査を実行するまで作成されません)のXSLスタイルシート・ファイルで定義されます。カスタム・フォーマットを作成するには、事前定義されたスタイルシート・ファイルの1つをコピーして、このディレクトリに追加します。

13.2.8 コマンドラインからのJavaコードの監査

JDeveloperインストールに付属している<jdev_install>/jdeveloper/jdev/binディレクトリ内のojaudit.exeを起動すると、コマンドラインからワークスペース、プロジェクトまたはソース・ファイルを監査できます。

シノプシス

ojaudit option... file...

表13-5は、監査の際に使用できるパラメータを示しています。

表13-5 コマンドライン・パラメータ

パラメータ 説明

file

コード監査対象のワークスペース・ファイル(.jws)、プロジェクト・ファイル(.jpr)またはソース・ファイル(.java)。

-classpath path

プロジェクトが監査されていない場合に、監査するファイルのクラスパスを設定します。

-encoding code

レポートの文字コード。指定しない場合は、プロジェクトに指定されている文字コードが使用されます(プロジェクトの「プロジェクト・プロパティ」ダイアログの「コンパイラ」ページを参照してください)。

-disable rule

プロファイル内の規則を無効にします。複数の値を指定するには、このオプションを繰り返します。

-enable rule

プロファイル内の規則を有効にします。複数の値を指定するには、このオプションを繰り返します。

-fail severity

監査者によって障害とみなされる問題の重大度を設定します。

-f[ix]

デフォルトの修正をコードに適用します。このオプションを適用すると、ソース・ファイルが変更されます。

-h[elp]

helpコマンドに関するヘルプを表示して終了します。

-o[utput] file

出力ファイルのパス名。省略時は、出力は標準出力に書き込まれます。

-p[rofile] name

(必須)使用するプロファイル。JDeveloperで定義されているプロファイル(「ツール」「プリファレンス」ダイアログの「コード監査」「コード監査プロファイル」ページで設定)のいずれか、またはエクスポートされたコード監査プロファイル・ファイルのパス名です。

一致するプロファイルを検索するときに、大文字/小文字および空白は無視されます。

-profilehelp

定義済プロファイル名を出力して終了します。

-project file

ソース・ファイルであるパラメータに使用されるプロジェクト・コンテキスト。すべてのパラメータがプロジェクトまたはワークスペースの場合、このオプションは必要ありません。

-q[uiet]

著作権メッセージを非表示にします。

-sourcepath path

プロジェクトが監査されていない場合に、監査するファイルのソースパスを設定します。

-s[tyle] file

レポートに適用されるXSLTスタイルシート。この名前は、JDeveloperで定義されているスタイルシートか、またはスタイルシート・ファイルのパス名です。指定しない場合、XMLファイルで出力されます。

一致する定義済スタイルシートを検索するとき、大文字/小文字および空白は無視されます。

-stylehelp

定義済スタイルシート名を出力して終了します。

-title text

レポートに使用されるタイトル。-untitledを指定していない場合にこのオプションを指定しないと、デフォルトのタイトルが使用されます。

-untitled

レポートのタイトルを省略します。

-v[erbose]

実行メッセージをすべて表示します。

-version

コマンドのバージョンを表示して終了します。

-w[orkspace]

ワークスペースではないパラメータに使用されるワークスペース・コンテキスト。ワークスペースが指定されていない場合、デフォルトのワークスペースが合成されます。

workspace file

監査するファイルのワークスペース・コンテキストを設定します。


13.2.9 コード監査プロファイルの作成方法

コード監査プロファイルでは、Javaコードの分析に使用する規則、コード・アシストおよびメトリックを指定することによって、監査対象を定義します。「コード監査プロファイル」プリファレンス・ページから、コード監査プロファイルのルール、コード・アシストおよびメトリックをアクティブ化および非アクティブ化することができます。いくつかのプロファイルは事前定義済ですが、既存のプロファイルを変更してその他のプロファイルを作成できます。規則、コード・アシストおよびメトリックを有効化または無効化するか、またはそれらの構成を変更することによって、コード監査プロファイルを変更できます。

表13-6に示すように、特定の監査プロファイルは、デフォルトでは、一部のJDeveloperプロセスと機能により使用されます。

表13-6 監査プロファイル

プロファイル 説明

コード・アシスト・ルール

ソース・エディタ、「問題」ウィンドウ、「アプリケーション概要」、および「ファイル・リスト」により使用されます。

コンパイル・ルール

「プリファレンス」ダイアログの「コード監査」ページで「コンパイル中のコード監査」が選択されている場合に、コンパイルの最後で使用されます。

コード監査ルール

Auditコマンドの初期値です。ただし、「監査」ダイアログでは最後に選択されたプロファイルが記憶されるため、設定は永続的ではありません。

Javadocルール

<<Note to Dave: Add description of these options?>>

ADFルール



JDeveloperには事前定義プロファイルがあり、使用可能なルール、コード・アシスト、およびメトリックの組合せがそれぞれ異なっています。

  • ADFベスト・プラクティスのルール

  • すべてのメトリック

  • すべてのルール

  • コード監査ルール

  • コード・アシスト・ルール

  • コンパイル・ルール

  • Javadocルール

監査プロファイルを作成する手順:

  1. メイン・メニューから、「ツール」「プリファレンス」を選択します。

  2. 「コード監査」「プロファイル」を選択します。

  3. 「プロファイル」ドロップダウン・メニューからコピーするプロファイルを選択します。

    図13-1に示すように、選択されたプロファイルのプロパティ名と現在の値が右側のパネルに表示されます。選択されたアイテムの説明が「説明」ボックスに表示されます。そのプロパティと設定が右側のペインに表示されます。

    図13-1 「コード監査プロファイル」ページ

    「コード監査プロファイル」ページ
  4. 新しいプロファイルを有効にするための規則、アシストおよびコード測定を選択します。

  5. 「別名保存」をクリックします。

  6. 新しいプロファイルの名前を入力し、「保存」をクリックします。


    注意:

    名前では大/小文字および空白は区別されませんが、大/小文字および空白は保持されます。新しい名前が既存の名前と大/小文字または空白のみが異なる場合は、そのことを通知する警告メッセージが表示されます。


    新しいプロファイル名が、プリファレンスの「コード監査」→「プロファイル」ページの「プロファイル」ボックスに表示されます。

  7. 「OK」をクリックします。

13.2.10 コード監査プロファイルの削除方法

既存のコード監査プロファイルは削除できますが、事前定義プロファイルは削除できません。「コード監査」 - 「プロファイル」ページで事前定義のコード監査プロファイルを選択すると、「削除」ボタンがグレーアウトになります。

既存のコード監査プロファイルを削除する手順は次のとおりです。

  1. メイン・メニューから、「ツール」「プリファレンス」を選択します。

    「設定」ダイアログが開きます。

  2. 「コード監査」 - 「プロファイル」ページを選択します。

  3. 「プロファイル」ドロップダウン・メニューから削除するプロファイルを選択します。

  4. 削除」をクリックします。

    該当するプロファイルの名前が「プロファイル」ボックスから削除されます。

  5. 「OK」をクリックします。

13.2.11 コード監査プロファイルをインポートまたはエクスポートする方法

コード監査プロファイルをインポートまたはエクスポートできます。この操作によって、たとえば、プロファイルを共有したり、ojauditおよび夜間ビルドによって使用されるチェックイン済プロファイルを管理できます。コード監査プロファイルは、XMLファイルとしてインポートまたはエクスポートされます。

コード監査プロファイルをインポートまたはエクスポートするには、次の手順を実行します。

  1. 「ツール」メニューで、「プリファレンス」を選択して「プリファレンス」ダイアログを開きます。

  2. 「コード監査」「プロファイル」を選択します。

  3. 「インポート」または「エクスポート」をクリックし、インポートまたはエクスポートするプロファイルを選択します。

13.2.12 コード監査レポート生成のためにコード監査を実行する方法

Javaプログラムを監査する際に、コード監査レポートを生成できます。コード監査レポートは、規則違反およびしきい値を超えている測定結果のリストです。コード監査レポートでは、これらの問題を調べ、手動または自動で修正できます。

コード監査レポートを生成する手順は次のとおりです。

  1. 「アプリケーション」ウィンドウで、1つ以上のアプリケーション、プロジェクト、またはJavaソース・ファイルを選択します。

    コード監査コマンドは、エディタや「構造」ウィンドウなど、他のビューから選択して実行することもできます。

  2. メイン・メニューから、「ビルド」「コード監査 - <target>、たとえば、「ビルド」「コード監査 - helloWorld.java」を選択します。

  3. 「コード監査 - <target>」ダイアログで、使用するプロファイルを次の2つの方法のいずれかで選択します。

    • 「プロファイル」ドロップダウン・メニューから使用するプロファイルを選択します。

    • 「編集」をクリックしてプロファイルを作成または変更します。

  4. 「実行」をクリックします。

    コード監査レポートが「ログ」ウィンドウに表示され、コード監査が開始されます。監査を停止する場合には、ログのツールバーの停止アイコンをクリックします。

13.2.13 serialVersionUIDを持たないシリアル化可能フィールドのコード監査方法

オブジェクトは、java.io.Serializableインタフェースを実装することによってシリアル化可能とマークされます。これは、バイトにフラット化し後で展開できることを示します。

バージョニングを可能にする、serialVersionUIDという識別子があります。

java.io.Serializableを実装しているがserialVersionUIDを持たないすべてのクラスにフラグを設定するコード監査を実行できます。

コード監査規則を設定するには、次のようにします。

  • メイン・メニューから、「ツール」「設定」「コード監査」「プロファイル」を選択します。

13.2.14 シリアライズできないフィールドのコード監査方法

オブジェクトは、java.io.Serializableインタフェースを実装することによってシリアル化可能とマークされます。これは、バイトにフラット化し後で展開できることを示します。

オブジェクトのフィールドでシリアル化を無効にするには、そのオブジェクトのクラスのフィールドに、Javaのtransientキーワードでタグを設定します。クラスがシリアル化可能とマークされていても、transientとしてマークされておらずシリアル化できないフィールドを含んでいる場合、そのクラスはシリアル化できません。コード監査を実行すると、このようなシリアル化できないフィールドを検出できます。

コード監査規則を設定するには、次のようにします。

  • メイン・メニューから、「ツール」「設定」「コード監査」「プロファイル」を選択します。

13.2.15 コード監査レポートの表示

図13-2に示すように、コード監査レポートは「ログ」ウィンドウのタブ付きペインとして表示されます。

図13-2 コード監査レポート

コード監査レポート

コード監査レポートを使用すると、ルール違反およびしきい値を超えている測定結果を調べ、これを修正できます。

リフレッシュにより、同じプロファイルを使用してコード監査を再実行できます。コードを変更および修正した後でリフレッシュすることもできます。

コード監査レポートをリフレッシュするには、次のようにします。

  • 「ログ」ウィンドウのツールバー内をクリックするか、右クリックして「リフレッシュ」を選択します。

「コード監査結果のエクスポート」ダイアログがクリアされ、新しいコード監査が始まります。コード監査を停止するには、ログのツールバーをクリックします。

13.2.16 コード監査レポートの列の編成方法

コード監査レポートの列を左または右の位置に再配置できます。

コード監査レポート列を編成するには、次のようにします。

  • 列ヘッダーを、任意の位置の左または右までドラッグします。

13.2.17 コード監査レポート行の編成方法

コード監査レポート行は、ルール違反や測定結果、または違反および測定結果のグループです。レポートはツリーとして編成されます。ツリーの行は、構成メンバーまたは違反に対応しており、構成メンバーまたは理論上の違反の測定値が含まれます。構成メンバーは、メソッド、クラス、ファイル、パッケージ・ディレクトリ、プロジェクトまたはワークスペースです。

レポートに表示される構成メンバーを選択できます。

コード監査レポート行を編成するには、次のようにします。

  1. 「ログ」ウィンドウのツールバーで、「グループ化」をクリックします。

  2. 表示する構成を選択します。

  3. 「OK」をクリックします。

  4. 列ヘッダーをクリックして、その列で行をソートします。

    ソート順序を逆にするには、再度クリックします。

13.2.18 フィルタの使用方法

違反が表示されているJavaクラスのセットを削除する場合はフィルタを指定します。パッケージ名、クラス名またはその両方を基準にしてフィルタできます。フィルタは、カンマで区切られた1つ以上のパターンで構成されます。

パターンには、次の特殊文字を含めることができます。

  • *は、任意の数の文字に一致します。

  • ?は、任意の1文字に一致します。

  • !がパターンの先頭にある場合は、除外パターンを示します。

フィルタを渡すクラスのセットは、パターンの順序を考慮して決定されます。非除外パターンでは、パターンに一致するすべてのクラスがセットに追加され、除外パターンでは、パターンに一致するすべてのクラスがセットから削除されます。表13-7は、指定できるフィルタを示しています。

表13-7 フィルタ

名前 説明

パッケージ

完全修飾クラス名の最後の要素以外のすべてに適用されるフィルタのパターンを入力します。このフィールドが空の場合、フィールドは無効です。

ファイル

完全修飾クラス名の最後の要素にのみ適用されるフィルタのパターンを入力します。このフィールドが空の場合、フィールドは無効です。

適用

特定の「パッケージ」フィルタおよび「ファイル」フィルタをレポート行に適用する場合にクリックします。

クリア

「パッケージ」フィルタおよび「ファイル」フィルタを消去する場合やレポート行をリストアする場合にクリックします。


コード監査レポート行をフィルタするには、次のようにします。

  1. コード監査のログ・ウィンドウの「パッケージ」フィールドで、完全修飾クラス名の最後の要素を除くすべての要素に適用される一連のパターンを入力します。このボックスは、「ファイル」フィルタを指定した場合、空白にしておくこともできます。

  2. 「ファイル」フィールドで、完全修飾クラス名の最後の要素のみに適用される一連のパターンを入力します。このボックスは、「パッケージ」フィルタを指定した場合、空白にしておくこともできます。

  3. 「適用」をクリックします。

    選択した行のみを示したレポートが再表示されます。

  4. 「クリア」をクリックして、テキストを「パッケージ」ボックスおよび「ファイル」ボックスから削除します。

13.2.19 コード監査レポートの保存方法

コード監査レポートをXMLファイル、HTML形式またはテキスト・ファイルとして保存できます。

フォーマットは、<jdev_install>/jdev/< system>/audit/stylesheetsディレクトリのXSLスタイルシート・ファイルによって定義されます(このディレクトリはコード監査を実行するまで作成されません)。カスタム・フォーマットを作成するには、事前定義されたスタイルシート・ファイルの1つをコピーして、このディレクトリに追加します。

コード監査レポートを保存するには、次のようにします。

  • 「ログ」ウィンドウのツールバー内をクリックするか、右クリックして「エクスポート」を選択します。

    「コード監査結果のエクスポート」ダイアログが表示されます。タイトル、書式およびレポートの保存先を選択して、「OK」をクリックします。

13.2.20 コード監査レポートの違反またはコード測定結果のインスペクト方法

JDeveloperでは、すべてのコード監査規則違反に関するレポートが生成されます。このウィンドウでは、ドロップダウン・メニューから規則違反に対する修正を選択できます。個々の規則違反に対して、その違反タイプに定義されている修正から選択します。

コード監査規則違反をインスペクトするには、次のようにします。

  1. コード監査レポートで、表示する構成を選択します。

  2. 右クリックして「ソースへ移動」を選択するか、構成メンバーをダブルクリックします。

    ソース・ファイルのエディタが開き、規則違反または測定されたコード要素の場所にカーソルが移動します。

  3. 違反または異常を右クリックし、「情報」を選択すると、違反が発生した規則の詳細を知ることができます。図13-3に示すように、ルールを記述したポップアップが表示されます。

図13-3 ポップアップについて

ポップアップについて

13.2.21 コード監査規則違反の修正方法

コード監査規則違反を、手動でソースを編集して修正できます。一部の規則違反については、自動修正を選択して修正できます。個々の規則違反に対して、その違反タイプに定義されている修正から選択します。グループ構成には、「デフォルトの修正を適用」のみを選択できます。これにより、そのタイプに定義されているデフォルトの修正(存在する場合)が適用されます。

コード監査の規則違反を手動で修正する手順は次のとおりです。

  1. コード監査レポートで、規則違反(「構成」ツリー内のリーフ・ノード)を選択します。

  2. 右クリックし、「ソースへ移動」を選択します。

    ソース・ファイルのエディタが開き、規則違反の場所にカーソルが移動します。

  3. コードを編集して、違反の原因を修正します。

コード監査規則違反に自動修正を適用するには、次のようにします。

  1. コード監査レポートで、規則違反(「構成」ツリー内のリーフ・ノード)を選択します。

  2. 右クリックし、<規則>修正の適用メニュー項目があれば、それを選択します。

    または

    「ログ」ウィンドウのツールバー内をクリックし、<規則>修正の適用メニュー項目のいずれかを選択します。

13.2.22 構成メンバーのコード監査規則違反を修正する方法

構成メンバーでのすべての規則違反に自動修正を適用できます。Default FixプロパティがNone以外の値に設定されている構成メンバーでは、デフォルトの修正が各規則違反に適用されます。

構成メンバーのコード監査規則違反を修正するには、次のようにします。

  1. コード監査レポートで、構成メンバー(「構成」ツリー内のコンテナ・ノード)を選択します。

  2. デフォルトの修正は、次の2つの方法のいずれかを使用して適用できます。

    • 右クリックして「デフォルトの修正を適用」を選択します。

    • 「ログ」ウィンドウのツールバー内をクリックし、デフォルトの値を適用を選択します。

13.2.23 コード監査規則違反を非表示にする方法

コード監査レポートで特定のタイプの規則違反をすべて非表示にできます。この操作によって、特定の規則の違反がすべて非表示になるため、レポートが読みやすくなります。個別の規則違反を非表示にすることはできません。

コード監査規則違反を非表示するには、次のようにします。

  1. コード監査レポートで、規則違反(「構成」ツリー内のリーフ・ノード)を選択します。

  2. 右クリックして「< Rule>違反を非表示」を選択します。

    <Rule>のすべての違反がコード監査レポートから削除されます。削除された規則が親の構成メンバーのサマリーに記録されることはありません。「しきい値を超えるもののみ表示」が有効になっている場合は、空の構成メンバーは削除されます。有効になっていない場合は、違反のみが削除されます。

非表示のコード監査規則違反を復元するには、次のようにします。

  1. コード監査レポートで右クリックして、ポップアップ・メニューを開きます。

  2. 「非表示の違反を表示」を選択します。

    以前非表示にされたすべての規則違反が、コード監査レポートに復元されます。

13.2.24 コード監査レポートのコード測定結果を非表示にする方法

コード測定レポートには、分析対象コードの構成メンバーに関する測定結果が表示されます。しきい値以下の結果を非表示にすると、しきい値を超えている測定結果にレポートをフォーカスできます。しきい値は、コード測定の設定可能なプロパティの1つです。

しきい値を超えている測定結果のみを表示するには、次のようにします。

  • 「ログ」ウィンドウのツールバーで、しきい値超過のアイコンをクリックします。もう一度クリックすると、すべての測定結果が表示されます。

削除された測定が、その親となる構成メンバーのサマリーに記録されることはありません。「しきい値を超えるもののみ表示」が有効になっている場合は、空の構成メンバーは削除されます。有効になっていない場合は、違反のみが削除されます。

13.3 プロジェクトのプロファイリング

JDeveloperには、次の3つのプロファイリング・モードが用意されています。

13.3.1 CPUプロファイラについて

CPUプロファイラは、アプリケーションがプロセッサに及ぼす影響を分析するために使用します。CPUプロファイラを使用すると、起動、初期化、再描画およびコンパイルなどのアプリケーションの機能をテストできます。CPUプロファイラでは、アプリケーションのCPU使用率に関する統計が収集されます。

CPUプロファイリングを使用すると、プログラムでCPU時間を最も多く消費するメソッドとスレッドを特定できます。CPUプロファイラによって、アプリケーションのパフォーマンスに関する統計データが表示されます。

プロファイラを使用して、アプリケーションによるCPU時間の使用方法をサンプリングしたり、メソッド・コールをカウントできます。一度に1つのモードだけが選択できます。一度に両方を選択することはできません。


注意:

一度に1つのモードだけが選択できます。両方のモードを同時に選択することはできません。


13.3.2 メモリー・プロファイラについて

メモリー・プロファイラを使用すると、プログラムがどのようにJavaヒープを使用しているかを把握できます。メモリー・リークやヒープの非効率な使用、および一般にメモリーに関する疑わしい動作を検出できます。プロファイラには、メモリー・プロファイリングの2つのツール、クイック(サンプリング済)および拡張(計測済)が組み込まれています。

  • クイック(サンプリング済): アプリケーションをサンプリングし、定期的にスタック・トレースを取得します。このオプションは、メソッドをインストゥルメントする方法と比較して正確性が低下しますが、オーバーヘッドは低くなります。このオプションは、インストゥルメントが必要になる可能性のあるメソッドを見つけるのに役立ちます。

  • 拡張(計測済): プロファイルされたアプリケーションのメソッドがすべて計測されます。ルート・メソッドを定義することによって、計測されるアプリケーションのコード部分を制限するように選択できます。このオプションにより、プロファイリングのオーバーヘッドを大幅に削減できます。

13.3.3 プロファイリング・セッションの開始方法

実行の対象となるプロジェクトがローカル・マシンに存在している場合は、追加構成なしでプロジェクトをプロファイルすることができます。ローカル・プロジェクトをプロファイルする際、プロジェクトを起動してJDeveloperの中からプロファイリング・セッションを開始します。

ローカル・アプリケーションのプロファイリングを実行したいけれども、JDeveloperからアプリケーションを開始できない、または開始したくない場合には、アプリケーションにIDEをアタッチしてアプリケーションをプロファイルすることができます。詳細は、第13.3.14項「アタッチ・モードを使用したプロファイリング」を参照してください。

ローカル・プロジェクトをプロファイルするには、エディタでプロジェクトを開く必要があります。IDEでプロファイラを使用するには、事前にプロファイラを調整しておく必要があります。プロファイラの調整は1回だけで十分です。詳細は、「プロジェクトをはじめてプロファイルする場合、IDEでプロジェクト・ビルド・スクリプトを変更してプロファイラを統合する必要があります」に関する項を参照してください。IDEでは、プロジェクト・ビルド・スクリプトのバックアップを作成した後で変更が実行されます。

プロファイリング・セッションを開始する手順は次のとおりです。

  • メイン・メニューから、「実行」プロファイラ <project_name>をクリックします。

    プロファイラをアタッチするには、メイン・メニューから「実行」「プロファイラのアタッチ」をクリックします。

13.3.4 プロファイリングのウィンドウについて

アプリケーションをプロファイリングする際、IDEで提供される一連のウィンドウによってプロファイリング・プロセスの制御とプロファイリングの結果表示が可能になります。次のウィンドウを開くには、「ウィンドウ」「プロファイリング」「ウィンドウ名」(例: 「ウィンドウ」「プロファイリング」「プロファイリング・ポイント」)を選択します。

次のウィンドウを使用すると、プロファイリング・セッションの制御と構成を実行できます。

  • 「プロファイラ」ウィンドウ: このウィンドウには、プロファイリング・セッションを開始、停止、変更するコントロール、プロファイリング結果が表示されるウィンドウを開くコントロール、およびスナップショットを管理するコントロールが表示されます。

  • 「プロファイリング・ポイント」ウィンドウ: このウィンドウを使用して、プロファイリング・ポイントの表示と管理を実行できます。

プロファイラは、次のウィンドウを使用してプロファイリング結果を表示します。

  • 「プロファイリングのライブ結果」

  • 「遠隔測定の概要」ウィンドウ

  • 「VM遠隔測定」ウィンドウ

  • 「スレッドのプロファイリング」ウィンドウ

  • 「スナップショット」ウィンドウ

  • 「ヒープ」ウィンドウ

13.3.5 プロファイリング結果について

プロファイリング・セッションから取得したプロファイリング結果は、選択するプロファイリング・タスクによって異なります。プロファイリング・セッションが進行中の場合は、プロファイリング・タスクのライブ結果を確認することができます。プロファイリング・セッションの任意の時点で、結果を取得して保存できます。

「ライブ結果」

「ライブ結果」ウィンドウには、プロファイリング・セッションの進行中にわたるプロファイリング・タスクの結果が表示されます。

  • 「VM遠隔測定」: 「VM遠隔測定」ウィンドウには、スレッド・アクティビティおよび、VMでのメモリー・ヒープとガベージ・コレクションに関する高水準のデータが表示されます。

  • 「スレッド」: 「スレッド」ウィンドウには、アプリケーションのスレッド・アクティビティに関する詳細情報が表示されます。

  • 「遠隔測定の概要」: 「遠隔測定の概要」ウィンドウには、「VM遠隔測定」ウィンドウに表示されるグラフの小型バージョンが表示されます。

  • 「プロファイリングのライブ結果」: 「プロファイリングのライブ結果」ウィンドウには、実行中のプロファイリング・セッションのライブ・データが表示されます。表示されるライブ結果は、選択されたプロファイリング・タスクによって異なります。注意: 「プロファイリングのライブ結果」ビューは、アプリケーションを監視しているときには使用できません。

これらのウィンドウを開くには、メイン・メニューから「ウィンドウ」「プロファイリング」「ウィンドウ名」を選択します。

取得した結果

取得した結果のウィンドウには、プロファイリング・セッションの特定の時点におけるプロファイリング・データが表示されます。結果の取得はプロファイリング・セッション中のどの時点でも可能であり、その結果はプロジェクトまたはローカル・システムに保存できます。保存した取得結果を表示するのに、プロファイリング・セッションを実行中である必要はありません。

  • 「スナップショット」: このビューには、プロファイリング・セッションの取得結果が表示されます。スナップショットに含まれているデータは、スナップショットの撮影時に実行しているプロファイリング・タスクによって異なります。

  • 「ヒープ」: このビューにはヒープ・ダンプが表示されます。このビューで、ヒープのコンテンツを調べることができます。

  • ビューをイメージとして保存: 結果ウィンドウに表示されている現在のビューの.pngイメージは、ツールバーの「現在のビューを画像に保存」ボタンを使用して保存できます。このボタンは、プロファイル・ビューで画像への保存をサポートしている場合にかぎり、使用できます。

13.3.6 プロファイラの調整方法

IDEを使用してアプリケーションのプロファイリングを実行するには、事前にIDEを調整しておく必要があります。この調整プロセスは、プロファイリングに使用するJDKごとに実行する必要があります。これは、アプリケーションのバイトコード計測によってある程度のオーバーヘッドが生じ、より正確な結果を得るためには、コード計測にかかる時間を要因から取り除く必要があるために行います。

ローカル・システム用にIDEを調整する手順は次のとおりです。

  1. 実行中のその他のプログラムをすべて終了します。

    他のアプリケーションを実行中であっても調整は実行されますが、調整の実行時にCPU集中型プログラムを実行すると、正確なプロファイリング結果が得られない可能性があります。

  2. メイン・メニューから、「実行」「プロファイラ」プロファイリング調整の実行を選択します。

  3. プロファイリングに使用するJavaプラットフォームを選択して、「OK」をクリックします。


    注意:

    Javaプラットフォームは、「ツール」→「ライブラリの管理」ページでJava SE定義に追加されている場合のみ、調整できます。


    「OK」をクリックすると、選択したJavaプラットフォームに関する調整データが収集されます。調整プロセスが完了したら、IDEを使用してアプリケーションのプロファイリングを開始できます。

    複数のコンピュータまたはシステム間で調整データを共有しないようにしてください。


    注意:

    IDEの調整は、使用するJDKごとに1回だけで十分です。ただし、システムのパフォーマンスに影響するような変更をローカル構成またはリモート構成に加えた場合には、調整プロセスを再実行することをお薦めします。システム・パフォーマンスに影響を与える可能性のある変更とは、次のようなものです。

    • ハードウェアのアップグレード

    • オペレーティング・システムの有意な変更またはアップグレード

    • プロファイリングに使用するJavaプラットフォームのアップグレード


13.3.7 ヒープ・ダンプの取得方法

プロファイリング・セッションの進行中にヒープ・ダンプを取得できます。ヒープ・ダンプを取得するときに、ヒープをプロジェクトまたはローカル・ファイル・システムに保存するよう要求されます。ヒープ・ダンプを保存した後で、随時ヒープ・ダンプをロードして、ヒープ上のオブジェクトを参照したり、個別オブジェクトの参照を特定したり、ヒープ・ダンプの比較によるスナップショット間の相違を確認したりすることができます。ヒープ・ダンプをロードしたり参照したりするために、プロファイリング・セッションが実行中である必要はありません。

ヒープ・ダンプを取得するには、アプリケーションがJDK 1.5.0_12またはそれ以降で実行している必要があります。

プロファイリング・ポイントを使用してヒープ・ダンプを取得する手順は次のとおりです。

  1. プロファイリング・ポイントを配置するコードが含まれているソース・ファイルを開きます。

  2. プロファイリング・ポイントを配置するコードの行を右クリックして、「プロファイリング・ポイントの追加」を選択します。

  3. 「プロファイリング・ポイント・タイプ」リストで、次のスナップショット・ポイントのいずれか1つを選択して「次へ」をクリックします。

    • スナップショットの取得

    • 時間によるスナップショットの取得

    • トリガーによるスナップショットの取得

  4. ウィザードの「プロパティのカスタマイズ」ページで、スナップショットのタイプとして「ヒープ・ダンプ」を選択し、追加設定を変更します。「ヒープ・ダンプ」オプションは、「設定」→「取得」から使用できます。

プロファイリング・ポイントを使用してヒープ・ダンプを取得する際、プロファイリング・ポイントを配置するソース・コード内のポイントを指定します。たとえば、スレッドが特定のメソッドに入ったときに、ヒープ・ダンプを取得する必要が生じることがあります。

OutOfMemoryエラー時にヒープ・ダンプを取得する手順は次のとおりです。

  1. メイン・メニューから、「ツール」「設定」「プロファイラ」を選択します。

  2. 「OutOfMemoryError時」リストで、OutOfMemoryError発生時のIDEの動作を指定するオプションをドロップダウン・リストから選択します。

    デフォルトの動作は、ヒープ・ダンプをプロファイル済プロジェクトに保存することです。

13.3.8 オブジェクト問合せ言語(OQL)を使用したヒープ・ダンプの分析方法

OQLはSQLに似た問合せ言語であり、Javaヒープに問い合わせて、そのJavaヒープから要求された情報のフィルタ処理/選択を可能にします。「クラスXのすべてのインスタンスを表示」というような事前定義の問合せはツールによってすでにサポートされていますが、OQLでは柔軟性が高くなっています。OQLは、JavaScript式言語に基づいています。

「ヒープ」ウィンドウでJavaヒープをロードする際、このウィンドウの「OQLコンソール」タブをクリックしてOQLエディタを開くことができます。OQLコンソールには、OQLエディタ、保存済OQL問合せウィンドウ、および問合せ結果を表示するウィンドウが含まれています。任意のサンプルOQL問合せを使用したり、ヒープ・データをフィルタ処理および選択する問合せを作成して、Javaヒープから必要な情報を特定することができます。問合せを選択または作成した後で、Javaヒープに対して問合せを実行して、結果を表示できます。

OQL問合せのフォームは次のとおりです。

select <JavaScript expression to select>
[ from [instanceof] <class name> <identifier>
[ where <JavaScript boolean expression to filter> ] ]

ここでは、class nameは完全修飾Javaクラス名(例: java.net.URL)または配列クラス名、char[] (または[C)はchar配列名、java.io.File (または[Ljava.io.File;)はjava.io.File[]の名前、というようになります。完全修飾されたクラス名が、実行時にJavaクラスを常に一意に識別するとはかぎりません。同名であっても、別のローダーによってロードされた複数のJavaクラスが存在している場合もあります。したがって、クラス名にはクラス・オブジェクトのID文字列が使用できます。instanceofキーワードが使用されている場合は、サブタイプ・オブジェクトが選択されます。このキーワードが指定されていない場合は、指定されたクラスのインスタンスのみが選択されます。from句とwhere句は両方ともオプションです。

select句および(オプションとして)where句では、式はJavaScript式で使用されます。フィールドに自然構文でアクセスできるようにするために、Javaヒープ・オブジェクトは便利なスクリプト・オブジェクトとしてラップされます。たとえば、Javaフィールドはobj.field_name構文でアクセスでき、配列要素はarray[index]構文でアクセスできます。選択されたJavaオブジェクトはそれぞれ、from句で指定された識別子名のJavaScript変数にバインドされます。

13.3.8.1 OQLの例

長さが100以上のStringをすべて選択します。

select s from java.lang.String s where s.count >= 100

長さが256以上のint配列をすべて選択します。

select a from int[] a where a.length >= 256

正規表現に一致するStringのコンテンツを表示します。

select {instance: s, content: s.toString()} from java.lang.String s
    where /java/(s.toString())

すべてのFileオブジェクトのパス値を表示します。

select file.path.toString() from java.io.File file

すべてのClassLoaderクラスの名前を表示します。

select classof(cl).name 
    from instanceof java.lang.ClassLoader cl

指定されたID文字列によって識別されるClassのインスタンスを表示します。

select o from instanceof 0xd404b198 o

0xd404b198はClassのIDです(セッション内)。これを検索するには、そのクラスのページに表示されたIDを調べます。

13.3.8.2 OQLの組込みオブジェクトと関数

ヒープ・オブジェクト

ヒープ組込みオブジェクトは、次のメソッドをサポートしています。

  • heap.forEachClass: Javaクラスごとにコールバック関数をコールします。

    heap.forEachClass(callback);
    
  • heap.forEachObject: Javaオブジェクトごとにコールバック関数をコールします。

    heap.forEachObject(callback, clazz, includeSubtypes);
    

    clazzは、インスタンスが選択されているクラスです。これが指定されない場合、java.lang.Object. includeSubtypesのデフォルトは、サブタイプ・インスタンスを含めるかどうかを指定するブール・フラグになります。このフラグのデフォルト値はtrueです。

  • heap.findClass: 指定された名前のJavaクラスを検索します。

    heap.findClass(className);
    

    この場合のclassNameは、検索するクラスの名前です。結果として得られるClassオブジェクトのプロパティは、次のとおりです。

    • name: クラスの名前。

    • superclass: スーパークラスのClassオブジェクト(または、java.lang.Objectの場合はnull)。

    • statics: Classの静的フィールドの名前と値のペア。

    • fields: フィールド・オブジェクトの配列。フィールド・オブジェクトのプロパティはnameとsignatureです。

    • loader: このクラスをロードしたClassLoaderオブジェクト。

    Classオブジェクトのメソッドは、次のとおりです。

    • isSubclassOf: 指定されたClassがこのクラスの直接または間接サブクラスかどうかをテストします。

    • isSuperclassOf: 指定されたClassがこのクラスの直接または間接のスーパークラスかどうかをテストします。

    • subclasses: 直接および間接サブクラスの配列を返します。

    • superclasses: 直接および間接スーパークラスの配列を返します。

  • heap.findObject: 指定されたオブジェクトIDからオブジェクトを検索します。

    heap.findObject(stringIdOfObject);
    
  • heap.classes: すべてのJavaクラスの列挙を返します。

  • heap.objects: Javaオブジェクトの列挙を返します。

    heap.objects(clazz, [includeSubtypes], [filter])
    

    clazzは、インスタンスが選択されているクラスです。これが指定されない場合、java.lang.Object. includeSubtypesのデフォルトは、サブタイプ・インスタンスを含めるかどうかを指定するブール・フラグになります。このフラグのデフォルト値はtrueです。このメソッドでは、オプションのフィルタ式を受け入れてオブジェクトの結果セットをフィルタ処理します。

  • heap.finalizables: - ファイナライズが保留中であるJavaオブジェクトの列挙を返します。

  • heap.livepaths: - 指定されたオブジェクトがアライブしているパスの列挙を返します。このメソッドでは、ブール・フラグであるオプションの第2パラメータを受け入れます。このフラグにより、弱い参照のあるパスを含めるかどうかが指定されます。デフォルトでは、弱い参照のあるパスは含まれません。

    select heap.livepaths(s) from java.lang.String s
    

    この配列の各要素が、別の配列になっています。後の配列には、パスの「参照チェーン」に入っているオブジェクトが含まれています。

  • heap.roots: - ヒープのRootの列挙が返されます。

    各Rootオブジェクトのプロパティは、次のとおりです。

    • id: このルートにより参照されるオブジェクトの文字列ID

    • type: Rootの記述タイプ(JNIグローバル、JNIローカル、Java Staticなど)

    • description: Rootの文字列の記述

    • referrer: このルートに責任を持つ、またはnullであるThreadオブジェクトまたはClassオブジェクト

  • クラスjava.lang.Systemの静的フィールド'props'にアクセスします。

    select heap.findClass("java.lang.System").statics.props
    select heap.findClass("java.lang.System").props
    
  • java.lang.Stringクラスのフィールド数を取得します。

    select heap.findClass("java.lang.String").fields.length
    
  • オブジェクトIDが指定されているオブジェクトを検索します。

    select heap.findObject("0xf3800b58")
    
  • 名前パターンjava.net.*を持つクラスをすべて選択します。

    select filter(heap.classes(), "/java.net./(it.name)")
    

個別のオブジェクトに対する関数

  • allocTrace関数

    指定されたJavaオブジェクトがある場合は、その割当てサイト・トレースを返します。allocTraceはframeオブジェクトの配列を返します。各frameオブジェクトのプロパティは、次のとおりです。

    • className: メソッドがframeで実行中であるJavaクラスの名前。

    • methodName: - frameで実行中のJavaメソッドの名前。

    • methodSignature: frameで実行中のJavaメソッドのシグネチャ。

    • sourceFileName: frameで実行中のJavaクラスのソース・ファイルの名前。

    • lineNumber: メソッド内のソース行番号。

  • classof関数

    指定されたJavaオブジェクトのクラス・オブジェクトを返します。結果として得られるオブジェクトは次のプロパティをサポートしています。

    • name: クラスの名前。

    • superclass: スーパークラスのクラス・オブジェクト(または、java.lang.Objectの場合はnull)

    • statics: クラスの静的フィールドの名前と値のペア

    • fields: fieldオブジェクトの配列。fieldオブジェクトのプロパティはnameとsignatureです。

    • loader: このクラスをロードしたClassLoaderオブジェクト。

    Classオブジェクトのメソッドは、次のとおりです。

    • isSubclassOf: 指定されたクラスがこのクラスの直接または間接サブクラスかどうかをテストします。

    • isSuperclassOf: 指定されたクラスがこのクラスの直接または間接のスーパークラスかどうかをテストします。

    • subclasses: 直接および間接サブクラスの配列を返します。

    • superclasses: 直接および間接スーパークラスの配列を返します。

    • 各Referenceタイプ・オブジェクトのクラス名を表示します。

      select classof(o).name from instanceof java.lang.ref.Reference o
      
    • java.io.InputStreamのすべてのサブクラスを表示します。

      select heap.findClass("java.io.InputStream").subclasses()
      
    • java.io.BufferedInputStreamのすべてのスーパークラスを表示します。

      show all superclasses of java.io.BufferedInputStream 
      
  • forEachReferrer関数

    指定されたJavaオブジェクトのリファラごとにコールバック関数をコールします。

  • identical関数

    指定された2つのJavaオブジェクトが同一かどうかを返します。次に例を示します。

    select identical(heap.findClass("Foo").statics.bar, heap.findClass("AnotherClass").statics.bar)
    
  • objectid関数

    指定されたJavaオブジェクトの文字列IDを返します。このIDはheap.findObjectに渡すことができ、識別のためにオブジェクトを比較する場合にも使用できます。次に例を示します。

    select objectid(o) from java.lang.Object o
    
  • reachables関数

    指定されたJavaオブジェクトから推移的に参照されるJavaオブジェクトの配列を返します。オプションとして、カンマ区切りフィールド名である第2パラメータがアクセス可能性の計算から除外されることを受け入れます。フィールドはclass_name.field_nameパターンで作成されます。

    • 各Propertiesインスタンスからアクセス可能なオブジェクトをすべて印刷します。

      select reachables(p) from java.util.Properties p
      
    • java.net.URLからアクセス可能なオブジェクトをすべて印刷しますが、指定されたフィールド経由でアクセス可能なオブジェクトは省略されます。

      select reachables(u, 'java.net.URL.handler') from java.net.URL u
      
  • referrers関数

    指定されたJavaオブジェクトの参照を保持するJavaオブジェクトの列挙を返します。このメソッドでは、ブール・フラグであるオプションの第2パラメータを受け入れます。このフラグにより、弱い参照を含めるかどうかが指定されます。デフォルトでは、弱い参照は含まれません。

    • java.lang.Objectインスタンスごとにリファラ数を印刷します。

      select count(referrers(o)) from java.lang.Object o
      
    • java.io.Fileオブジェクトごとにリファラを印刷します。

      select referrers(f) from java.io.File f
      
    • 2つ以上で参照された場合のみ、URLオブジェクトを印刷します。

      select u from java.net.URL u where count(referrers(u)) > 2
      
  • referees関数

    指定されたJavaオブジェクトが直接参照するJavaオブジェクトの配列を返します。このメソッドでは、ブール・フラグであるオプションの第2パラメータを受け入れます。このフラグにより、弱い参照を含めるかどうかが指定されます。デフォルトでは、弱い参照は含まれません。たとえば、java.io.Fileクラスのすべての静的参照フィールドを印刷するには、次のようにします。

    select referees(heap.findClass("java.io.File"))
    
  • refers関数

    最初のJavaオブジェクトが2番目のJavaオブジェクトを参照するかどうかを返します。

  • root関数

    指定されたオブジェクトがオブジェクトのrootセットのメンバーである場合、この関数は、その理由を説明する説明Rootオブジェクトを返します。指定されたオブジェクトがrootではない場合、この関数はnullを返します。

  • sizeof関数

    指定されたJavaオブジェクトのサイズをバイト数で返します。次に例を示します。

    select sizeof(o) from int[] o
    
  • retainedsize関数

    指定されたJavaオブジェクトの保持セットのサイズをバイト数で返します。注意: この関数をヒープ・ダンプに対してはじめて使用する場合は、かなり時間がかかる場合があります。

    retainedsize関数の使用例は次のとおりです。

    select rsizeof(o) from instanceof java.lang.HashMap o
    
  • toHtml関数

    指定されたJavaオブジェクトのHTML文字列を返します。これは、select式によって選択されたオブジェクトに対して自動的にコールされます。ただし、より複雑な出力の印刷に役立つ場合があります。たとえば、ハイパーリンクを太字で印刷するには、次のようにします。

    select "<b>" + toHtml(o) + "</b>" from java.lang.Object o
    

13.3.8.3 複数の値の選択

JavaScriptオブジェクトのリテラルまたは配列を使用して、複数の値を選択できます。

たとえば、スレッド・オブジェクトごとに名前とスレッドを表示します。

select { name: t.name? t.name.toString() : "null", thread: t } 
from instanceof java.lang.Thread t

配列/イテレータ/列挙操作関数

これらの関数は、配列/イテレータ/列挙および式文字列[または、コールバック関数]を入力として受け入れます。これらの関数は、配列/イテレータ/列挙を反復し、各要素に対して式(または関数)を適用します。注意: JavaScriptオブジェクトは連想配列です。したがって、これらの関数は任意のJavaScriptオブジェクトとともに使用することもできます。

  • concat関数

    指定された配列/列挙に、指定されたブール式がコードで指定した要素が含まれているかどうかを返します。評価されたコードは、次の組込み変数を参照できます。

    • it: 現在参照している要素

    • index: 現在の要素の索引

    • array: 反復中の配列/列挙

    たとえば、一部の静的オブジェクトのいくつかのクラスによって参照されるPropertiesオブジェクトをすべて選択するには、次のようにします。

    select p from java.util.Properties p
    where contains(referrers(p), "classof(it).name == 'java.lang.Class'")
    
  • count関数

    指定されたブール式を満たす入力配列/列挙の要素の件数を返します。ブール式のコードは、次の組込み変数を参照できます。

    • it: 現在参照している要素

    • index: 現在の要素の索引

    • array: 反復中の配列/列挙

    たとえば、特定の名前パターンを持つクラスの数を印刷します。

    select count(heap.classes(), "/java.io./(it.name)")
    
  • filter関数

    指定されたブール式を満たす入力配列/列挙の要素が含まれている配列/列挙を返します。ブール式のコードは、次の組込み変数を参照できます。

    • it: 現在参照している要素

    • index: 現在の要素の索引

    • array: 反復中の配列/列挙

    • result: 結果の配列/列挙

    • java.io.*名前パターンを持つクラスをすべて表示します。

      select filter(heap.classes(), "/java.io./(it.name)")
      
    • リファラがjava.netパッケージに属していないURLオブジェクトのすべてのリファラを表示します。

      select filter(referrers(u), "! /java.net./(classof(it).name)")
      from java.net.URL u
      
  • length関数

    配列/列挙の要素数を返します。

  • map関数

    指定されたコードを各要素で評価することにより、指定された配列/列挙を変換します。評価されたコードは、次の組込み変数を参照できます。

    • it: 現在参照している要素

    • index: 現在の要素の索引

    • array: 反復中の配列/列挙

    • result: 結果の配列/列挙

    Map関数は、入力配列/列挙の要素ごとにコードを繰り返しコールすることによって作成された値の配列/列挙を返します。

    たとえば、次の名前と値を持つjava.io.Fileの静的フィールドをすべて表示します。

    select map(heap.findClass("java.io.File").statics, "index + '=' + toHtml(it)")
    
  • max関数

    指定された配列/列挙の最大要素を返します。オプションとして、配列の要素を比較するコード式を受け入れます。デフォルトでは、数値比較が使用されます。比較式では、次の組込み変数が使用できます。

    • lhs: 比較の左辺の要素

    • rhs: 比較の右辺の要素

    • 最大長のstringインスタンスを検索します。

      select max(map(heap.objects('java.lang.String', false), 'it.count'))
      
    • 最大長であるstringインスタンスを検索します。

      select max(heap.objects('java.lang.String'), 'lhs.count > rhs.count')
      
  • min関数

    指定された配列/列挙の最小要素を返します。オプションとして、配列の要素を比較するコード式を受け入れます。デフォルトでは、数値比較が使用されます。比較式では、次の組込み変数が使用できます。

    • lhs: 比較の左辺の要素

    • rhs: 比較の右辺の要素

    • 最小サイズのvectorインスタンスを検索します。

      select min(map(heap.objects('java.util.Vector', false), 'it.elementData.length'))
      
    • 最大長であるvectorインスタンスを検索します。

      select min(heap.objects('java.util.Vector'), 'lhs.elementData.length < rhs.elementData.length')
      
  • sort関数

    指定された配列/列挙をソートします。オプションとして、配列の要素を比較するコード式を受け入れます。デフォルトでは、数値比較が使用されます。比較式では、次の組込み変数が使用できます。

    • lhs: 比較の左辺の要素

    • rhs: 比較の右辺の要素

    • すべてのchar[]オブジェクトをサイズ順に印刷します。

      select sort(heap.objects('char[]'), 'sizeof(lhs) - sizeof(rhs)')
      
    • すべてのchar[]オブジェクトをサイズ順に印刷しますが、サイズも併せて印刷します。

      select map(sort(heap.objects('char[]'), 'sizeof(lhs) - sizeof(rhs)'), 
      '{ size: sizeof(it), obj: it }')
  • top関数

    指定された配列/列挙の上位N個の要素を返します。オプションとして、配列の要素と上位要素の数を比較するコード式を受け入れます。デフォルトでは、外観の順序で上位10個の要素が返されます。比較式では、次の組込み変数が使用できます。

    • lhs: 比較の左辺の要素

    • rhs: 比較の右辺の要素

    • 5つの最長文字列を印刷します。

      select top(heap.objects('java.lang.String'), 'rhs.count - lhs.count', 5)
      
    • 5つの最長文字列を印刷しますが、サイズも併せて印刷します。

      select map(top(heap.objects('java.lang.String'), 
      'rhs.count - lhs.count', 5), '{ length: it.count, obj: it }')
  • sum関数

    指定された入力配列または列挙のすべての要素の合計を返します。オプションとして、第2パラメータとして式を受け入れます。これは、入力要素を合計する前のマッピングに使用します。

    たとえば、各Propertiesオブジェクトからアクセス可能なサイズの合計を返します。

    select sum(map(reachables(p), 'sizeof(it)')) 
    from java.util.Properties p
     
    // or omit the map as in ...
    select sum(reachables(p), 'sizeof(it)') 
    from java.util.Properties p
    
  • toArray関数

    入力配列/列挙の要素が含まれている配列を返します。

  • unique関数

    指定された入力配列/列挙の一意の要素が含まれている配列/列挙を返します。

    次の例では、文字列から参照される一意のchar[]インスタンスを選択しています。複数の文字列インスタンスでコンテンツに対して同じchar[]を共有できます。

    // number of unique char[] instances referenced from any String
    select count(unique(map(heap.objects('java.lang.String'), 'it.value')))
     
    // total number of Strings
    select count(heap.objects('java.lang.String'))
    

13.3.8.4 その他の例

次の例では、各クラス・ローダーのヒストグラムと、それによってロードされたクラス数が印刷されます。

java.lang.ClassLoaderには、タイプjava.util.Vectorのクラスであるprivateフィールドがあり、Vectorにはベクター内の要素数であるelementCountというprivateフィールドがあります。この問合せでは、JavaScriptオブジェクトのliteral関数およびmap関数を使用して複数の値(loader、count)を選択します。これは、sort関数を比較式とともに使用して、結果を件数(つまり、ロードされたクラス数)別にソートします。

select map(sort(map(heap.objects('java.lang.ClassLoader'), 
'{ loader: it, count: it.classes.elementCount }'), 'lhs.count < rhs.count'),
'toHtml(it) + "<br>"')

次の例では、クラス・ローダー・インスタンスごとに親子チェーンを示しています。

select map(heap.objects('java.lang.ClassLoader'),
      function (it) {
         var res = '';
         while (it != null) {
            res += toHtml(it) + "->";
            it = it.parent;
         }
         res += "null";
         return res + "<br>";
      })

java.lang.ClassLoaderクラスの親フィールドが使用されていて、コールをマップするためにコールバック関数を使用して親がnullになるまで検索していることに注意してください。

次の例では、すべてのSystemプロパティの値が印刷されます。この問合せ(および、その他の多くの問合せ)は、Javaプラットフォーム・クラスのprivateフィールドが通知(実装の詳細)なしに変更または削除された可能性があるため、安定していないことがあります。ただし、ユーザーのクラスを制御できる場合は、このような問合せをユーザーのクラスに使用しても安全です。

select map(filter(heap.findClass('java.lang.System').props.table, 'it != null && it.key != null && it.value != null'),
            function (it) {
                var res = it.key.toString() + ' = ' + it.value.toString();
                return res;
            });
  • java.lang.Systemには、タイプjava.util.Propertiesの'props'という名前の静的フィールドがあります。

  • java.util.Propertiesには、タイプjava.util.Hashtable$Entryの'table'というフィールドがあります(このフィールドはjava.util.Hashtableから継承されます)。これはハッシュ表バケット配列です。

  • java.util.Hashtable$Entryにはキー、値、およびnextフィールドがあります。各エントリは、同じハッシュ表バケット内で次のエントリ(またはnull)を指します。

  • java.lang.Stringクラスには、タイプchar[]のvalueフィールドがあります。

13.3.9 CPUパフォーマンスの分析方法

このタスクでは、ターゲット・アプリケーションのパフォーマンスを分析します。アプリケーション全体をプロファイルするか、またはプロファイル対象のクラスを制御するフィルタを指定することによって計測されるコードを制限するように選択できます。

このプロファイリング・タスクを実行すると、次のようなプロファイリング結果が得られます。

  • コンテキストでのメソッド実行の時間(%)と実際の所要時間

  • 各メソッドがコンテキスト内で起動した回数

  • メソッドの起動に達するメソッド・コールのチェーン

  • コンテキストでのメソッド実行の時間/数

アプリケーションのパフォーマンスを分析する手順は次のとおりです。

  1. 分析するアプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」を選択します。

  3. 「プロファイル」ウィンドウの左側のペインで「CPU」をクリックします。

  4. 「フィルタ」リストで、フィルタを選択します。

  5. 選択すると、プロファイリング・ポイントを使用してプロファイラのアクションを制御できます。

  6. 新しいカスタム構成を作成する必要がある場合には、「カスタムを作成」をクリックします。

  7. 「実行」をクリックします。

「実行」をクリックすると、ターゲット・アプリケーションが起動してプロファイリング・セッションが開始します。

13.3.10 カスタム構成の作成方法

カスタム構成を作成する際、そのプロファイリング・タスクに対して使用可能なすべての内部設定を完全に制御できます。カスタム・プロファイリング設定のセットごとに作成、保存、および名前の割当てを実行できます。カスタム構成は特定のプロジェクトに関連付けられており、「プロファイル」ダイアログの「CPU」セクションで選択可能です。

「詳細設定」をクリックすると、より詳細なプロファイリング・オプションを設定できます。カスタム構成は、再使用したり変更したりできるように、IDE作業セッション間で自動的に保存されます。

カスタム構成の作成の手順:

  1. カスタム構成を作成するアプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」を選択します。

  3. 「プロファイル」ウィンドウの左側のペインで「CPU」をクリックします。

  4. 構成に組み入れる必要のあるオプション、たとえばフィルタ、プロファイリング・ポイントなどを選択します。

  5. 「カスタムを作成...」をクリックします。

  6. 「名前」テキスト・ボックスに、新しい構成の名前を入力します。

  7. 「OK」をクリックします。

13.3.11 プロファイリング結果のフィルタリング

「プロファイリングのライブ結果」ウィンドウと結果スナップショットで、表示された結果の下のフィルタ・ボックスを使用して結果を名前別にフィルタ処理できます。

名前別に結果をフィルタ処理する手順は次のとおりです。

  1. メイン・メニューから、「ウィンドウ」「ライブ結果」をクリックします。

  2. 表示された結果の下のフィルタ・ボックス内でフィルタ条件を入力します。

    スナップショットにおいてフィルタ・ボックスが使用できるのは、CPUスナップショットでは「ホットスポット」タブおよび「結合」タブであり、メモリー・スナップショットでは「メモリー」タブです。

  3. 条件に対して次のフィルタリング・パラメータの1つをドロップダウン・メニューから選択します。

    • Starts with(大/小文字の区別)

    • Contains(大/小文字の区別)

    • Does Not Contain(大/小文字の区別なし)

    • Ends with(大/小文字の区別)

    • Regular expression(大/小文字の区別)

  4. 右側のチェックをクリックして、フィルタを結果に適用します。

フィルタ・ボックスの右にある矢印をクリックすると、前のフィルタ条件を表示したり、選択したりできます。完全な未フィルタの結果をリストアするには、フィルタ・ボックスの右にある「フィルタのクリア」をクリックします。

13.3.12 プロファイリング・フィルタの設定方法

アプリケーションのパフォーマンスを分析する際、フィルタを使用して、計測に含めるクラス、または計測から除外するクラスを指定できます。フィルタの使用時に計測するクラス数を制限すると、プロファイリングのオーバーヘッドが縮小されます。フィルタを選択するには、プロファイリング・セッションを構成するときに「フィルタ」ドロップダウン・リストからフィルタを選択します。

「簡易フィルタ」の設定を変更する手順は次のとおりです。

  1. カスタム構成を作成するアプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」を選択します。

  3. 「フィルタ」リストで、「簡易フィルタ」を選択します。

  4. フィルタ・タイプとして、「除く」または「含む」を選択します。

  5. フィルタ値を入力して、「OK」をクリックします。

フィルタを複数回使用する場合は、カスタム・フィルタ・セットを作成できます。

カスタム・フィルタ・セットを変更または作成する手順は次のとおりです。

  1. プロファイリング・タスクの選択ダイアログで、「CPU」を選択します。

  2. 「フィルタ・セットを編集」をクリックします。

  3. 既存のフィルタ・セットを選択するか、「追加」をクリックして新しいフィルタ・セットの名前を入力します。

  4. 「フィルタ・セット・タイプ」を指定します。

  5. 「グローバル・フィルタ」リストで、フィルタ・セットに含めるグローバル・フィルタを、そのフィルタのチェック・ボックスを選択してアクティブにします。

    カーソルを値の上に置くと、そのフィルタに含まれているすべてのパターンが表示されます。

  6. 「OK」をクリックして、新しいカスタム・フィルタ・セットを保存します。

新しいフィルタ・セットを作成した後で、「フィルタ」ドロップダウン・リストからそのフィルタを選択できます。プロジェクトのパフォーマンスを分析する際、その新しいフィルタが使用できます。

13.3.13 プロファイリングのライブ結果の使用方法

「プロファイリングのライブ結果」ウィンドウには、実行中のプロファイリング・セッションのライブ結果が表示されます。ツールバーとポップアップ・メニューを使用して、「プロファイリングのライブ結果」ウィンドウに表示される結果を操作できます。「プロファイリングのライブ結果」ウィンドウを開くには、プロファイリング・セッション中に次のいずれか1つを実行します。

  • メイン・メニューから、「ウィンドウ」「プロファイリング」「ライブ結果」を選択します。

  • 「プロファイラ」ウィンドウで、「ライブ結果」をクリックします。

要素 説明

「自動的に結果を更新」

有効になっている場合(デフォルト)、結果が短い間隔で更新されます。無効の場合は、「ただちに結果を更新」をクリックして結果を更新します。

「ただちに結果を更新」

結果をただちに更新する場合にクリックします。

ガベージ・コレクションの実行と結果の更新

ガベージ・コレクションを実行します。

「収集結果をリセット」

すでに蓄積されたプロファイリング結果を廃棄する場合にクリックします。

「収集結果のスナップショットを取得」

結果をスナップショットとして保存する場合にクリックします。未保存のスナップショットはソース・エディタで開かれます。

「現在のビューを保存」

表示された結果を.png画像として保存する場合にクリックします。


結果をソートするには、それぞれの列ヘッダーをクリックするか、結果エントリを右クリックしてポップアップ・メニューからコマンドを選択します。表示される結果と使用可能なポップアップ・メニュー項目は、次のどのプロファイリング・タスクを実行しているかによって異なります。

13.3.14 アタッチ・モードを使用したプロファイリング

ただし、IDEの外側でアプリケーションを開始する必要がある場合は、アタッチ・モードを使用してアプリケーションをプロファイルすることができます。たとえば、次のような場合にアタッチ・モードを使用できます。

  • アプリケーションをコマンドラインから開始する必要がある、または複雑な起動スクリプトを使用している。

  • アプリケーションまたはターゲットJVMの起動時にプロファイリング・データを取得する必要がある。

  • アプリケーションを再起動せずにアプリケーションをプロファイルする必要がある。

次のような場合は、アタッチ・モードを使用する必要があります。

  • リモートJVM(リモート・アプリケーション・サーバーなど)で実行中のアプリケーションをプロファイルする必要がある。

アタッチ・モードを使用すると、すでに実行しているアプリケーション、またはローカル・マシンまたはリモート・マシンで起動しようとしているアプリケーションにプロファイリング・ツールをアタッチすることができます。アタッチ・モードの使用は、長時間実行しているアプリケーションのプロファイリング、特にアプリケーション・サーバーで実行しているWebアプリケーションまたはエンタープライズ・アプリケーションのプロファイリングに役立ちます。また、アタッチ・モードを使用して、アプリケーション・サーバー自体のコードをプロファイルすることもできます。

アプリケーションにアタッチするには、ターゲット・アプリケーションまたはサーバーの起動オプションを事前に構成しておく必要があります。「アタッチ・ウィザード」を使用して、プロジェクトのアタッチメント設定を指定します。アタッチメント設定の構成は、1回だけで十分です。アタッチメント設定はプロジェクト固有です。つまり、プロジェクトにはそれぞれ独自の設定が割り当てられています。アタッチメント設定を変更したい場合には、いつでも「アタッチ・ウィザード」を実行できます。

「アタッチ・ウィザード」で、アプリケーションのタイプと場所を指定します。「アタッチ・ウィザード」は、指定された詳細に基づいてアプリケーションまたはサーバーの構成方法に関する手順を示し、プロファイラをアタッチできるようにします。

選択するアタッチ・モードは、取得する必要のあるプロファイリング・データのタイプと、ターゲットJVMプラットフォームの詳細によって異なります。次の表に、アタッチ・モードの概要を示します。

  • Local Direct

    このモードは、ローカル・アプリケーションの起動に関するプロファイリング・データを取得したい場合に使用します。

    このモードを使用する場合、ターゲットJVMとアプリケーションはプロファイラがアタッチされるまで待機した後で起動します。アプリケーションからデタッチした後で、アプリケーションを再起動して別のプロファイリング・セッションを開始する必要があります。

  • Local Dynamic (JDK 1.6が必要)

    このモードは、ローカル・アプリケーションに関するプロファイリング・データを取得したい場合に使用します。このモードを使用するには、アプリケーションがJDK 1.6で実行している必要があります。

    このモードを使用すると、アプリケーションを再起動せずにアプリケーションへのアタッチとアプリケーションからのデタッチを実行できます。

  • Remote Direct

    このモードは、リモートJVMで実行しているアプリケーションのプロファイリング・データを取得したい場合に使用します。このモードを使用するには、ターゲット・マシンにProfiler Remote Packをインストールする必要があります。リモート・システムの詳細を指定し、「アタッチ・ウィザード」を使用してProfiler Remote Packを生成してください。

    このモードを使用すると、プロファイラがアタッチされた後でリモート・アプリケーションが起動します。このモードを使用すると、ターゲットJVMの起動に関するプロファイリング・データを取得できます。

13.3.15 アプリケーションのモニター方法

「プロファイリング・タスク」ボックスで「アプリケーションのモニター」を選択すると、ターゲット・アプリケーションは計測なしで実行します。スレッドのアクティビティやメモリー割当てなどの、ターゲットJVMのプロパティに関する高水準の情報のみが結果として表示されます。

アプリケーションをモニターする手順は次のとおりです。

  1. モニターするアプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」を選択します。

  3. 「モニター」をクリックします。

  4. オプションとして、「スレッドのモニターを有効化」を選択します。

    このオプションは、アプリケーションの起動からスレッドをモニターする場合に選択します。

  5. 「実行」をクリックします。

「実行」をクリックすると、ターゲット・アプリケーションが起動してプロファイリング・タスクが開始します。「プロファイラ」ウィンドウで「遠隔測定」ボタンまたは「スレッド」ボタンをクリックして、結果を表示します。

デフォルトでは、アプリケーション・スレッド・アクティビティはモニターされません。「スレッド」タブを開き、「スレッド」ボタンをクリックすると、プロファイリング・セッション中にいつでもスレッド・アクティビティのモニターを開始できます。

アプリケーション起動からスレッドをモニターする場合は、プロファイリング・セッションを開始する前に「スレッドのモニターを有効化」を選択します。

13.3.16 プロファイリング・ポイントの設定方法

プロファイリング・ポイントはソース・コード内のマーカーであり、特定のプロファイリング・アクションを起動できます。コードにプロファイリング・ポイントを設定するには、ソース・エディタのポップアップ・メニューを使用するか、「プロファイリング・ポイント」ウィンドウのツールバーを使用します。

次のタイプのプロファイリング・ポイントを設定できます。

  • 「結果のリセット」

  • 「ストップウォッチ」

  • スナップショットの取得

  • 時間によるスナップショットの取得

  • トリガーによるスナップショットの取得

注意: 「時間によるスナップショットの取得」および「トリガーによるスナップショットの取得」のアイコンは、コード・エディタには表示されません。これらのアイコンは「プロファイリング・ポイント」ウィンドウにのみ表示されます。

プロファイリング・ポイントを使用して、プロファイリング結果のリセット、スナップショットの取得、またはコード・フラグメントのタイムスタンプまたは実行時間の記録を行うことができます。

プロファイリング・ポイントは、一度設定されると、削除されるまでプロジェクトに含まれます。

プロファイリング・ポイントを設定する手順は次のとおりです。

  1. プロファイリング・ポイントを追加するクラスを特定して、ソース・エディタでそのクラスを開きます。

  2. ソース・エディタで、プロファイリング・ポイントを追加する行の左余白を右クリックします。

  3. プロファイリング・ポイントの追加を選択して、「新規プロファイリング・ポイント」ウィザードを開きます。

  4. プロファイリング・ポイント・タイプとプロジェクトを選択します。

  5. 「次へ」をクリックします。

  6. 必要に応じて、プロファイリング・ポイントのプロパティをカスタマイズします。

  7. 「終了」をクリックします。

プロファイリング・ポイントのタイプを表すアイコンが、プロファイリング・ポイントを挿入したソース・エディタに表示されます。

プロファイリング・ポイントを有効または無効にするには、ソース・エディタで、プロファイリング・ポイントが含まれている行の左余白を右クリックして、<プロファイリング・ポイント名>「有効化」または「無効化」を選択します。

アクティブなプロファイリング・ポイントを表示する手順は次のとおりです。

  1. アプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」を選択します。

  3. プロファイリング・タスク(CPUまたはメモリー)を選択します。

  4. 「アクティブなプロファイリング・ポイントを表示」を選択します。

また、「ウィンドウ」「プロファイリング」「プロファイリング・ポイント」を選択することもできます。

13.3.17 リモート・アプリケーションへのアタッチ方法

プロファイリング・ツールをアプリケーションにアタッチすることにより、Webサーバーなどのリモート・システムで実行しているアプリケーションのプロファイリングを実行できます。このモードを使用すると、プロファイラがアタッチされた後でリモート・アプリケーションが起動します。このモードを使用すると、ターゲットJVMの起動に関するプロファイリング・データを取得できます。

プロファイリング・ツールをアタッチするには、「アタッチ・ウィザード」を使用してプロジェクトのアタッチメント設定を指定します。「アタッチ・ウィザード」で、アプリケーションのタイプとリモート位置を指定します。「アタッチ・ウィザード」は、指定された詳細に基づいてリモート・システムの構成方法に関する手順を示し、プロファイリングをサポートします。

リモート・システムにアタッチするには、リモート・システムにRemote Profiler Packをインストールして、そのパック上でリモート・システムを起動する必要があります。「アタッチ・ウィザード」を使用してリモート・システムの詳細を指定し、そのシステム用にRemote Profiler Packを生成してください。詳細は、第13.3.18項「Profiler Remote Packの生成方法」を参照してください。

手順に従ってリモート・システムを構成した後、リモート位置にプロファイラをアタッチできます。アタッチ・モードは1回構成するだけで十分です。アタッチメント設定はプロジェクトに関連付けられています。いつでも「アタッチ・ウィザード」を実行して、アタッチメント設定を変更できます。

リモート・アプリケーションのプロファイリング手順は次のとおりです。

  1. アプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイラのアタッチ」を選択します。

  3. 「プロファイラ」ダイアログで、「定義...」をクリックしてアタッチメント設定を構成します。

  4. 「アタッチ方法」で「リモート」を選択します。

  5. 「アタッチ・ウィザード」を完了すると、ターゲット・アプリケーションに従ってアタッチメント設定が指定されます。

  6. 「終了」をクリックして、「アタッチ・ウィザード」を終了します。

  7. ターゲットの場所を構成し、「アタッチ・ウィザード」の最終ページの手順に従ってリモート・アプリケーションを起動します。生成済のProfiler Remote Packがまだインストールされていない場合は、リモート・システムにそれをインストールする必要があります。

    リモート・アプリケーションを起動すると、アプリケーションはIDEがアタッチされるまで待機してから起動します。

  8. 「プロファイラ」ページで、プロファイリング・タスクと任意のプロファイリング・オプションを選択します。

  9. 「アタッチ」をクリックします。

「アタッチ」をクリックすると、JDeveloperがリモートJVMにアタッチして、アプリケーションが起動します。ローカル・アプリケーションの場合と同様に、プロファイリング・データを表示できます。

IDEがリモート・アプリケーションにアタッチされた後で、次の操作を実行できます。

  • リモート・アプリケーションからデタッチする

    リモート・アプリケーションからデタッチすると、リモート・アプリケーションは停止しませんが、リモート・アプリケーションに関するプロファイリング・データの受信が停止します。リモート・アプリケーションにアタッチするには、「アタッチ・ウィザード」の起動オプションを使用してリモート・アプリケーションを再起動する必要があります。

  • プロファイリング・セッションを変更する

    プロファイリング・セッションの変更は、リモート・アプリケーションからデタッチしなくても実行できます。たとえば、プロファイリング・タスクをプロファイリングのオーバーヘッド削減のためのモニタリングに変更した後で、タスクを再度変更することができます。この方法では、リモート・アプリケーションを再アタッチして再起動する必要がありません。

13.3.18 Profiler Remote Packの生成方法

プロファイリング・ツールをリモート・システムにアタッチするには、リモート・システムにRemote Profiler Packをインストールする必要があります。Remote Profiler Packは、プロファイリング・ツールをリモート・システムにアタッチできるライブラリのアーカイブです。

Remote Profiler Packを生成する手順は次のとおりです。

  1. アプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイラのアタッチ」を選択します。

  3. 「プロファイラのアタッチ」ダイアログの下部で、「定義...」をクリックします。

  4. 「アタッチ方法」で「リモート」を選択します。

  5. 「ホスト名」および「オペレーティング・システム」を指定します。

  6. アタッチ手順を読み、Remote Profiling Packの作成をクリックします。

「リモート・パックを生成」をクリックすると、Profiler Remote Packの保存場所を指定するように要求されます。IDEでパックが生成された後、「アタッチ・ウィザード」の手順に従ってパックをインストールし、そのパック上でリモート・システムを起動する必要があります。

13.3.19 ローカル・アプリケーションへのアタッチ方法

アプリケーションをIDEの外側で起動したい、または起動する必要がある場合は、アタッチ・モードを使用してローカル・アプリケーションのプロファイリングを実行できます。たとえば、次のような場合にアタッチ・モードを使用できます。

  • アプリケーションをコマンドラインから開始する必要がある、または複雑な起動スクリプトを使用している。

  • アプリケーションまたはターゲットJVMの起動時にプロファイリング・データを取得する必要がある。

  • アプリケーションを再起動せずにアプリケーションをプロファイルする必要があります(動的アタッチ・モード、JDK 1.6が必要)。

ローカル・アプリケーションにアタッチするには、「アタッチ・ウィザード」を使用して、まずアタッチメント設定を構成する必要があります。これらの設定は、プロファイリング中のプロジェクトに関連付けられています。プロジェクト用のアタッチ設定の構成は1回だけですみますが、設定の変更はいつでも「アタッチ・ウィザード」を再実行して行えます。

ローカル・アプリケーションにアタッチするための設定を構成する際、次のアタッチメント・モードから選択できます。

  • 「直接」: このモードを使用すると、ローカル・アプリケーションの起動に関するプロファイリング・データを取得できます。

  • 動的(JDK 1.6が必要): このモードを使用すると、アプリケーションを停止せずにアプリケーションからのデタッチとアプリケーションへの再アタッチを実行できます。

ローカル・アプリケーションにリモートにアタッチする手順は次のとおりです。

  1. アプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイラのアタッチ」を選択します。

  3. 「アタッチ先」リストで、プロジェクトがある場合は、そのプロジェクトを選択します。

  4. 「プロファイラのアタッチ」ダイアログの下部で、「定義...」をクリックします。

  5. 「アタッチ設定」ウィザードで、「ローカル」アタッチ・モードを選択します。

  6. 「アタッチ・ウィザード」を完了すると、ターゲット・アプリケーションに従ってアタッチメント設定が指定されます。

  7. 「OK」をクリックして、「アタッチ設定」ウィザードを終了します。

  8. ターゲットの場所を構成し、「アタッチ・ウィザード」の手順に従ってローカル・アプリケーションを起動します。生成済のProfiler Remote Packがまだインストールされていない場合は、ローカル・システムにそれをインストールする必要があります。詳細は、第13.3.18項「Profiler Remote Packの生成方法」を参照してください。

    ローカル・アプリケーションを起動すると、アプリケーションはIDEがアタッチされるまで待機してから起動します。

  9. プロファイリング・タスクと任意のプロファイリング・オプションを選択します。

  10. 「アタッチ」をクリックします。

IDEがローカル・アプリケーションにリモートにアタッチされた後で、次の操作を実行できます。

  • リモート・ローカル・アプリケーションからデタッチする

    リモート・ローカル・アプリケーションからデタッチすると、アプリケーションは停止しませんが、アプリケーションに関するプロファイリング・データの受信が停止します。リモート・アプリケーションにアタッチするには、「アタッチ・ウィザード」の起動オプションを使用してリモート・アプリケーションを再起動する必要があります。

  • プロファイリング・セッションを変更する

    プロファイリング・セッションの変更は、リモート・アプリケーションからデタッチしなくても実行できます。たとえば、プロファイリング・タスクをプロファイリングのオーバーヘッド削減のためのモニタリングに変更した後で、タスクを再度変更することができます。この方法では、リモート・アプリケーションを再アタッチして再起動する必要がありません。

13.3.20 スレッド・アクティビティの表示方法

プロファイリング・セッション中に、「スレッド」ウィンドウでアプリケーションのスレッド・アクティビティに関する詳細情報を表示できます。

「スレッド」タブを開き、「スレッド」ボタンをクリックすると、プロファイリング・セッション中にいつでもスレッド・アクティビティのモニターを開始できます。デフォルトでは、アプリケーション・スレッド・アクティビティは呼び出されるまでモニターされません。

「スレッド」ウィンドウを開くには:

  • メイン・メニューから、「ウィンドウ」「プロファイリング」「スレッド」を選択します。

    アプリケーション起動からスレッドをモニターする場合は、プロファイリング・セッション開始時に「スレッドのモニターを有効化」を選択します。この詳細設定は「プロファイル」ダイアログにあります。

13.3.21 遠隔測定結果の表示方法

「VM遠隔測定」ウィンドウでは、スレッド・アクティビティおよび、VMでのメモリー・ヒープとガベージ・コレクションに関する高水準のデータを表示できます。「VM遠隔測定」ウィンドウは通常は、メイン・エディタ・ウィンドウに表示されます。

「VM遠隔測定要」ウィンドウを開くには、プロファイリング・セッション中に次のいずれか1つを実行します。

  • メイン・メニューから、「ウィンドウ」「プロファイリング」「VM遠隔測定」を選択します。

  • 「プロファイラ」タブで、「VM遠隔測定」をクリックします(メイン・メニューから、「ウィンドウ」「プロファイリング」「プロファイラ」をクリック)。

VM遠隔測定の結果が次のタブに表示されます。

  • 「メモリー(ヒープ)」: このタブには、ヒープの合計サイズと使用済サイズが表示されます。

  • 「メモリー(GC)」: このタブには、ガベージ・コレクションにかかった相対的な時間と存続世代数が表示されます。

  • 「スレッド/ロードされたクラス」: このタブには、プロファイル済アプリケーションJVMにおけるスレッド合計数が表示されます。

それぞれのタブでは、グラフの上にカーソルを合わせてツールチップを呼び出すと、詳細データを表示できます。

13.3.22 スナップショットの取得方法

スナップショットでは、特定の時点のプロファイリング・データが取り込まれます。スナップショットに取り込まれるデータは、スナップショットの撮影時に進行中のプロファイリング・セッションのタイプによって異なります。スナップショットを検索するには、「スナップショット」ウィンドウのツールバーを使用して表示された結果をフィルタ処理します。また、結果を右クリックして、ポップアップ・メニューで追加のコマンドを選択することもできます。

スナップショットは、次の点でプロファイリングのライブ結果とは異なります。

  • スナップショットは、プロファイリング・セッションが実行中でなくても確認できます。

  • スナップショットには、ライブ結果よりも詳細なプロファイリング・データの記録が含まれます。

  • スナップショットは容易に比較できます。

プロファイリング・セッションの進行中のみ、スナップショットを取得できます。スナップショットを手動で取得するか、プロファイリング・ポイントを設定してアプリケーション内の正確なポイントでスナップショットを自動的に取得できます。プロファイリング・ポイントを使用してスナップショットを取得する際、スナップショットを取得するソース・コード内のポイントを特定します。たとえば、スレッドが特定のメソッドに入ったときに、スナップショットを取得する必要が生じることがあります。

取得したスナップショットは、メイン・エディタ・ウィンドウで開きます。そのスナップショットは、あとでプロジェクトに保存できます。

スナップショットを手動で取得する手順は次のとおりです。

  1. プロファイリング・セッションを開始します(詳細は、第13.3.3「プロファイリング・セッションの開始方法」を参照のこと)。

  2. メイン・メニューから、「ウィンドウ」「プロファイリング」「プロファイラ」をクリックします。

  3. 「スナップショットの取得」をクリックします。

プロファイリング・ポイントを使用してスナップショットを取得する手順は次のとおりです。

  1. プロファイリング・ポイントを配置するコード行が含まれているソース・ファイルを開きます。

  2. プロファイリング・ポイントを配置するコード行の横の左余白を右クリックして、「プロファイリング・ポイントの追加」を選択します。

  3. 「新規プロファイリング・ポイント」ウィザードでスナップショット・オプションの1つを選択して、「次へ」をクリックします。

  4. ウィザードの「プロパティのカスタマイズ」ページで、任意のプロファイリング・ポイントのプロパティを変更します。

  5. 「終了」をクリックします。

スナップショットは、プロジェクトに保存することも、ローカル・ファイル・システムの場所に保存することもできます。スナップショットをプロジェクトに保存すると、そのスナップショットが「プロファイラ」ウィンドウ内の「保存スナップショット」に表示されます。スナップショットを保存するには、スナップショット・ツールバーのプロジェクトに保存ボタンをクリックします。あるいは、「ツール」「設定」「プロファイラ」ウィンドウを使用して、スナップショット取得時の動作を構成できます。

13.4 JUnitによるユニット・テスト

JUnitは、Java対応のリグレッション・テスト用オープン・ソース・フレームワークです。JUnitを使用して、Javaコードを検証するテストを記述および実行します。

テスト・フィクスチャ、テスト・ケースおよびテスト・スイートを作成するには、JDeveloperのJUnitウィザードを使用します。一般的なプロジェクト用のテスト・コンポーネントを作成するウィザードに加えて、ビジネス・コンポーネント・プロジェクトの専用ウィザードが提供されています。

JUnitは、JDeveloperにインストールおよび統合できるオプション機能です。

13.4.1 JUnitのインストール方法

JUnitは、JDeveloperとともに配布されないオプション機能です。これを使用する場合は、ダウンロードおよびインストールする必要があります。


注意:

JUnitは、IBMのパブリック・ライセンス契約に基づいて提供されています。JUnitをダウンロードする前に、ライセンス契約を受け入れる必要があります。


JDeveloperにJUnitをインストールする手順は、次のとおりです。

  1. 「ヘルプ」→「更新の確認」に移動して、Oracle Technology Network (OTN)からJUnitをダウンロードします。

  2. JDeveloperを終了し、再起動します。

  3. JUnitがインストールされます。アンインストールする場合は、拡張機能マネージャを使用します。

13.4.2 Javaプロジェクトに対するJUnitテストの作成

JUnitテスト・アプリケーションは、次のコンポーネントで構成されます。

  • 1つ以上のテスト・ケース。テスト対象のメソッドを呼び出し、予測される結果についてのアサーションを作成します。デフォルトで生成されるテスト・ケース・クラスは「Test」という名前ですが、ユーザーが任意の有効なJava名を指定できます。

  • テスト・フィクスチャ。テストが実行される状態を提供します。任意のクラスをテスト・フィクスチャとして使用できますが、JDeveloperには専用のテスト・フィクスチャ・クラスを作成するウィザードも用意されています。デフォルトで生成されるテスト・フィクスチャ・クラスは「Fixture」という名前ですが、ユーザーが任意の有効なJava名を指定できます。

  • テスト・スイート。テスト・ケースを呼び出します。デフォルトのテスト・スイート・クラスは、「AllTests」という名前です。

  • ランナー。テスト・スイートを呼び出し、テスト結果を相関付けて表示します。

13.4.3 JUnitカスタム・テスト・フィクスチャの作成方法

テスト・フィクスチャとは、既知の値を持つオブジェクトのセットで、テスト・ケースにデータを提供します。任意のクラスをテスト・フィクスチャとして使用できますが、JDeveloperにはカスタムのテスト・フィクスチャ・クラスや様々な専用のテスト・フィクスチャを作成できるウィザードも用意されています。


注意:

UnitTestFixtureはpublicクラスです。そのインスタンスを作成した場合、生成されたコードにエラーは生じません。

AppModuleAMFixtureはprivateクラスです。そのインスタンスを作成した場合、生成されたコードにはエラーが生じます。


JUnitのカスタムのテスト・フィクスチャ・クラスを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。

  2. 「ファイル」「新規」「ギャラリから」を選択します。

  3. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」を選択します。

  4. 「項目」リストで、「テスト・フィクスチャ」をダブルクリックします。

  5. ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。

    ウィザードによって作成されたクラスが、編集用に開かれます。

  6. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。

  7. 「項目」リストで、「カスタム・テスト・フィクスチャ」をダブルクリックします。

  8. ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。

  9. 「カテゴリ」ツリーで、「ユニット・テスト」を展開します。

  10. 「テスト・スイート」「OK」をクリックします。

  11. 「項目」リストで、「テスト・フィクスチャ」をダブルクリックします。

  12. ウィザードを完了するとテスト・ケースが作成されます。

    ウィザードによって作成されたクラスが、編集用に開かれます。

    ウィザードを使用してテスト・フィクスチャを作成した場合、デフォルトではコンストラクタが指定されます。

  13. 必要に応じてファイルを変更します。

    特に、テスト・フィクスチャ・オブジェクトを初期化するコードをsetUp()メソッドに追加します。取得したリソースをすべてリリースするコードをtearDown()メソッドに追加します。

13.4.4 JunitのJDBCテスト・フィクスチャの作成方法

テスト・フィクスチャとは、既知の値を持つオブジェクトのセットで、テスト・ケースにデータを提供します。JDBCテスト・フィクスチャは、使用するテスト・ケースにデータベース接続を確立するコードを提供します。

JUnitのJDBCテスト・フィクスチャ・クラスを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。

  2. 「ファイル」「新規」「ギャラリから」を選択します。

  3. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。

  4. 「項目」リストで、「JDBCテスト・フィクスチャ」をダブルクリックします。

  5. ダイアログを完了するとテスト・フィクスチャ・クラスが作成されます。

    作成されたクラスが、編集用に開かれます。

  6. 必要に応じてファイルを変更します。具体的には、テスト・フィクスチャ・オブジェクトを初期化するコードをsetUp()メソッドに追加し、取得されたリソースを解放するコードをtearDown()メソッドに追加します。

13.4.5 JUnitテスト・ケースの作成

テスト・ケース・クラスには、JUnitのアサーションを呼び出してテストを実行する1つ以上のメソッドがあります。例13-1に、JUnit 3.xでの典型的なテスト・ケースを示します。この例では、テスト対象のメソッドにテスト・フィクスチャ・データを渡してから、その結果を既知の値と比較し、予測どおりかどうかを確認しています。

例13-1 JUnit 3.xのテスト・ケース

public void testCountChars()
{
      int expected = 4;
      int actual = fixture1.countChars('a');
      assertEquals(expected, actual);
}

例13-2 JUnit 4のテスト・ケース

@Test
public void testCountChars()
{
      int expected = 4;
      int actual = fixture1.countChars('a');
      Assert.assertEquals(expected, actual);
}

例13-2に示したテスト・ケースでは、countChars()がテスト対象であり、テストの結果をassertEquals()でチェックしています。これは、JUnit Assertクラスで定義されているアサーション・メソッドの一種です。テスト・フィクスチャfixture1の状態はsetUp()メソッドで確立され、このメソッドは例13-3で示すようにテスト・ケースの呼出しより前に呼び出されていました。

例13-3 setUp()メソッド

protected void setup() throws Exception
{
fixture1 = new StringFixture("Goin' to Kansas City, Kansas City, here I come.");
}

JUnitテスト・ケース・クラスを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、プロジェクト、またはテストする必要のある特定のクラスを選択します。

  2. 「ファイル」「新規」「ギャラリから」を選択します。

  3. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。

  4. 「項目」リストで、「テスト・ケース」をダブルクリックします。

  5. ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。ウィザードによって作成されたクラスが、編集用に開かれます。

13.4.6 JUnitテスト・スイートの作成

テスト・スイートは、テスト・ケースを呼び出すクラスです。

「JUnitテスト・スイート」ウィザードには、main()メソッドと、TestRunnerクラスへのコールを挿入するオプションがあります。「JUnit TestRunner」ログ・ウィンドウが開き、テスト結果が表示されます。別のテスト・ランナーを使用する場合には、メソッドを編集します。

例13-4に示したJUnit 3.xテスト・スイートでは、suite()メソッドによってTestSuiteインスタンスが作成され、それにテスト・ケースが追加されます。テスト・ケースを追加または削除する場合には、このメソッドを編集します。

例13-4 JUnit 3.xのテスト・スイート

public class AllTests {
    public static Test suite() {
    TestSuite suite;
    suite = new TestSuite("project1.AllTests");
    return suite;    }        

例13-5に示したJUnit 4テスト・スイートでは、テスト・ケース・クラスは@Suiteおよび@RunWithの注釈を付けて記述されています。

例13-5 JUnit 4のテスト・スイート

@RunWith(Suite.class)
@Suite.SuiteClasses( {})
public class AllTests1 {
    public static void main(String[] args) {
    String[] args2 = { AllTests1.class.getName() };
    org.junit.runner.JUnitCore.main(args2);
    }
}

JUnitテスト・スイート・クラスを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。

  2. 「ファイル」「新規」「ギャラリから」を選択します。

  3. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。

  4. 「項目」リストで、「テスト・スイート」をダブルクリックします。

  5. ウィザードを完了するとテスト・スイート・クラスが作成されます。ウィザードによって作成されたクラスが、編集用に表示されます。

  6. 必要に応じてファイルを変更します。詳細は次のとおりです。

    • suite()メソッドでテスト・ケースを追加します。

    • main()メソッドで、必要に応じてランナーの呼出しを置き換えます。

13.4.7 JUnitテスト・ケースの作成方法

JUnitテスト・ケースを作成する前に、テストされるプロジェクトの作成を完了している必要があります。

JUnitテスト・ケースを作成するには:

  1. 「アプリケーション」ウィンドウで、テスト・ケースを作成するプロジェクトを右クリックし、「新規」をクリックします。

  2. 「新規ギャラリ」で、「ユニット・テスト」、続いて「テスト・ケース」を選択して、「OK」をクリックします。

  3. 「テスト・ケースの作成」ダイアログの「テストするクラスの選択」ページで、「テスト中のクラス」に入力するか、「参照」をクリックします。

  4. 「クラス・ブラウザ」ダイアログで、テストするクラスを確認します。または、「クラス名を一致」フィールドに最初の文字を入力します。「一致するクラス」リストは識別しやすいようにフィルタ処理されます。

    クラスを選択し、「OK」をクリックして、ダイアログを閉じます。「次へ」をクリックします。

  5. テストする個別のメソッドを選択し、「次へ」をクリックします。

  6. 「テスト・ケース・クラスの設定」ダイアログで、テスト・ケース、パッケージ、その拡張対象のクラスの名前を入力し、JUnitでスタブが作成される組込み機能のリストを選択します。「次へ」をクリックします。

  7. 「テスト・フィクスチャの選択」ページで、テスト・ケースに追加するテスト・フィクスチャを選択するか、「参照」をクリックします。

  8. テスト・ケースに追加するテスト・フィクスチャがすべてリスト中で選択されていることを確認し、「終了」をクリックします。

13.4.8 JUnitテスト・ケースにテストを追加する方法

メソッドに対するユニット・テストを、既存のJUnitテスト・ケース・クラスに追加できます。

JUnitテスト・ケース・クラスにテストを追加するには、次のようにします。

  1. コード・エディタで、新しいユニット・テストを作成するメソッドを選択します。

  2. メイン・メニューから「ソース」「新規メソッドのテスト」を選択します。

  3. 「既存のTestCaseクラスに追加」を選択します。

  4. 「クラス名」ドロップダウン・ボックスから、または「参照」を使用して、新しいテストを追加するテスト・ケース・クラスを選択します。

  5. 新しいテストをテスト・ケースに追加するには、「OK」をクリックします。

13.4.9ビジネス・コンポーネント・テスト・スイートの作成方法

作成されるテキスト・フィクスチャは、接続数を減らすシングルトン・クラスです。テスト・ケースごとに接続または切断する場合は、JUnit 4の注釈、@Beforeおよび@Afterを使用してテスト・ケースをカスタマイズします。

JUnit BC4Jテスト・スイート・ウィザードでは、アプリケーション・モジュールの各ビュー・オブジェクトに対してテストが生成されます。アプリケーション・モジュールがメソッドをエクスポートしていない場合、ウィザードによって、アプリケーション・モジュールそのもののテストも生成されます。生成されるビュー・オブジェクト・クラスの形式はview_objectVOTest.javaであり、形式がpackage.view.viewobjectVOのパッケージに収められます。この場合のpackageはアプリケーション・モジュール・パッケージです。生成されるアプリケーション・モジュール・テストの形式はapplication_moduleAMTest.javaであり、形式がpackage.applicationModuleのパッケージに配置されます。生成されるテスト・フィクスチャ・クラスの形式はapplicationmoduleAMFixture.javaであり、アプリケーション・モジュール・テストと同じパッケージに配置されます。

生成されるすべてのテスト・スイート・クラスの形式はAllapplicationmoduleTest.javaであり、アプリケーション・モジュールのパッケージ名と同じ名前でパッケージに配置されます。

各アプリケーション・モジュールまたはビュー・オブジェクト・テストについてテスト・ケースのXMLファイルも生成されます。このXMLファイルには、アプリケーション・モジュールまたはビュー・オブジェクト・テスト・ケースで定義されているテスト・メソッドが含まれます。重複が多くなりすぎる可能性があるため、ベース・クラス(ある場合)のテスト・メソッドは含まれません。

ビジネス・コンポーネント・テスト・スイートを作成するには:

  1. メイン・メニューから、「ファイル」を選択し、「新規」を選択します。

    ビジネス・コンポーネント・テスト用に別のプロジェクトを作成します。

  2. 「新規ギャラリ」で、「一般」を展開し、「プロジェクト」「Javaプロジェクト」の順に選択して、「OK」をクリックします。

  3. 「Javaプロジェクトの作成」ウィザードの「プロジェクト名」ページで、テスト・プロジェクトの名前とディレクトリ・パスを入力し、「次へ」をクリックします。

  4. プロジェクトのJava設定ページで、パッケージ名、プロジェクトのJavaソース・コードのディレクトリ、および出力クラス・ファイルが配置される出力ディレクトリを入力し、「終了」をクリックします。

  5. 「アプリケーション」ウィンドウで、テストするアプリケーション・モジュールをダブルクリックします。

  6. 概要エディタで、「Java」ナビゲーション・タブをクリックします。

  7. 「Java」ページで、「Javaクラス」セクションの「編集」アイコンをクリックします。

  8. 「Javaオプションの選択」ダイアログで「アプリケーション・モジュール・クラスの生成」を選択して、「OK」をクリックします。

  9. 概要エディタの「Java」ページで、クラス・インタフェース・セクションの「編集」アイコンをクリックします。

  10. 「クライアント・インタフェースの編集」ダイアログで、テストするメソッドを「選択済」ペインに移動して、「OK」をクリックします。

  11. 「アプリケーション」ウィンドウで、作成したテスト・プロジェクトを右クリックして、「新規」を選択します。

  12. 「新規ギャラリ」で、「一般」を展開し、「ユニット・テスト」「ビジネス・コンポーネントのテスト・スイート」の順に選択して、「OK」をクリックします。

  13. JUnit BC4Jテスト・スイート・ウィザードの「テストの構成」ページで次の値を選択し、「次へ」をクリックします。

    • ビジネス・コンポーネント・プロジェクト: テストするアプリケーション・モジュールを含むプロジェクトを選択します。

    • アプリケーション・モジュール: テストするアプリケーション・モジュールを選択します。

    • 構成: ローカル・アプリケーション・モジュールまたは共有アプリケーション・モジュールを選択します。

    • 「ベース・クラスのテスト」→「アプリケーション・モジュール拡張」: 様々なベース・クラスを指定できます。生成されるテスト・ケース・クラスはそのベース・クラスから拡張されます。このとき、ベース・クラスのすべてのpublic抽象メソッドの本体は単純なデフォルトの実装になります。

    • 「ベース・クラスのテスト」→「ビュー・オブジェクト拡張」: ビュー・オブジェクトが拡張するクラスを指定できます。生成されるテスト・ケース・クラスはそのベース・クラスから拡張されます。このとき、ベース・クラスのすべてのpublic抽象メソッドの本体は単純なデフォルトの実装になります。

  14. 「サマリー」ページで選択内容を確認して、「終了」をクリックします。

13.4.10 Business Componentsテスト・フィクスチャの作成方法

ビジネス・コンポーネントのテスト・スイートを作成すると、ビジネス・コンポーネントのテスト・フィクスチャも一緒に作成されます。また、ビジネス・コンポーネントのテスト・フィクスチャを個別に作成することもできます。

生成されるビュー・オブジェクト・クラスの形式はapplicationmoduleAMFixture.javaであり、形式がpackage.applicationModuleのパッケージに配置されます。この場合のpackageはアプリケーション・モジュール・パッケージです。

ビジネス・コンポーネント・テスト・フィクスチャを作成するには:

  1. メイン・メニューから「ファイル」を選択し、[z]を選択します。

    ビジネス・コンポーネント・テスト用に別のプロジェクトを作成します。

  2. 「新規ギャラリ」で、「一般」を展開し、「プロジェクト」、「Javaプロジェクト」の順に選択して、「OK」をクリックします。

  3. 「Javaプロジェクトの作成」ダイアログの「プロジェクト名」ページで、テスト・プロジェクトの名前とディレクトリ・パスを入力し、「次へ」をクリックします。

  4. プロジェクトのJava設定ページで、パッケージ名、ソース・ディレクトリおよび出力ディレクトリを入力し、「終了」をクリックします。

  5. 「アプリケーション」ウィンドウで、テストするアプリケーション・モジュールをダブルクリックします。

  6. 概要エディタで「Java」ナビゲーション・タブをクリックし、「Javaクラス」セクションの「編集」アイコンをクリックします。

  7. 「Javaオプションの選択」ダイアログで「アプリケーション・モジュール・クラスの生成」を選択して、「OK」をクリックします。

  8. 概要エディタの「Java」ページで、クラス・インタフェース・セクションの「編集」アイコンをクリックします。

  9. 「クライアント・インタフェースの編集」ダイアログで、テストするメソッドを「選択済」ペインに移動して、「OK」をクリックします。

  10. 「アプリケーション」ウィンドウで、作成したテスト・プロジェクトを右クリックして、「新規」を選択します。

  11. 「新規ギャラリ」で、「一般」を展開し、「ユニット・テスト」「ビジネス・コンポーネントのテスト・フィクスチャ」の順に選択して、「OK」をクリックします。

  12. JUnit BC4Jテスト・フィクスチャ・ウィザードの「テストの構成」ページで次の値を選択し、「次へ」をクリックします。

    • ビジネス・コンポーネント・プロジェクト: テストするアプリケーション・モジュールを含むプロジェクトを選択します。

    • アプリケーション・モジュール: テストするアプリケーション・モジュールを選択します。

    • 構成: ローカル・アプリケーション・モジュールまたは共有アプリケーション・モジュールを選択します。

  13. 「サマリー」ページでテスト・フィクスチャ・クラスを確認して、「終了」をクリックします。

13.4.11 プロジェクトのすべてのテスト・ケースでテスト・スイートを更新する方法

プロジェクトのすべてのテスト・ケースでテスト・スイートを更新します。

テスト・スイートを更新するには、次のようにします。

  1. suite()メソッドを持つクラスで、メイン・メニューから「ソース」「テスト・スイートのリフレッシュ」を選択します。

  2. テスト・ケースのリストにあるすべての項目がチェックされていることを確認してください。

  3. テスト・スイートを更新するには「OK」をクリックします。

13.4.12 JUnitテスト・スイートの実行方法

テスト・スイートが正常にコンパイルされたら、実行できます。

JUnitテスト・スイートを実行するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、テスト・スイート・クラスを選択します。

  2. 右クリックして「実行」を選択します。

    テストが実行され、テスト・ランナーによって結果が表示されます。