アプリケーション・コードの分析
コード・アナライザーを実行して、コードを分析し、ソース・コードのインスツルメンテーション・バージョンを作成することができます。 この分析は、 Java® モノリシック・アプリケーションをパーティションにリファクタリングする最初のステップです。
コード・アナライザー
コード・アナライザーは、 AI エンジンへの入力として使用される Java モノリシック・アプリケーションのアプリケーション・コードから静的データを収集します。これにより、パーティションの推奨事項が生成されます。 この静的データは、デプロイされたアプリケーションからランタイム・データを収集する バイナリー・インスツルメンテーション機能への入力としても必要です。 コード・アナライザーは、 Java コードをスキャンすると、4 つのファイルを生成します。 JSON ファイルには、バイナリー・インスツルメンテーション機能のスキャンされたクラスおよび構成に関するメタデータが含まれています。 メタデータには、クラス名、その型付きメンバー属性、コンストラクター、入力引数と戻りタイプを持つメソッド、およびクラスのソース・ファイルの場所などの情報が含まれます。
コード・アナライザーは、 Java モノリシック・アプリケーションの実行時にランタイム・トレースが収集されるように、これらのアプリケーションのソース・コードをインスツルメントすることもできます。 コード・アナライザーは、アプリケーションのすべての Java クラスをスキャンして、コンストラクターを含むすべてのクラス・メソッドに System.err.println("Entering...")
および System.err.println("Exiting...")
の形式でトレース/アニメーション設定ステートメントを挿入します。 コード・アナライザーを使用してコード・インスツルメンテーションを完了した後、 Java モノリシック・アプリケーションを再ビルドして再デプロイします。
ソース・コード・インスツルメンテーションは、コード・アナライザーの非推奨フィーチャーです。 バイナリー・インスツルメンテーション機能は、ビジネス・ユース・ケースの実行中にランタイム・トレースを収集する場合に推奨されるオプションです。これにより、 Java モノリシック・アプリケーションを再ビルドして再デプロイする必要がなくなります。
前提条件
システム要件を満たしていることを確認してください。
手順
Java モノリシック・アプリケーションのバイナリー・アーカイブ・ファイルをディレクトリー構造に入れます。
有効な Java アーカイブ・ファイル・フォーマットには、 .cba、 .class、 .ear、 .eba、 .jar、および .warがあります。 また、 Java アーカイブ・バイナリー・ファイルを含む .rar ファイルおよび .zip ファイルも有効です。
アプリケーションのバイナリー・ファイルに対してコード・アナライザーを実行します。
analyze コマンドを実行します。 コマンド・ヘルプを表示するには、 -h オプションを追加します。
mono2micro analyze -a <binary-file-path>
以下の情報では、コマンドの構文について説明します。
<binary-file-path> 変数は、分析対象のアプリケーションのバイナリー・ファイルのパス名です。 デフォルトでは、 analyze コマンドは、いくつかの JSON ファイルを使用して、ユーザー作業ディレクトリー上に binary-file-mono2micro というディレクトリーを作成します。
-o オプションを追加して、生成される JSON ファイルの出力ディレクトリー・パスを指定できます。 コード・アナライザーを実行するユーザーには、 /<output-dir-path>/ ディレクトリーに対する読み取り権限と書き込み権限が必要です。
mono2micro analyze -a <binary-file-path> -o <output-dir-path>
- トレースを標準出力ストリームに送信するバイナリー・インスツルメンテーション機能の構成を生成できます。 デフォルトでは、バイナリー・インスツルメンテーションは、標準エラー・ストリームで IBM Mono2Micro ランタイム・トレースを生成するための
System.err.println()
ステートメントを使用して、 Java コードをインスツルメンテーションします。--instrumentation-target
オプションをout
値に設定すると、 mono2micro instrument コマンドが使用された場合にソース・インスツルメンテーションにも適用されます。
標準エラーおよび標準出力ストリームの例
標準エラー・ストリームの場合は、以下のコマンドを実行します。
mono2micro analyze -a /apps/daytrader-ee7.ear
標準出力ストリームの場合は、以下のコマンドを実行します。
mono2micro analyze -a /apps/daytrader-ee7.ear --instrumentation-target out
バイナリー分析のための Java パッケージ・リストの制御
バイナリー・アナライザーは、デフォルトで除外されるパッケージを除き、バイナリー・ファイル内のすべての Java クラスを検査します。 -h オプションを使用して、除外されたパッケージのデフォルト・リストを確認できます。
com.test.app,org.xyz.lib,edu.abc
- --add-to-exclude-packages
- 除外するパッケージのデフォルト・リストにパッケージを追加します。 バイナリー分析では、デフォルトのリスト・パッケージは除外され、このオプションで指定されたパッケージのリストも除外されます。
- --exclude-packages
- このオプションで指定されたパッケージのリストをバイナリー分析から除外します。 ユーザーによって指定されたこれらのパッケージ内のクラスを除くすべてのクラスが分析されます。これは、デフォルトのパッケージ・リストが無視されることを意味します。
- --include-packages
- バイナリー分析中に、このオプションで指定されたパッケージのリストのみを分析します。 これらのパッケージ内のクラスのみが分析されるため、デフォルトのパッケージ・リストは無視されます。
- --analyze-all
- すべてのクラスとパッケージを強制的に分析します。
結果
分析が正常に完了すると、出力ディレクトリーが指定されていない場合、コード・アナライザーは、複数のファイルを持つユーザー作業ディレクトリー上に binary-file-mono2micro というディレクトリーを作成します。ここで、 binary-file は、分析された Java バイナリー・ファイルの名前です。 例えば、バイナリー・ファイルが daytrader-ee7.earの場合、コード・アナライザーは、 daytrader-ee7-mono2micro という名前のディレクトリーをユーザーの作業ディレクトリーに作成します。 出力オプションが指定されている場合、指定されたディレクトリーに JSON ファイルが配置されます。
分析後、ディレクトリーには以下のファイルが含まれます。
- symTable.json
- refTable.json
- instrumenter-config.json
- recommender-config.properties
symTable.jsonファイルとrefTable.jsonファイルには、スキャンされたクラスに関するメタデータ (名前、場所、属性名、コンストラクター、メソッドなど) が含まれいます。 instrumenter-config.json ファイルは、バイナリー・インスツルメンテーション機能の構成を提供します。 recommender-config.properties ファイルは、ディスク上の Java アプリケーション・アーカイブの場所と、分析中に除外または組み込まれたパッケージを指定します。
コード・アナライザーでソース・インスツルメンテーションが有効になっている場合、ピア・ディレクトリーには、後で IBM Mono2Micro ランタイム・トレースを生成するために使用する System.err.println()
ステートメントでインスツルメンテーションされたソース・コードのコピーも含まれます。
コード・アナライザーのインスツルメンテーションは、アプリケーションの変数の値を出力しません。 インスツルメンテーションの目的は、テンポラル・フローを、実行時の変数の値ではなく、さまざまなメソッドおよびクラスのコンストラクターによって記録することです。
現在の制限
コード・アナライザーによってインスツルメンテーションされたコードをコンパイルすると、以下が発生する可能性があります。unreachable codeコンパイル・エラー。 場合によっては、コード・アナライザーのインスツルメンテーションによって、 Java コンパイラーが到達不能と検出したインスツルメンテーション・ステートメントが挿入されることがあります。
この問題を解決するには、これらの到達不能ステートメントを削除またはコメントアウトします。 これらの除去は、ランタイム・トレースの生成に影響を与えません。
コード・アナライザーを実行すると、 Java プロセスからメモリー不足エラーが発生する場合があります。 この問題を解決するには、大きな最大ヒープ・サイズを値として指定して、--java-opts環境変数を設定します。
例えば、最大 Java ヒープ・サイズを 512 メガバイトに指定するには、以下のいずれかのコマンドを実行します。
mono2micro analyze -s <src-dir-path> --java-opts "-Xmx512m"
mono2micro instrument -s <src-dir-path> --java-opts "-Xmx512m"
- バイナリー・アナライザーは、同じ名前と同じパッケージ名を持つ複数の Java クラスを検出すると、最初に識別されたクラスを分析し、まったく同じ名前と同じパッケージ名を持つその他のクラスを無視します。 同じクラスがバイナリー・アーカイブ内の複数のバイナリー・ファイルにパッケージされている場合は、重複名が発生する可能性があります。 この場合、検出された重複を報告する警告がログに記録されます。 ほとんどの場合、これは問題ではありません (特に、検出されたクラスが同一の場合)。 ただし、検出されたクラスの構造に違いがある場合は、問題になる可能性があります。
次の作業
アプリケーション内のビジネス・ロジックに基づいて区画化の推奨を取得する場合は、インスツルメンテーションを使用して Java モノリシック・アプリケーションを実行し、ランタイム・トレース・ファイルを生成します。 代わりに、純粋にアプリケーションの静的分析に基づいて、より早く推薦を得たい場合は、 収集したデータをチェックし、それから AIエンジンを実行する。 コード・アナライザー、そしてオプションでバイナリー・インストゥルメンタと ユースケース・レコーダからの情報を AIエンジンの入力として使用し、AIエンジンがパーティションの推奨を生成する。 Java アプリケーション・アーカイブ・ファイルをディスク上の同じ場所に保持して、AI エンジンがパーティションの推奨ステップでさらに分析できるようにすることが重要です。
ソース・インスツルメンテーションを使用してランタイム・トレース・ファイルを収集することを選択した場合は、コード・アナライザーがインスツルメンテーション・プロセスを正常に完了した後、非実稼働環境 (代表的な環境) でインスツルメンテーション・アプリケーションをビルドしてデプロイすることができます。 元のアプリケーションをビルドおよびデプロイするために使用する正確なプロセスに従ってください。 環境によっては、アプリケーションおよびそれらのインスツルメント・バージョンは、ベア・メタル・マシン、仮想マシン、またはコンテナー上で作動することができます。