GraalVMは、多くのネイティブイメージが改善されたメジャーバージョン22.0をリリースした。GraalVMは、複数の言語で記述されたアプリケーションを実行するための共有ランタイムを提供するポリグロット仮想マシンである。ネイティブイメージビルダーユーティリティの更新で、ビルド時間が短縮され、イメージサイズが小さくなり、イメージのビルドと実行に使用するメモリを減らす大きな改善があった。コミュニティからのフィードバックにより、ユーティリティからの出力により、イメージ生成プロセスに関する深い洞察が得られる。
ネイティブイメージビルダーのnative-image
は、イメージサイズを縮小するために、スタックフレームメタデータを圧縮形式でエンコードするようになった。さらに、エンタープライズエディションでは、最適化されたString.format()を使って、適切な場合にローカリゼーションクラスに到達できないようにすることで、画像サイズを大幅に削減している。
デフォルトでは、生成されたネイティブイメージではシリアルガベージコレクター(シリアルGC)が使われるようになる。シリアルGCは、メモリフットプリントが小さく、Javaヒープサイズが小さくなるように最適化される。これにより、GCで費やされる時間や、アプリケーションの常駐セットサイズ(RSS)が削減される。シリアルGCは小さなヒープに適していることに注意してください。より大きなヒープを必要とするアプリケーションの場合、G1 GCの方が適している可能性がある。ただし、これはエンタープライズエディションでのみ使用できる。
このリリース以前は、特にdocker/kubernetes環境では、native-image
のビルドが遅くなる傾向があることが確認されている。バージョン22.0以降では、ネイティブイメージのデフォルト出力では、複数のステージに分割されたイメージ生成プロセス全体を通した重要な情報が提供される。
上のスクリーンショットからわかるように、この出力は、プログレスバーを使って複数のステージにきれいに分離されている。プログレスバーの各*
は、画像生成中に実行された分析のイテレーションである。パフォーマンス分析のステージは、構成の誤りを特定するための重要な領域である。出力を確認することで、ユーザが非常に広いクラスパスを見つけられるようになる。その結果、未使用のクラスやメソッドが多数発生する可能性がある。リフレクションの潜在的な乱用も出力から特定できる。ご想像のとおり、未使用のjarファイルを削除し、可能な場合はリフレクションを回避することで、ビルド時間を改善し、イメージサイズを小さくできる。イメージ作成ステージは、イメージサイズをさらに縮小し、ビルドを高速化するために出力がレビューされるもう1つの重要な領域である。ビルドの最後に、リソース使用状況レポートが生成される。このレポートでは、ガベージコレクションに費やされた時間、ピークRSS、CPU負荷が示される。これらのさまざまな統計情報をすべて使って、使用可能なメモリとCPUを微調整することでビルドが高速化される。生成されたレポートは、GraalVMダッシュボードにロードすることで視覚的に分析できる。
また、クローズドワールド分析手法のおかげで、native-image
はセキュリティの脆弱性を検出して報告できるようになった。ビルドのパフォーマンス分析ステージで、classpath
上の既知のセキュリティの脆弱性にフラグが付けられる。次のスクリーンショットは、パッチが適用されていないlog4jライブラリと脆弱なメソッドの使用にフラグを立てるnative-image
からの出力を示している。
このリリースでは、Javaモジュールシステムのネイティブイメージのサポートも改善されている。--add-reads
と--add-modules
のサポートに加えて、modulepath
をスキャンする前に、すべてのモジュール関連オプションが考慮されるようになった。これらの改善により、クラスのロードエラーを防ぐことができ、実行時のモジュールのイントロスペクションが向上する。
これは、native-image
をJDK 8で実行できる最終リリースであることに注意してください。実際に、GraalVM 22.0エンタープライズエディションではJDK8のサポートを終了し、JDK11とJDK17をベースとしている。GraalVMコミュニティエディションのこのリリースのJavaバージョンは、OpenJDK 11.0.14とOpenJDKバージョン17.0.2をベースとしている。
GraalVM 22.0には、部分的な展開、インライン化、複製、ベクトル化など、新規や更新されたコンパイラー最適化も含まれる。エンタープライズエディションには、デフォルトで無効になっている新しいループローテーション最適化がある。エンタープライズエディションのGraalコンパイラでは、プロファイルがない場合でも最適化を実行できるようになった。コミュニティエディションとエンタープライズエディションの両方に、instanceof
ブランチを使用するswitchステートメントのネイティブイメージ最適化が付随する。
いつものように、このリリースのGraalVMでは、Python、R、Ruby、およびLLVMディストリビューション全体に対してランタイムが改善されている。GraalVMによるWebAssembly言語とJava on Truffleの実装により、Truffleフレームワークとの互換性が向上した。GraalVMのNode.jsディストリビューションが14.18.1に更新された。また、GraalVMのJavaScriptでは、ECMAScript 2022モードと機能がデフォルトで有効になっている。
最後に、GraalVM 22.0リリースにはVisual Studio Code用の改善されたGraalVM拡張パックが付属している。GraalVMベースのアプリケーションの開発とデバッグを支援するためのものである。