ネイティブ・イメージのクラスの初期化

Javaのセマンティクスにより、実行時にクラスに初めてアクセスが発生したときにそのクラスを初期化することが求められます。クラスの初期化では、次の2つの理由により、Javaアプリケーションの事前コンパイルに対して悪影響があります:

クラス初期化の悪影響を減らすために、ネイティブ・イメージは、ビルド時にクラス初期化をサポートします。これは、実行可能ファイルをビルドするときにクラスを初期化し、実行時の初期化および不要なチェックを行います。初期化されたクラスのすべての静的状態が実行可能ファイルに格納されます。ビルド時に初期化されたクラスの静的フィールドへのアクセスは、アプリケーションに対して透過的であり、クラスが実行時に初期化されたかのように機能します。

ただし、Javaクラス初期化セマンティクスは、次のようなクラス初期化ポリシーを複雑にするいくつかの制約を課します:

ネイティブ・イメージの操作性はそのまま保ちながらビルド時の初期化のメリットを得るために、ネイティブ・イメージでは次の2つのことが行われます:

初期化されたクラスとその理由を追跡するには、コマンドライン・オプション-H:+PrintClassInitializationnative-imageツールに渡します。このオプションは、必要に応じて動作するようにnative imageビルダーを構成するのに役立ちます。目的は、アプリケーションの正しいセマンティクスを維持したまま、可能なかぎり多くのクラスをビルド時に初期化することです。

ビルド時の初期化

ネイティブ・イメージは、ガベージ・コレクタ、重要なJDKクラス、デオプティマイザなど、ほとんどのJDKクラスをビルド時に初期化します。ビルド時に初期化されるすべてのクラスについて、ネイティブ・イメージは適切なサポートを提供するため、ビルド時にクラスの初期化が行われたにもかかわらず、セマンティクスは一貫性が保たれます。ビルド時のクラスの初期化が原因でJDKクラスが正しく動作しない問題がある場合は、問題を報告してください。

安全なクラスの自動初期化

アプリケーション・クラスについては、ネイティブ・イメージにより、ビルド時に安全に初期化できるクラスの検出が試みられます。クラスは、そのすべての関連スーパータイプが安全で、かつ、クラス・イニシャライザが安全でないメソッドをコールすることや、他の安全でないクラスを初期化することがない場合、安全とみなされます。

次の場合、メソッドは安全でないとみなされます:

安全であると実証されているクラスの例を示すテストは、ここで参照できます。安全であることが証明されたすべてのクラスのリストは、native-imageツールの-H:+PrintClassInitializationコマンドライン・オプションを使用してファイルに出力されます。

ノート: クラスの初期化を明示的に指定することもできます。