Welcome, GraalVM for JDK 23!

原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/welcome-graalvm-for-jdk-23-203928491b2b

本日、GraalVM for JDK 23をリリースしました。

https://www.graalvm.org/downloads/

これまで通り、Oracle JDKとOpenJDKのリリース日に併せてGraalVMをリリースします。これにより、1回のダウンロードで最新の機能がすぐに利用できます。

すでにGraalVMのダウンロード、リリースノートで詳細をご確認いただける状態です。このエントリを読み進めて、今回のリリースで新たに追加された機能をご覧ください。

Release notes
https://www.graalvm.org/release-notes/JDK_23/

また、当社のリリースストリームもご覧ください。

GraalVM for JDK 23

GraalVMをJDK 23ディストリビューションとして使用し、最新の機能や高度な最適化を行うGraal JITを利用できます。

今回のリリースでは、JDK 23のJEPを実装しました。詳細はリリースノートをご覧ください。--enable-previewを渡すことで、プレビュー機能を有効にできます。

など

Native Image

Native Imageのアップデートについて説明します。

Faster applications, less memory 🚀🌿

リリースごとに、複数のパフォーマンス指標を追跡し、Native Imageで高速な起動と低メモリ使用に加えて、可能な限り最高のピークパフォーマンスが得られることを確認しています。

Performance of Spring Petclinic with Oracle GraalVM Native Image and GraalVM CE JIT. The benchmarking experiment ran the latest Spring Petclinic on Ampere A1 servers, restricting the workload to 16 CPUs and setting a maximum heap size of 512MB.(Oracle GraalVM Native ImageとGraalVM CE JITを使用したSpring Petclinicのパフォーマンス。このベンチマーク実験では、最新のSpring PetclinicをAmpere A1サーバーで実行し、ワークロードを16 CPUに制限し、最大ヒープサイズを512MBに設定)

Spring PetClinic
https://github.com/spring-projects/spring-petclinic

Native Imageを試すのにこれほど良い時期はありません。

New Compacting Garbage Collector

このリリースでは、Serial GC の旧世代向けにmark & compact GCを追加しました。Oracle GraalVMと GraalVM Communityの両方で利用可能です。主な目的は、すべてのオブジェクトが生存した場合に現在のヒープサイズの 2 倍を使用する可能性があるコピーGCと比較して、最大メモリ使用量を削減するためです。小さなヒープサイズを使用したい場合、またはメモリに制約のある環境にデプロイし、より小さなコンテナを最適化したい場合は、このGCを確認することをお勧めします。

Memory usage reduction with the new Compacting Garbage Collector
(新しいコンパクト・ガベージ・コレクターによるメモリ使用量の削減)

上記のScrabbleベンチマークの例で示したように、この場合、Compacting GCを使用することで、メモリ使用量を約20%削減できます。メモリ使用量が削減される一方で、パフォーマンスの低下もありません。アプリケーションのピークスループットは変わりません。

Scrabble benchmark
https://github.com/renaissance-benchmarks/renaissance/blob/master/benchmarks/rx/src/main/java/org/renaissance/rx/Scrabble.java

Smaller executables

Native Imageに新しい最適化レベル-Osを追加しました。以前から他のツールでも可能でしたが、-Osを使用することで、より簡単に実行可能ファイルを小さくすることができます。このオプションは、コードサイズを最小化するようにビルドを構成し、実行可能ファイルのサイズを最小化します。裏では、イメージサイズを増加させる可能性のあるものを除いて、-O2のすべての最適化を有効にします。

以下は、GraalVM for JDK 23でビルドされた、基本的なSpring Boot Webアプリケーションの例です。サイズ最適化モード(-Os)を使うと、ネイティブアプリケーションが35%も小さくなっていることがわかります。

New optimization mode in Native Image: optimize for size
(ネイティブイメージの新しい最適化モードでサイズを最適化)

ただし、このモードはイメージサイズには最適ですが、ピークスループットには最適ではない場合があります。ベンチマークの上、目的に応じて最適化レベルを選択してください。

New SBOM Integration 🛡️

Native Imageは、サプライチェーンのセキュリティ分析に使用できる、ソフトウェア部品表(SBOM)を埋め込んだネイティブ実行ファイルを生成できます。以前は、SBOMファイルは常にネイティブイメージに埋め込まれていましたが、このたび、SBOMをJavaリソースとしてクラスパス上の

META-INF/native-image/sbom.json

に含める機能も追加しました。これを行うには、

--enable-sbom=classpath

をビルドに渡します。

