ネイティブイメージビルドリポート

ビルドリポートは、GraalVMネイティブイメージ専用にカスタマイズされた単一のHTMLページレポートです。このレポートは、各ビルドステージと生成されたバイナリのコンテンツに関する広範な情報を提供します。ここでは、ビルドリポートを生成する方法と、各レポートセクションを使用する方法について説明します。

注:ビルドリポートは、GraalVM Community Editionでは使用できません。

目次 #

レポートの生成 #

シンプルなHelloWorld Micronautアプリケーション(GraalVMデモ リポジトリにあります)を使用して、ビルドリポートの生成とその構造を示します。

ビルドリポートは、`native-image`コマンドを実行する際に`--emit`オプションを使用することで簡単に生成できます。

native-image --emit build-report -cp . Application

ネイティブイメージ用Mavenプラグインを使用しているMicronautの例では、プラグインの設定に`--emit build-report`オプションを追加するだけです。

<plugin>
  <groupId>org.graalvm.buildtools</groupId>
  <artifactId>native-maven-plugin</artifactId>
  <configuration>
    ...
    <buildArgs combine.children="append">
      <buildArg>--emit build-report</buildArg>
      ...
    </buildArgs>
  </configuration>
</plugin>

レポートは、ビルドが正常に完了した後、生成されたバイナリと一緒に自動的に作成されます。HTMLページ(デフォルトでは *<バイナリ名>-build-report.html* という名前)へのリンクは、ビルド出力の最後にある *ビルドアーティファクト* セクションに表示されます。

========================================================================================================================
GraalVM Native Image: Generating 'MnHelloRest' (executable)...
========================================================================================================================

...

Build artifacts:
 .../graalvm-demos/micronaut-hello-rest-maven/target/MnHelloRest (executable)
 .../graalvm-demos/micronaut-hello-rest-maven/target/MnHelloRest-build-report.html (build_info) <----- generated report
========================================================================================================================
Finished generating 'MnHelloRest' in 36.0s.

さらに、レポートのファイル名またはパスは、`build-report`引数に追記することでカスタマイズできます。これは、たとえば、異なる設定を使用して同じアプリケーションの複数のバイナリを作成する場合に非常に役立ちます。

native-image -0b --emit build-report=/tmp/application-build-report-default.html -cp . Application
native-image -0s --emit build-report=/tmp/application-build-report-size-optimized.html -cp . Application

レポートの構造 #

すべてのレポートページは、複数のセクション(またはタブ)で構成され、それぞれがタイトルに対応するデータを表示します。最初に *概要* セクションが表示され、*コード領域*、*イメージヒープ*、*リソース*、*Software Bill of Materials (SBOM)*、*PGOサンプリングプロファイル*(PGOビルドの場合のみ)セクションもあります。各セクションについては、以下のサブセクションで詳しく説明します。

概要 #

*概要* セクションでは、ビルドの全体的な概要を示します。このセクションは、ビルドプロセスにおけるステージに対応する、または追加の有用な情報を提供する4つのサブセクションで構成されています。

  • *環境* は、ビルドで使用される環境(Javaバージョン、GraalVMバージョン、Graalコンパイラ設定など)に関する情報を提供します。
  • *分析結果* は、ポイントツー分析の結果(型、フィールド、メソッド)をカテゴリ(到達可能、リフレクション、JNI、ロード済み)別にグループ化して表示します。
  • *イメージの詳細* は、バイナリのコンテンツの概要を示します。チャートは、バイナリのさまざまな部分(コード領域、イメージヒープ、デバッグ情報、その他のデータ)がサイズに関してどのように関連しているかを視覚化します。
  • *セキュリティレポート* は、ビルドに関するさまざまな種類のセキュリティ関連情報(デシリアライゼーション、埋め込みSBOM、Backwards-Edge Control-Flow Integrity (CFI))を報告します。
  • *リソース使用量* は、ビルドに使用されたリソース(ガベージコレクション、ピークRSS、CPU負荷)と、バイナリの生成に費やされた合計時間に関する追加情報を提供します。

Summary Preview

注:*イメージの詳細* の各バーにカーソルを合わせると、詳細情報が表示されます。また、*コード領域* と *イメージヒープ* バーをクリックすると、それぞれのセクションにリンクします。

このすべての情報はJSON形式でも入手でき、ページの右上にある *JSONとしてダウンロード* をクリックすることでダウンロードできます。

コード領域 #

*コード領域* セクションでは、静的分析後に到達可能と判断されたコードの詳細なビューを提供します。これは、 *内訳チャート* *パッケージとクラスのリスト* の2つの相互に関連する部分で構成されています。

メソッドベースの内訳

バイナリのコード領域は、細かいメソッドレベルでパッケージごとに分類されます。内訳では、ポイントツー分析で見つかった到達可能なメソッドのみが考慮されます。これは、サンバーストチャート(階層的なマルチレベル円グラフ)の形で視覚化されます。

チャートは、異なるパッケージ(およびクラス)が互いにどのように関連しているかを表示します。比率は、メソッドの累積 **バイトコードサイズ**(デフォルト)またはメソッドの **総数** のいずれかに基づいて計算されます。これは、ページの右上にある *内訳タイプ* ドロップダウンリストを使用して選択できます。

