ネイティブ・イメージ・ビルド出力
ここでは、GraalVMネイティブ・イメージのビルド出力に関する情報を示します。HelloWorldクラスのネイティブ実行可能ファイルをビルドする際の出力例を次に示します:
================================================================================
GraalVM Native Image: Generating 'helloworld' (executable)...
================================================================================
[1/7] Initializing... (2.5s @ 0.21GB)
Version info: 'GraalVM dev Java 11 CE'
C compiler: gcc (linux, x86_64, 9.3.0)
Garbage collector: Serial GC
[2/7] Performing analysis... [*******] (5.6s @ 0.46GB)
2,718 (72.93%) of 3,727 classes reachable
3,442 (53.43%) of 6,442 fields reachable
12,128 (44.82%) of 27,058 methods reachable
27 classes, 0 fields, and 271 methods registered for reflection
58 classes, 59 fields, and 52 methods registered for JNI access
4 native libraries: dl, pthread, rt, z
[3/7] Building universe... (0.5s @ 0.61GB)
[4/7] Parsing methods... [*] (0.5s @ 0.86GB)
[5/7] Inlining methods... [****] (0.5s @ 0.73GB)
[6/7] Compiling methods... [**] (3.7s @ 2.38GB)
[7/7] Creating image... (2.1s @ 1.04GB)
4.00MB (28.31%) for code area: 7,073 compilation units
5.90MB (41.70%) for image heap: 83,319 objects and 5 resources
3.24MB (22.91%) for debug info generated in 1.0s
1.00MB ( 7.08%) for other data
14.15MB in total
--------------------------------------------------------------------------------
Top 10 packages in code area: Top 10 object types in image heap:
632.68KB java.util 871.62KB byte[] for code metadata
324.42KB java.lang 798.53KB java.lang.String
223.90KB java.util.regex 774.91KB byte[] for general heap data
221.62KB java.text 614.06KB java.lang.Class
198.30KB com.oracle.svm.jni 492.51KB byte[] for java.lang.String
166.02KB java.util.concurrent 314.81KB java.util.HashMap$Node
115.44KB java.math 233.58KB c.o.s.c.h.DynamicHubCompanion
98.48KB sun.text.normalizer 154.84KB java.lang.String[]
97.42KB java.util.logging 139.54KB byte[] for embedded resources
95.18KB c.oracle.svm.core.genscavenge 139.04KB char[]
1.83MB for 118 more packages 1.29MB for 753 more object types
--------------------------------------------------------------------------------
0.9s (5.6% of total time) in 17 GCs | Peak RSS: 3.22GB | CPU load: 10.87
--------------------------------------------------------------------------------
Produced artifacts:
/home/janedoe/helloworld/helloworld (executable)
/home/janedoe/helloworld/sources (debug_info)
/home/janedoe/helloworld/helloworld (debug_info)
/home/janedoe/helloworld/helloworld.build_artifacts.txt
================================================================================
Finished generating 'helloworld' in 16.2s.
ビルド・ステージ
初期化
このステージでは、ネイティブ・イメージ・ビルド・プロセスが設定され、Featuresが初期化されます。
ネイティブ・イメージの種類
デフォルトでは、ネイティブ・イメージは実行可能ファイルを生成しますが、ネイティブ共有ライブラリおよび静的実行可能ファイルを生成することもできます。
バージョン情報
ネイティブ・イメージ・プロセスのバージョン情報。この文字列は、生成されたネイティブ・バイナリ内のjava.vm.versionプロパティにも使用されます。問題を申請する場合は、このバージョン情報を報告してください。
Javaバージョン情報
ネイティブ・イメージ・ビルド・プロセスのJavaバージョン情報(java.runtime.versionプロパティ)。問題を申請する場合は、このバージョン情報を報告してください。
Cコンパイラ
ネイティブ・イメージ・ビルド・プロセスで使用されるCコンパイラの実行可能ファイル、ベンダー、ターゲット・アーキテクチャおよびバージョン情報。
ガベージ・コレクタ
生成された実行可能ファイル内で使用されるガベージ・コレクタ:
- シリアルGCはデフォルトのGCで、メモリー・フットプリントおよびJavaヒープ・サイズが小さくなるように最適化されています。
- G1 GC (GraalVM Enterprise Editionでのみ使用可能)は、stop-the-world型の一時停止を減らすように最適化されたマルチスレッドGCであり、高いスループットの実現とレイテンシの改善に貢献します。
- Epsilon GCはガベージ・コレクションを実行するのではなく、少量のメモリーのみを割り当てる、実行時間が非常に短いアプリケーション用に設計されています。
詳細は、イメージの実行時のメモリー管理に関するドキュメントを参照してください。
ユーザー固有の機能
ユーザーによって提供または明確に有効化される、またはフレームワークなどによってユーザーに暗黙的に登録されるすべてのFeatures。GraalVMネイティブ・イメージは、このリストから除外される多数の内部機能をデプロイします。
分析の実行
このステージでは、ポイントツー分析が実行されます。進捗状況インジケータは、分析の反復数を視覚化します。反復数が多いと、構成ミスや誤動作機能によって生じる可能性のある分析の問題を示すことがあります。
アクセス可能なクラス、フィールドおよびメソッド
アクセス可能なクラス、フィールドおよびメソッドの数に対するビルド・プロセスの一部としてロードされたクラスおよびメソッドの合計数。アクセスできないロードされたクラスの数が著しく多い場合、構成に問題がある可能性があります。オーバーヘッドを削減するには、アプリケーションのビルドに必要なエントリのみがクラスパスに含まれていることを確認してください。
リフレクション登録
リフレクション用に登録されているクラス、フィールドおよびメソッドの数。数値が大きいと、大量のリフレクション・オーバーヘッドが発生し、ビルド・プロセスが遅くなり、ネイティブ・バイナリのサイズが大きくなります(リフレクション・メタデータに関する項を参照)。
JNIアクセス登録
JNIアクセス用に登録されているクラス、フィールドおよびメソッドの数。
実行時コンパイル済メソッド
実行時コンパイル用にマークされたメソッドの数。この数値は、Truffle言語の構築時など、実行時コンパイルが実行可能ファイルに組み込まれている場合にのみ表示されます。実行時コンパイル済メソッドは、ヒープ内のグラフ・エンコーディングを考慮します。
ユニバースの構築
このステージでは、すべてのクラス、フィールドおよびメソッドを持つユニバースが構築され、ネイティブ・バイナリの作成に使用されます。
メソッドの解析
このステージでは、Graalコンパイラは、アクセス可能なすべてのメソッドを解析します。進捗状況インジケータは、増加する間隔で定期的に出力されます。
メソッドのインライン化
このステージでは、簡単なメソッドのインライン化が実行されます。進捗状況インジケータは、インライン化の反復数を視覚化します。
メソッドのコンパイル
このステージでは、Graalコンパイラは、アクセス可能なすべてのメソッドをマシン・コードにコンパイルします。進捗状況インジケータは、増加する間隔で定期的に出力されます。
イメージの作成中
このステージでは、ネイティブ・バイナリが作成され、ディスクに書き込まれます。デバッグ情報もこのステージの一部として生成されます(リクエストされた場合)。
コード領域
コード領域には、アクセス可能なすべてのメソッド用にGraalコンパイラによって生成されたマシン・コードが含まれます。したがって、アクセス可能なメソッドの数を減らすと、コード領域のサイズも小さくなります。
イメージ・ヒープ
ヒープには、様々な目的で静的アプリケーション・データ、メタデータ、byte[]などのアクセス可能なオブジェクトが含まれています(次を参照)。
byte[]に格納される一般的なヒープ・データ
java.lang.Stringにもコード・メタデータにもリフレクション・メタデータにもグラフ・エンコーディングにも使用されないすべてのbyte[]オブジェクトの合計サイズ。したがって、アプリケーション・コードからbyte[]オブジェクトを含めることもできます。
byte[]に格納された埋込みリソース
ネイティブ・バイナリ内のリソース(Class.getResource()を介してアクセスされるファイルなど)の格納に使用されるすべてのbyte[]オブジェクトの合計サイズ。リソースの数は「ヒープ」セクションに表示されます。
byte[]に格納されるコード・メタデータ
コード領域のメタデータに使用されるすべてのbyte[]オブジェクトの合計サイズ。したがって、アクセス可能なメソッドの数を減らすと、このメタデータのサイズも小さくなります。
byte[]に格納されたリフレクション・メタデータ
クラス、フィールド、メソッドおよびコンストラクタ・データを含む、リフレクション・メタデータに使用されるすべてのbyte[]オブジェクトの合計サイズ。リフレクション・メタデータの量を減らすには、リフレクションに登録される要素の数を減らします。
byte[]に格納されるグラフ・エンコーディング
グラフ・エンコーディングに使用されるすべてのbyte[]オブジェクトの合計サイズ。これらのエンコーディングは、実行時コンパイル済メソッドの結果です。したがって、このようなメソッドの数を減らすと、対応するグラフ・エンコーディングのサイズも小さくなります。
デバッグ情報
生成されたデバッグ情報の合計サイズ(有効な場合)。
その他のデータ
コード領域にもヒープにもデバッグ情報にもないバイナリ内のデータの量。通常、このデータにはネイティブ・イメージの内部情報が含まれているため、先頭にしないでください。
リソース使用率の統計
ガベージ・コレクション
すべてのガベージ・コレクタに費やされた合計時間、合計GC時間を合計プロセス時間で割った値(パーセント)、およびガベージ・コレクションの合計数。コレクション数が多い、またはコレクタに費やされた時間が長い場合は、通常、システムがメモリー不足であることを示します。使用可能なメモリーの量を増やして、ネイティブ・バイナリのビルド時間を短縮します。
ピークRSS
オペレーティング・システムによって報告されるピーク常駐設定サイズこの値は、ビルド・プロセスで消費されるメモリーの最大量を示します。GC統計に問題が表示されない場合は、システムの使用可能なメモリーの量をピークRSSに近い値に減らすことができます。
CPU負荷
プロセスで使用されたCPU時間を合計プロセス時間で割った値。CPUスレッドの数を増やして、ネイティブ・バイナリのビルド時間を短縮します。
マシンが読み取り可能なビルド出力
native-imageビルダーによって生成されるビルド出力は、人のために設計されており、新リリースごとに改良される可能性があります。このためツールによって解析することはできません。かわりに、-H:BuildOutputJSONFile=<file.json>オプションを使用して、マシンで読取り可能なJSON形式の出力を生成するようにビルダーに指示してください。これはモニタリング・ツールのビルドなどに使用できます。JSONファイルは、build-output-schema-v0.9.0.jsonに定義されたJSONスキーマに対して検証されます。JSONファイルは、ビルドが成功した場合にのみ生成されます。
次の例では、CI/CDビルド・パイプラインでこれを使用して、アクセス可能なメソッドの数が特定のしきい値を超えていないことを確認する方法を示します:
native-image -H:BuildOutputJSONFile=build.json HelloWorld
# ...
cat build.json | python3 -c "import json,sys;c = json.load(sys.stdin)['analysis_results']['methods']['reachable']; assert c < 12000, f'Too many reachable methods: {c}'"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError: Too many reachable methods: 12128
ビルド出力オプション
native-image --expert-options-all | grep "BuildOutput"を実行して、すべてのビルド出力オプションを表示します:
-H:±BuildOutputBreakdowns Show code and heap breakdowns as part of the build output. Default: + (enabled).
-H:±BuildOutputColorful Colorize build output. Default: + (enabled).
-H:±BuildOutputGCWarnings Print GC warnings as part of build output. Default: + (enabled).
-H:BuildOutputJSONFile="" Print build output statistics as JSON to the specified file. The output is according to the JSON schema located at:
docs/reference-manual/native-image/assets/build-output-schema-v0.9.0.json.
-H:±BuildOutputLinks Show links in build output. Default: + (enabled).
-H:±BuildOutputPrefix Prefix build output with '<pid>:<name of binary>'. Default: - (disabled).
-H:±BuildOutputProgress Report progress in build output. Default: + (enabled).
-H:±BuildOutputSilent Silence build output. Default: - (disabled).