SBOMをクラスパスに追加すると、Spring Actuatorなどの標準ツールで探索できる点が便利です。組み込みサポートは現在進行中ですが、すでにいくつかの簡単な手順でお試しいただけます。

1. Native Imageのサポート、Spring Web、Spring Actuatorを含むSpringプロジェクトを生成(もしくは以下のサンプルをクローン)

SBOM support in Spring Boot and GraalVM Native Image
https://github.com/alina-yur/native-spring-boot-sbom

2. native-maven-pluginで、--enable-sbom=classpathを指定してクラスパスにSBOMを追加する構成を指定

3. ビルド

mvn -Pnative native:compile

4. Native Imageを実行

./target/demo

5. Actuator エンドポイントにアクセスしてSBOMを取得

curl http://localhost:8080/actuator/sbom/native-image

これでおしまいです。プロジェクトの依存関係とメタデータを調査できます。また、お好みの脆弱性スキャナで実行することにより、SBOMを使用してアプリケーション内の既知のCVEを特定することもできます。

Better Build Reports

ビルドレポートを少々アップデートしました。GraalVM for JDK 23 以降、ビルドレポートを生成するには、以下のビルドオプションを利用する必要があります。

--emit build-report
または
emit=build-report

これにより、HTML レポートが出力されます。異なるパッケージがバイトコードのサイズやメソッドの数でどのように関連しているかを示すコードの分析結果を確認できます。これらは静的解析で到達可能メソッドのみが対象である点に注意してください。

Method-based code area breakdown
(メソッドベースのコード領域分析)

また、新たにリソースビューも追加しました。このビューを使用すると、ネイティブイメージに含まれるJavaリソース、そのソース、およびそれらのサイズが全体のファイルサイズにどのように影響するかを調査できます。これは、たとえば、誤って含まれてしまったリソースや、不正確な到達可能性メタデータによって欠落したリソースを検出するのに役立ちます。誤って含まれてしまったリソースはイメージが肥大化し、意図せずに情報を漏洩させる可能性があります。また、特定の言語用のロケールが欠落しているなど、リソースが欠落していると、実行時に問題が発生する可能性があります。このタブでは、リソースがファイルであるかディレクトリであるか、また、クラスおよびモジュールパスから取得されたものか、あるいはプログラム(例えばフレームワーク)によって注入されたものかどうかもわかるようになっています。

Resource in Build Reports
(ビルドレポートのリソース)

Extend your Java applications with Python and Wasm libraries 📚

GraalVMは常に、複数の言語間のスムーズで高速かつ容易な相互運用性を提供してきました。Pythonの優れたデータサイエンスライブラリやWasmの低レベルパッケージを使用してJavaアプリケーションを拡張することが、これまで以上に容易になりました。GraalPyとGraalWasmは現在、stableな状態に到達したことで、本番環境での作業負荷に適していると考えられています。GraalPyについては、優先事項は純粋なPythonコードとJythonのユースケースです。また、言語は通常のMaven依存関係として扱われるようになりました。プロジェクトで利用を開始する方法については、以下のURLをご覧になるか、デモをお試しください。

Dependency Setup – Embedding Languages
https://www.graalvm.org/latest/reference-manual/embed-languages/#dependency-setup
Polyglot Embedding Demo with GraalVM
https://github.com/graalvm/polyglot-embedding-demo

詳細は、Graal 言語に関するブログ記事もご覧ください。

What’s new in Graal Languages 24.1
https://medium.com/graalvm/whats-new-in-graal-languages-24-1-b2452c9debae

Foreign Function & Memory API in Native Image 🤖

今回のリリースでは、foreign function(外部関数、Project Panamaの一部)からのアップコールの実験的サポートを追加することで、Foreign Function & Memory API(JEP 454)の実装を改善しました。

JEP 454: Foreign Function & Memory API
https://openjdk.org/jeps/454

これは、以前からNative Imageで利用可能であった外部関数のダウンコールおよび外部メモリの機能に加えて実装されています。

現在、外部関数の呼び出しは x64 アーキテクチャでサポートされています。試すには、以下のオプションを指定してイメージをビルドしてください。

-H:+ForeignAPISupport

Native Image Developer Experience Improvements

これまで通り、リリースごとに開発者エクスペリエンスの改善と改良を行っています。今回のリリースにおける更新の一部を以下に示します。

【1】proxy-typeのエントリを追加し、リフレクション構成へのProxyクラスの登録が可能になりました。構成ファイルproxy-config.jsonは現在では非推奨となっていますが、引き続き有効です。プロキシクラスを指定する新しい形式は次のとおりです。