Code Breakdown Type

注:チャートに表示されるデータ量を制限するために、固定のしきい値が使用されます(現在のルートパッケージに対する合計パーセンテージの0.1)。しきい値は *内訳チャートにのみ* 適用され、下の表にはパッケージとクラスの完全なリスト(現在のレベル)が含まれています。

パーセンテージ(すべてのパッケージ円弧に表示)は、兄弟パッケージ間の関係を表しています。すべてのパーセンテージは、ルートパッケージ(トップレベルビューの場合は抽象 *合計* パッケージ、ドリルダウンした場合は任意のパッケージ)を基準に計算されます。さらに、特定のパッケージの具体的な値(メソッドのバイトコードサイズまたはメソッドの総数)は、そのパッケージ円弧にカーソルを合わせると表示できます。

Code Breakdown Tooltip

この内訳の最も重要な機能は、任意のパッケージの関係を深く掘り下げて調べることができることです。これは、対象のパッケージ(少なくとも1つの子パッケージまたはクラスを持つ)をクリックするだけで実現できます。親パッケージに1レベル戻る逆の操作も、チャートの中央にある「ルート」パッケージをクリックすることで同様に実現できます。

また、ドリルダウンチェーン(*合計* から現在のパッケージまで)の任意のパッケージに戻ることもできます。これは、チャートのすぐ上に表示されているドリルダウンチェーン内の特定のパッケージをクリックするだけで実現できます。

Code Breakdown Drill Down

また、内訳チャートとパッケージとクラスのリストは *同期* されています。すべてのドリルダウンは、下の表を同時に更新し、その逆も同様です。

パッケージとクラスのリスト

パッケージとクラスのリストは、主要な内訳の拡張として機能します。選択したパッケージ(最初は *合計*)に含まれるすべてのパッケージとクラスをリストします。この表には、各パッケージとクラスに関するすべての情報(メソッドのバイトコードサイズ(またはメソッドの総数)とその相対パーセンテージ)も表示されます。

子(少なくとも1つのパッケージまたはクラス)を持つパッケージは、*リンク* として表示されます。リンクをクリックして内訳チャートをドリルダウンします。これらは *同期* されています。同様に、逆の操作は、1レベル戻る(親パッケージに戻る)↑(最初の行に表示)をクリックすることで実現できます。

List of Packages and Classes

注:選択したパッケージの *直接の* 子孫のみがリストされます(各ドリルダウンで更新されます)。

イメージヒープ #

バイナリのオブジェクトヒープは、オブジェクトタイプ別に分類およびグループ化されます(CLIビルド出力の イメージヒープ 表に似ています)。主な違いは、ビルドリポートでは、オブジェクトタイプの完全なリストと、それらの数、サイズ、相対パーセンテージなどの詳細情報が、プログレスバーの形で視覚化されて表示されることです。

完全なリストの一般的なユースケースの1つは、特定のクラスのインスタンスがイメージヒープの一部であるかどうかを判断することです(*ページ内検索* を使用)。

Image Heap Breakdown Preview

リソース #

リソースタブを使用して、ネイティブイメージに含まれるJavaリソース、その起源、およびそれらのサイズがイメージ全体のサイズにどのように寄与しているかを調べることができます。これは、たとえば、誤って含まれているリソースや、到達可能性メタデータが正しくないために見つからないリソースを検出するのに役立ちます。

すべてのリソースはメインテーブルにリストされています。デフォルトでは、設定ファイルを通じて明示的に要求されたリソースが表示されます。さらに、提供されるリソースには、次の3種類があります。

  • *見つからないリソース* は、設定ファイルを通じて要求されましたが、システム上に存在しませんでした。
  • *挿入されたリソース* は、GraalVM SDKを通じてプログラムで登録されました(通常、フレームワークがネイティブイメージのコンパイルを支援するために使用されます)。
  • *ディレクトリリソース* は、ディレクトリを表す特別なタイプのリソースです(通常は、そのディレクトリ内のファイルとディレクトリの名前のみが含まれているため、小さいです)。各種類のリソースは、対応するチェックボックスを介してテーブルに表示できます。

テーブル内のリソースは、左上の検索ボックスを使用して名前でフィルタリングできます。さらに、リストは、リソース属性のいずれかを使用してソートできます(テーブルヘッダーの専用の&amp; updownarrow;ソートボタンを使用)。

Resources Preview

Software Bill of Materials (SBOM) #

Software Bill of Materialsは、最終的なバイナリの構築に関与するすべてのアーティファクトのインベントリを表します。各アーティファクトは、完全修飾名(組織名+アーティファクト名)とその特定のバージョンによって一意に識別されます。ビルドで使用されるすべてのアーティファクトは、テーブルにリストされています。

SBOM Preview

この情報はすべて、CycloneDX 形式の JSON として入手可能です。JSONとしてダウンロード をクリックしてダウンロードできます。

PGO サンプリングプロファイル #

PGO サンプリングプロファイルは、PGO 最適化バイナリのビルド時に生成されるレポートにのみ存在するセクションです。このセクションについては、専用の PGO ガイドである ビルドリポートのプロファイルの検査 で詳しく説明されています。

お問い合わせ