ネイティブイメージのビルド
AOT コンパイルです。
「ネイティブイメージのビルド」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
ネイティブイメージをビルドする
native-imageツールは、コンパイル済みのJavaバイトコードを単一の自己完結型ネイティブ実行ファイルに変換します。このレッスンでは、ビルドプロセス、内部で行われる処理、生成物の実行方法について説明します。
通常のJavaから始める
ネイティブイメージは、通常どおりコンパイルされたクラスから始まります。ここでは、ネイティブコードにコンパイルする普通のプログラムを想定します。
public class Hello {
public static void main(String[] args) {
System.out.println("Hello from a native binary!");
}
}コンパイルしてからビルドする
手順は2つあります。まずjavac Hello.javaでHello.classを生成し、次にnative-image Helloでhelloという名前の実行ファイルを生成します。プログラム全体を解析するため、ビルドにはコンパイルよりもはるかに時間がかかります。
クローズドワールド解析
native-imageはクローズドワールド解析を行います。実行される可能性のあるすべてのコードを把握しなければなりません。mainを起点に、到達可能なすべてのメソッドをたどり、それらだけをバイナリに含めます。到達不可能なものはすべて削除されます(リンク時のデッドコード除去です)。
事前コンパイル
到達可能なメソッドは、事前にネイティブマシンコードへコンパイルされます。解釈するバイトコードが残らず、JITも存在しないため、ウォームアップもありません。プログラムは最初の命令からフルスピードで実行されます。
ビルド時の初期化
高速に起動するため、native-imageはビルド時に静的イニシャライザを実行し、その結果のヒープをイメージに埋め込むことができます(イメージヒープ)。これにより、プログラムの起動時点ですでに存在しているオブジェクトが生まれます。
実行ファイルを実行する
出力されるのは通常のOS実行ファイルです。java -jarは不要で、対象マシンにJVMをインストールする必要もなく、直接実行できます。フラグに応じて、完全静的またはほぼ静的な実行ファイルになります。
よく使うビルドフラグ
便利なオプションには次のものがあります。
-o name— 出力ファイル名を指定します。--no-fallback— JVMに依存するフォールバックイメージを生成せず、失敗させます。-O2/-O3— 最適化レベルを指定します。--static— 完全な静的リンクのバイナリを生成します(Linux)。
メモリとディスク
ビルド自体は大量のメモリを必要とします。大規模なアプリケーションでは、数GBのRAMと数分間のCPU時間が必要になることがあります。このコストをビルド時に一度支払う代わりに、実行時の起動を低コストかつ高速にできます。
Maven/Gradle経由でビルドする
実際のプロジェクトでnative-imageを手動で呼び出すことはほとんどありません。GraalVMのnative-build-toolsプラグインは、Maven(native:compile)やGradle(nativeCompile)にnative-imageを統合するため、バイナリを通常のビルドパイプラインの一部にできます。
起動時間を確認する
ビルド後に起動時間を比較してください。java -jarによる起動には数百ミリ秒かかることがありますが、ネイティブバイナリは1桁ミリ秒で起動します。この違いを測定することが、ネイティブ化の目的です。
クイックチェック
ネイティブイメージのビルドについての理解度を確認してください。
振り返り
native-imageのビルドについて学びました。
- コンパイル済みバイトコードから始め、
native-imageで自己完結型の実行ファイルを生成します。 - クローズドワールド解析によって、
mainから到達可能なすべてのコードを見つけます。 - 到達可能なコードはAOTコンパイルされ、到達不可能なコードは削除されます。
- ビルド時の初期化によってイメージヒープを埋め込み、高速な起動を実現します。
- ビルドには時間とメモリが必要なので、Maven/Gradleプラグインを介して統合します。
よくある質問
「ネイティブイメージのビルド」レッスンは無料ですか?
はい。「ネイティブイメージのビルド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「ネイティブイメージのビルド」で何を学びますか?
AOT コンパイルです。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ネイティブイメージのビルド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- GraalVM とは
- ネイティブイメージのビルド
- リフレクションと設定
- ネイティブイメージのトレードオフ