{
  "type": { "proxy": [
    "InterfaceName1",
    "InterfaceName2",
    ...
  ]},
  ... (member registrations)
}

【2】Javaの正規表現に加え、リソースへのファイルパスを指定する際に、globパターンを使用できるようになりました。Tracing Agentもこの新しい形式を採用しました。エントリは次のような形式になります。

    {
    "resources": [
    {
    "glob": "assets/**"
    },
    {
    "module": "myJavaModule",
    "glob": "images/**/*.png"
    }
    ]
    }

    【3】ほとんど静的なネイティブ実行ファイル(mostly static native executables)をビルドするための新しいAPIオプション

      --static-nolibc
      

      を追加しました。これは以下の実験的オプション

      <code>-H:±StaticExecutableWithDynamicLibC</code>
      

      を置き換えるものです。

      Build a Statically Linked or Mostly-Statically Linked Native Executable
      https://www.graalvm.org/latest/reference-manual/native-image/guides/build-static-executables/

      【4】GraalVM for JDK 22 で非推奨となった古いクラスの初期化戦略は、削除されていますのでご注意ください。

      New Class Initialization Strategy
      https://medium.com/graalvm/welcome-graalvm-for-jdk-22-8a48849f054c#df1e
      https://logico-jp.io/2024/03/21/welcome-graalvm-for-jdk-22/#df1e

      詳細はリリースノートをご覧ください。

      Native Memory Tracking

      ネイティブ・メモリー・トラッキング(Native Memory Tracking、NMT)は、HotSpotの内部メモリー使用状況を追跡するJVM機能です。NMTをサポートする第一歩として、PR #7883により、Linuxでのmalloc/calloc/reallocの追跡がサポートされました(Red Hatによるコントリビューションです)。仮想メモリーの追跡サポートとNMT JFRイベントのサポートは、今後のPRで追加される予定です。

      [GR-51851] Add initial support for native memory tracking (NMT mallocs) #7883
      https://github.com/oracle/graal/pull/7883

      Native Build Tools and GraalVM Reachability Repository 🛠️

      GraalVM Reachability Metadata Repository により、Java エコシステム内のライブラリのメタデータの共有と再利用を実現しています。特にNative Imageのビルドに有効です。最新リリースである0.3.8には、Flyway 10.10、itext、Hibernate Reactive、Hibernate Core 6.5.0、およびその他のいくつかの更新に対する設定が含まれています。

      GraalVM Reachability Metadata Repository
      https://github.com/oracle/graalvm-reachability-metadata/
      Release 0.3.8
      https://github.com/oracle/graalvm-reachability-metadata/releases/tag/0.3.8

      Native Build Tools、またはその裏でそれらを活用するフレームワークのいずれかを使用している場合、Reachabilityメタデータへのアクセスはデフォルトで有効になっています。

      Native Build Tools
      https://github.com/graalvm/native-build-tools

      また、最近の Native Build Tools リリースでは、いくつかの変更と改善を行いました。まだアップグレードしていない場合は、0.10.3 にアップグレードしてください。

      0.10.3
      https://github.com/graalvm/native-build-tools/releases/tag/0.10.3

      Native Image Layers 📦

      現在、私たちが取り組んでいる大きなプロジェクトのひとつが、Native Image Layersです。Layersを使用すると、1つ以上のベースイメージに依存するネイティブイメージを作成できるようになります。これにより、アプリケーションを再コンパイルするたびに、ユーザーコードのみを再コンパイルすればよくなり、コンパイル時間を数秒に短縮できます。私たちは、Layersの基盤を構築し、APIを定義し、このプロジェクトに積極的に取り組んでいます。今後の更新にご期待ください。

      [GR-48103] Native Image Layers #7626
      https://github.com/oracle/graal/issues/7626

      Native Kafka Broker

      Apache Kafka 3.8.0では、GraalVM Native ImageベースのBrokerのサポートが導入されました。改善提案で説明されているように、GraalVMベースのネイティブKafkaバイナリを活用することで、起動時間が1秒未満で、メモリフットプリントが最小限のBrokerを起動できるということで、開発者体験を向上させる方法としてNative Imageが検討されました。

      KIP-974: Docker Image for GraalVM based Native Kafka Broker
      https://cwiki.apache.org/confluence/display/KAFKA/KIP-974%3A+Docker+Image+for+GraalVM+based+Native+Kafka+Broker

      チームによる測定と観察結果を以下に示します。

      Native Kafka broker vs running on the JVM (Openjdk 17.0.8, Oracle GraalVM Native Image 17.0.8+9.1)
      • GraalVMブローカーの起動時間は、JVMブローカーの起動時間の約1/9を下回った。
      • GraalVMブローカーではCPUスパイクは見られませんが、JVMブローカーではブローカーの起動時と負荷テストの開始時の両方で急激なスパイクが見られた。
      • メモリ使用量にもかなりの違いが見られた。
        • JVMブローカーの場合、最大メモリ使用量は約1GBに達した
        • GraalVMブローカー(G1GC使用)の場合は約500MB、GraalVMブローカー(Serial GC使用)の場合は約250MB。

      この変更と、Kafkaコミュニティ、特にユニットテストやローカル開発に提供される機会に、私たちは非常にうれしく思っています。

      New Community Mascot

      新しいコミュニティマスコットが登場しました。

      GraalVM Community Mascot

      JavaのDukeの友人だと思ってください。ブログ投稿、カンファレンスの講演、デモなど、GraalVMについて語るあらゆる場面で使用できます。さらに、ご覧の通り、このマスコットは非常に多用途で、さらに変更を加えることもできます。皆さんの独創的なアイデアをお待ちしています。ソースは以下のURLからどうぞ。

      GraalVM Bland Guidelines
      https://www.graalvm.org/graalvm-brand-guidelines/

      お気づきかもしれませんが、私たちのマスコットには名前がありません。複数のアイデア(そしていくつかの強い意見)がありますが、コミュニティの皆さんからのご意見をぜひお聞かせください。マスコットの名前は何が良いでしょうか?コメント欄またはソーシャルメディアでご意見をお寄せください!

      Community and Ecosystem

      GitHubで、私たちのメインリポジトリが2万スターを獲得しました。皆さまの貢献、フィードバック、サポートに感謝いたします。

      GraalVM
      https://github.com/oracle/graal

      コミュニティからの最新情報もお知らせします。

      【1】今年で4回目のGraalVM Community Summitを開催します。エコシステム内のパートナーの皆様と再びお会いし、プロジェクトのロードマップについて一緒に取り組めることを大変楽しみにしています。

      GraalVM Community Summit
      https://www.graalvm.org/community/meetup/

      【2】”State of Spring”の調査結果が発表され、興味深い結果がいくつか出ています。

      • Spring Bootユーザーの11%はすでにGraalVMでネイティブコンパイルされたアプリケーションを本番環境で実行
      • 26%のユーザーは現在評価中
      • 31%はGraalVMでネイティブアプリケーションを開発する予定

      State of Spring Survey 2024 Results
      https://spring.io/blog/2024/06/03/state-of-spring-survey-2024-results

      【3】DynatraceがNative Imageアプリケーション向けに、エンドツーエンドの分散トレースを含む包括的な可視化をどのように実現しているかについては、以下の動画をご覧ください。

      【4】Ahmad Osman氏による、Spring Boot、React、GraalVMを使用したサーバーサイドレンダリングに関する非常にわかりやすいガイドがあります。

      Server-Side Rendering with Spring Boot and React
      https://www.ahmad-osman.com/en/blogs/server-side-rendering-with-spring-boot-and-react/

      【5】VaadinはNative Imageと相性が良く、フルスタックのJavaアプリケーションを簡単に作成、ビルドできます。

      【6】MavenのmvndクライアントがGraalVMを使用して構築されたネイティブ実行可能ファイルであることをご存知でしたか?

      mvnd – the Maven Daemon
      https://github.com/apache/maven-mvnd

      【7】Siva Prasad Reddy K.のブログエントリで、Fragment Expressionsを使用してThymeleaf LayoutsとGraalVMを連携する方法が紹介されています。

      Thymeleaf Layouts using Fragment Expressions in Spring Boot GraalVM Native Image
      https://www.sivalabs.in/thymeleaf-layouts-using-fragment-expressions/

      Conclusion

      この場を借りて、今回のリリースに寄せられたすべてのフィードバック、ご提案、ご協力に感謝いたします。

      このリリースに対するフィードバックや、今後のリリースに欲しい機能の提案がありましたら、Slack、GitHub、Twitterで共有してください。

      Slack invitation
      https://www.graalvm.org/slack-invitation
      GitHub Issues
      https://github.com/oracle/graal
      Twitter
      https://twitter.com/graalvm

      それでは、新しい GraalVM をお試しください!🚀

      コメントを残す

      このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください