ネイティブ・イメージ・ビルド出力

このページには、GraalVMネイティブ・イメージのビルド出力に関して記載されています。HelloWorldクラスのネイティブ・イメージをビルドする際の出力例を次に示します:

================================================================================
GraalVM Native Image: Generating 'helloworld'...
================================================================================
[1/7] Initializing...                                            (2.5s @ 0.21GB)
 Version info: 'GraalVM dev Java 11 CE'
[2/7] Performing analysis...  [*******]                          (5.6s @ 0.46GB)
   2,565 (82.61%) of  3,105 classes reachable
   3,216 (60.42%) of  5,323 fields reachable
  11,652 (72.44%) of 16,086 methods reachable
      27 classes,     0 fields, and   135 methods registered for reflection
      57 classes,    59 fields, and    51 methods registered for JNI access
[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)
   3.69MB (27.19%) for code area:    6,955 compilation units
   5.86MB (43.18%) for image heap:   1,545 classes and 80,528 objects
   3.05MB (22.46%) for debug info generated in 1.0s
 997.25KB ( 7.18%) for other data
  13.57MB in total
--------------------------------------------------------------------------------
Top 10 packages in code area:           Top 10 object types in image heap:
 606.23KB java.util                        1.64MB byte[] for general heap data
 282.34KB java.lang                      715.56KB java.lang.String
 222.47KB java.util.regex                549.46KB java.lang.Class
 219.55KB java.text                      451.79KB byte[] for java.lang.String
 193.17KB com.oracle.svm.jni             363.23KB java.util.HashMap$Node
 149.80KB java.util.concurrent           192.00KB java.util.HashMap$Node[]
 118.07KB java.math                      139.83KB java.lang.String[]
 103.60KB com.oracle.svm.core.reflect    139.04KB char[]
  97.83KB sun.text.normalizer            130.59KB j.u.c.ConcurrentHashMap$Node
  88.78KB c.oracle.svm.core.genscavenge  103.92KB s.u.l.LocaleObjec~e$CacheEntry
      ... 111 additional packages             ... 723 additional object types
                       (use GraalVM Dashboard to see all)
--------------------------------------------------------------------------------
    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プロパティにも使用されます。問題を申請する場合は、このバージョン情報を報告してください。

ユーザー提供の機能

ユーザーによって提供される、またはフレームワークなどによってユーザーに暗黙的に登録されるすべてのFeatures。GraalVMネイティブ・イメージは、このリストから除外される多数の内部機能をデプロイします。

分析の実行

このステージでは、ポイントツー分析が実行されます。進捗状況インジケータは、分析の反復数を視覚化します。反復数が多いと、構成ミスや誤動作機能によって生じる可能性のある分析の問題を示すことがあります。

アクセス可能なクラス、フィールドおよびメソッド

アクセス可能なクラス、フィールドおよびメソッドの数に対するビルド・プロセスの一部としてロードされたクラスおよびメソッドの合計数。アクセスできないロードされたクラスの数が著しく多い場合、構成に問題がある可能性があります。オーバーヘッドを削減するには、アプリケーションのビルドに必要なエントリのみがクラスパスに含まれていることを確認してください。

リフレクション登録

リフレクション用に登録されているクラス、フィールドおよびメソッドの数。数値が大きいと、大量のリフレクション・オーバーヘッドが発生し、ビルド・プロセスが遅くなり、ネイティブ・イメージのサイズが大きくなります(メソッド・メタデータを参照)。

JNIアクセス登録

JNIアクセス用に登録されているクラス、フィールドおよびメソッドの数。

実行時コンパイル済メソッド

実行時コンパイル用にマークされたメソッドの数。この数値は、Truffle言語の構築時など、実行時コンパイルがイメージに組み込まれている場合にのみ表示されます。実行時コンパイル済メソッドは、イメージ・ヒープ内のグラフ・エンコーディングを考慮します。

ユニバースの構築

このステージでは、すべてのクラス、フィールドおよびメソッドを持つユニバースが構築され、ネイティブ・イメージの作成に使用されます。

メソッドの解析

このステージでは、Graalコンパイラは、アクセス可能なすべてのメソッドを解析します。進捗状況インジケータは、増加する間隔で定期的に出力されます。

メソッドのインライン化

このステージでは、簡単なメソッドのインライン化が実行されます。進捗状況インジケータは、インライン化の反復数を視覚化します。

メソッドのコンパイル

このステージでは、Graalコンパイラは、アクセス可能なすべてのメソッドをマシン・コードにコンパイルします。進捗状況インジケータは、増加する間隔で定期的に出力されます。

イメージの作成

このステージでは、ネイティブ・イメージが作成され、ディスクに書き込まれます。デバッグ情報もこのステージの一部として生成されます(リクエストされた場合)。

コード領域

コード領域には、アクセス可能なすべてのメソッド用にGraalコンパイラによって生成されたマシン・コードが含まれます。したがって、アクセス可能なメソッドの数を減らすと、コード領域のサイズも小さくなります。

イメージ・ヒープ

イメージ・ヒープには、静的データ、実行時に初期化されるクラス、様々な目的に対応したbyte[]など、アクセス可能なオブジェクトが含まれます。

byte[]に格納される一般的なヒープ・データ

java.lang.Stringにもグラフ・エンコーディングにもメソッド・メタデータにも使用されない、すべてのbyte[]オブジェクトの合計サイズ。これは通常、優位になります

byte[]に格納されるグラフ・エンコーディング

グラフ・エンコーディングに使用されるすべてのbyte[]オブジェクトの合計サイズ。これらのエンコーディングは、実行時コンパイル済メソッドの結果です。したがって、このようなメソッドの数を減らすと、対応するグラフ・エンコーディングのサイズも小さくなります。

byte[]に格納されるメソッド・メタデータ

リフレクション・メタデータの一種であるメソッド・メタデータに使用されるすべてのbyte[]オブジェクトの合計サイズ。 メソッド・メタデータの量を減らすには、リフレクションに登録されるクラスの数を減らします。

デバッグ情報

生成されたデバッグ情報の合計サイズ(有効な場合)。

その他のデータ

コード領域にもイメージ・ヒープにもデバッグ情報にもないイメージ内のデータの量。通常、このデータにはネイティブ・イメージの内部情報が含まれているため、先頭にしないでください。

リソース使用率の統計

ガベージ・コレクション

すべてのガベージ・コレクタに費やされた合計時間、合計GC時間を合計プロセス時間で割った値(パーセント)、およびガベージ・コレクションの合計数。コレクション数が多い、またはコレクタに費やされた時間が長い場合は、通常、システムがメモリー不足であることを示します。使用可能なメモリーの量を増やして、イメージのビルド時間を短縮します。

ピークRSS

オペレーティング・システムによって報告されるピーク常駐設定サイズこの値は、ビルド・プロセスで消費されるメモリーの最大量を示します。GC統計に問題が表示されない場合は、システムの使用可能なメモリーの量をピークRSSに近い値に減らすことができます。

CPU負荷

プロセスで使用されたCPU時間を合計プロセス時間で割った値。CPUスレッドの数を増やして、イメージのビルド時間を短縮します。

ビルド出力オプション

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:±BuildOutputLinks         Show links in build output. Default: + (enabled).
-H:±BuildOutputPrefix        Prefix build output with '<pid>:<image name>'. Default: - (disabled).
-H:±BuildOutputProgress      Report progress in build output. Default: + (enabled).
-H:±BuildOutputUseNewStyle   Use new build output style. Default: + (enabled).