Skip to content

Instantly share code, notes, and snippets.

@koduki
Last active March 19, 2025 02:45
Show Gist options
  • Save koduki/17e23a7582f54194a2f351c612439c44 to your computer and use it in GitHub Desktop.
Save koduki/17e23a7582f54194a2f351c612439c44 to your computer and use it in GitHub Desktop.

※ 調査のためにDeepSearchでレポートを作成。精査はしてないので取扱注意

JEP 483、AppCDS、GraalVM Native Imageの技術的詳細、登場の経緯、ユースケース、および比較

1. はじめに

Javaアプリケーションの初期起動時間は、特に最新のクラウドネイティブ環境において、応答性とリソース効率の観点から長らく懸念事項となっています。このレポートでは、この問題に対処することを目的とした3つの主要な技術、すなわちJDK 24のProject Leydenの下で導入された新機能であるJEP 483: Ahead-of-Time Class Loading & Linking、JDK 10で導入され、JDK 5の基本的なClass Data Sharing (CDS)メカニズムを基盤とするApplication Class-Data Sharing (AppCDS)、そしてJavaコードをネイティブ実行可能ファイルにAhead-of-Timeコンパイルする技術であるGraalVM native-imageについて詳しく解説します。本稿の目的は、これらの技術の技術的詳細、歴史的背景、典型的なユースケース、そして情報に基づいた意思決定を支援するための多角的な比較を提供することです。

2. JEP 483: Ahead-of-Time Class Loading & Linking

2.1. 技術的詳細

JEP 483は、JDK 24の一部としてProject Leydenによって導入され、JVMの起動時にアプリケーションのクラスをロードおよびリンクされた状態で即座に利用可能にすることで、起動時間の改善を目指しています 1。これは、Class Data Sharing (CDS)によって確立された基盤の上に構築されています 3。

この機能を使用するには、まずAOT構成を記録するための「トレーニング実行」が必要です。これは、-XX:AOTMode=record -XX:AOTConfiguration=app.aotconfフラグを使用して行われます 4。このトレーニング実行の必要性は、ビルド時の依存関係を生み出し、開発者は代表的なワークロードを定義する必要があります。これは、ビルドおよびデプロイメントパイプラインに複雑さを加える可能性があります。トレーニング実行は、通常のアプリケーションの使用状況下でのクラスロードの動作を捉える必要があるため、不十分または代表的でないトレーニング実行は、最適でないAOTキャッシュにつながる可能性があります。

次に、記録された構成を使用してAOTキャッシュファイル(例:app.aot)を作成する別のステップがあります。これは、-XX:AOTMode=create -XX:AOTConfiguration=app.aotconf -XX:AOTCache=app.aotを使用して行われます 5。この2段階のプロセス(記録と作成)は煩雑であることが認識されており、将来的に単一のステップに簡略化される予定です 7。記録と作成のフェーズを分離すると、追加のコマンドとファイル管理ステップが発生し、この機能の採用のオーバーヘッドが増加する可能性があります。

その後、アプリケーションの実行時に、-XX:AOTCache=app.aotを指定することで、このキャッシュを利用できます 5。AppCDSが解析済みのクラスバイトコードをキャッシュするのに対し、JEP 483はロードおよびリンクされた状態のクラスをキャッシュします 3。リンクされた状態をキャッシュすることにより、JEP 483は、JVMが起動時にリンキングステップを実行する必要がないため、AppCDSと比較してランタイムのオーバーヘッドをさらに削減することを目指しています。リンキングにはクラス間のシンボリック参照の解決が含まれ、これは特に複雑なアプリケーションの場合、JVM起動プロセスの重要な部分となる可能性があります。

現在、組み込みのクラスローダーによってロードされたクラスのみがAOTキャッシュの一部になることができます 3。この制限は、カスタムクラスローダーに大きく依存するアプリケーションに影響を与える可能性があり、これらのクラスはAhead-of-Timeロードおよびリンキングの恩恵を受けることができません。高度なプラグインアーキテクチャまたは動的なクラスロードメカニズムを持つフレームワークまたはアプリケーションは、JEP 483の完全なメリットを享受できない可能性があります。

AOTキャッシュには、リンクされたクラスデータが含まれるため、AppCDSキャッシュよりも大幅に多くのデータが含まれます 3。キャッシュサイズが大きいと、キャッシュの作成時と、キャッシュがロードされるランタイム時の両方で、メモリ使用量に影響を与える可能性があります。目標は起動時間を改善することですが、大幅に大きなメモリフットプリントは考慮すべきトレードオフとなる可能性があります。

2.2. 歴史と進化

Ahead-of-Time Class Loading & Linking機能は、Javaプログラムの起動時間、ピークパフォーマンスまでの時間、およびフットプリントの改善を目的として2022年に開始されたProject Leydenから生まれた最初のJEPです 3。これは、JDK 5で導入され、JDK 10でAppCDSによって拡張された既存のClass Data Sharing (CDS)メカニズムを基盤として、JVMの遅い起動時間に対処するためのさらなる一歩となります 3。

当初、Project LeydenはGraalVM Native Imageと同様の静的イメージの概念を検討していましたが、2年間の公開活動がない後、JITコンパイラの最適化に方向転換しました。JEP 483はこの方向転換の最初の成果です 11。この方向転換は、OpenJDKコミュニティが起動パフォーマンスに対処するためにさまざまなアプローチを模索していることを示唆しており、JEP 483はGraalVM Native Imageのスタンドアロンな性質と比較して、よりJVM統合された戦略を表しています。

2.3. ユースケースと利点

JEP 483の主な目的は、JVMアプリケーションの起動時間を短縮することです 1。特に、Spring Bootのようなフレームワークを使用する多くのクラスをロードするアプリケーションにとって価値があります 4。テストでは、以下のような大幅な高速化が実証されています。

  • コード変更なしでアプリケーションの起動時間を最大40%改善 4。
  • Stream APIを使用する単純なプログラムのロード時間を42%削減 5。
  • Spring PetClinicの起動時間を42%削減 5。
  • Helidonチームは、Helidon SEで67%、Helidon MPで62%の高速化を報告しました 4。

この機能は、起動が重要なクラウドネイティブアプリケーション、マイクロサービス、および頻繁なアプリケーション再起動がある環境で特に有益です 8。クラスのロードとリンキングの作業を事前に行うことで、アプリケーションはより迅速にリクエストを処理できるようになります。JEPは、Spring Boot 8 およびSpring Framework 8 のユーザーがこの機能の恩恵を受けることができると明示的に述べています。報告された高速化の割合は大きいものの、GraalVM Native Image(95〜99%)で達成されるものほど劇的ではない可能性があります 4。これは、JEP 483がより穏やかな最適化であり、潜在的なトレードオフが少ない可能性を示唆しています。

2.4. 制限事項と互換性

トレーニング実行とその後の実行は、JDKリリース、ハードウェアアーキテクチャ、オペレーティングシステム、クラスパス(JARファイルのみを含む必要がある)、およびモジュールオプションに関して、本質的に類似している必要があります 8。これらの厳格な一貫性の要件は、動的な環境や複雑なデプロイメント構成において課題となる可能性があります。異なる環境間で同一のクラスパスとモジュールオプションを維持することは困難な場合があります。

ユーザー定義のクラスローダーによってロードされたクラスはキャッシュできません 3。また、クラスファイルを任意に書き換えるJVMTIエージェントや、特定のクラスローダー検索APIを呼び出すJVMTIエージェントとも連携しません 8。ZGCガベージコレクターはまだサポートされていません 8。古いバイトコード検証ツールを必要とする古いクラスや、署名付きクラスは事前にロードおよびリンクできない場合があります 8。キャッシュ作成の2段階のワークフローは現在煩雑です 7。一貫性の制約に違反した場合、JVMはデフォルトで警告を発行し、キャッシュを無視します 8。

3. Application Class-Data Sharing (AppCDS)

3.1. 技術的詳細

AppCDSは、起動時にロードされるクラスの事前処理された共有アーカイブを作成することにより、JVMアプリケーションの起動時間とメモリフットプリントを削減するJVM機能です 15。これは、JDKクラス用のClass Data Sharing (CDS)機能を拡張し、アプリケーションクラスを含めるようにしたものです 3。

静的AppCDSには、次の2段階のプロセスが含まれます。

  1. -XX:DumpLoadedClassListを使用してアーカイブするクラスのリストを生成します 12。
  2. -XX:SharedClassListFileおよび-XX:SharedArchiveFileと-Xshare:dumpを使用してAppCDSアーカイブを作成します 12。

動的AppCDSはJDK 13で導入され、-XX:ArchiveClassesAtExitを使用してJavaプロセスの終了時にアーカイブを作成することで、プロセスを簡略化します 13。動的AppCDSは、明示的なクラスリスト生成ステップを不要にすることでユーザビリティを向上させますが、JDKのデフォルトのCDSアーカイブに依存します 16。

実行時には、-XX:SharedArchiveFileと-Xshare:onまたはより耐障害性の高い-Xshare:autoを指定することで、アーカイブが使用されます 12。Quarkusは、quarkus.package.jar.appcds.enabled構成プロパティを使用してAppCDSの生成を簡略化します 15。Quarkusのようなフレームワークは、AppCDSとJEP 483を積極的に統合し、開発者にとってより簡単な採用を提供しています 4。

3.2. 歴史と進化

コアClass Data Sharing (CDS)はJDK 5で導入されました 12。Application Class-Data Sharing (AppCDS)はJDK 10(JEP 310)で導入されました 3。AppCDSは、ユーザーコードにCDSのメリットを拡張するための重要なステップであり、Javaアプリケーションの複雑性の増大に対処しました。動的CDSはJDK 13(JEP 350)で導入され、ユーザビリティが向上しました 13。JDK 12では、コアJDKクラスに対してCDSがデフォルトで有効になりました 3。AppCDSはJDK 13および19でさらに機能強化されています 13。JDK 24では、クラスデータ共有の進化としてAOTキャッシュが導入されています 15。

3.3. ユースケースと利点

AppCDSは、JVMアプリケーションの起動時間とメモリフットプリントを削減します 15。特に、クラウド環境、コンテナ化されたアプリケーション、および頻繁にアプリケーションが起動するサーバーレス機能で有益です 15。起動時間を最大40〜50%改善できます 7。一部の情報源では約30%の改善が報告されています 25。ある例では、47%の起動高速化が示されました 16。また、複数のJVMプロセス間でクラスメタデータを共有することで、メモリ使用量を削減します 12。JVMインスタンス間で一貫した状態になるため、より予測可能なパフォーマンスにつながる可能性があります 26。

3.4. 制限事項と互換性

アーカイブの作成とアプリケーションの実行には、同じJVMバージョンを使用する必要があります 15。この厳格なJVMバージョンの依存関係は、特にJDKをアップグレードする際にデプロイメントを複雑にする可能性があります。アーカイブは新しいバージョンで再生成する必要があります 20。アーカイブ作成時に使用されるクラスパスは、実行時に使用されるクラスパスと同じであるか、そのプレフィックスである必要があります 12。JARファイルとアーカイブファイルへのパスは完全に一致する必要がある場合があります 15。手動での作成は複雑であり、JVMバージョンに依存します 15。動的AppCDSは、デフォルトのCDSアーカイブに依存します 16。特に動的なクラスロードの場合、起動時に必要なすべてのクラスをアーカイブできない場合があります 15。場合によっては、AppCDSを使用しないJVMと比較して、ランタイムパフォーマンスが低下する可能性があります 25。メモリマッピングはオペレーティングシステムに固有です 27。

4. GraalVM Native Image

4.1. 技術的詳細

Native Imageは、Javaコードをスタンドアロンのネイティブ実行可能ファイルにAhead-of-TimeコンパイルするGraalVMテクノロジーです 4。ネイティブ実行可能ファイルには、アプリケーションクラス、標準ライブラリクラス、言語ランタイム、およびJDKから静的にリンクされたネイティブコードなど、ランタイムに必要なコードのみが含まれます 28。

ビルドプロセス: native-imageツールは、アプリケーションコードの静的分析を実行して、到達可能なクラスとメソッドを特定し、その後、特定のOSおよびアーキテクチャ用のバイナリにコンパイルします 28。これは「クローズドワールド」の仮定に基づいています 30。このクローズドワールドの仮定はNative Imageの基本的な側面であり、すべての必要なコードパスがビルド時に検出可能である必要があります。これは、Javaの動的な機能に制限を課します。

ローカルツールチェーン(Cライブラリヘッダーなど)が必要です 28。MavenおよびGradleプラグインは、ビルドプロセスを自動化するために利用できます 28。リフレクション、動的プロキシ、JNI、シリアライゼーションなどの動的な機能には、ネイティブイメージビルダーに通知するためのメタデータ構成(例:JSONヒントファイル)が必要です 28。動的な機能のメタデータ構成の管理は複雑でエラーが発生しやすく、多くの場合、これらのファイルを自動的に生成するためにトレースエージェントを使用する必要があります 29。

4.2. 歴史と動機

Oracle Labsの研究プロジェクトとして登場しました 14。特にクラウドネイティブ環境において、Javaアプリケーションの高速な起動時間、低いリソース消費量、および即座のピークパフォーマンスの必要性に動機付けられています 28。Javaを起動速度とリソース効率の点でC++、Rust、Goなどの言語とより競争力のあるものにすることを目指しています 3。Javaフレームワークとクラウドベンダーで広く採用されています 40。

4.3. ユースケースと利点

高速な起動と低いリソース消費を必要とするマイクロサービス 28。応答性の高い実行のためのサーバーレス機能 14。即座の実行のためのコマンドラインインターフェース(CLI) 28。リソース使用量の削減が有利なモバイルアプリケーション(可能性あり) 28。フットプリントの小さい組み込みシステム 28。ミリ秒単位の起動時間(場合によってはJVMより95〜99%高速)を実現 4。JVMに必要なリソースのごく一部を使用 28。ウォームアップなしで即座にピークパフォーマンスを提供 18。軽量コンテナイメージにパッケージ化可能 28。必要なコードのみを含むため、攻撃対象領域を削減 28。

4.4. 制限事項と互換性

「クローズドワールド」の仮定が必要であり、動的なクラスロードは制限され、構成が必要です 33。リフレクションはメタデータを介して明示的に構成する必要があります 30。動的プロキシには、Ahead-of-Timeバイトコード生成または構成が必要です 33。JNIの使用法は構成ファイルで指定する必要があります 33。Javaシリアライゼーションには構成が必要です 33。invokedynamicバイトコードとメソッドハンドルには、クローズドワールドの仮定の下で制限があります 33。セキュリティマネージャーは常にnullを返します 33。シグナルハンドラーの登録には明示的な構成が必要な場合があります 33。クラスイニシャライザーはビルド時に初期化する必要がある場合があり、問題を引き起こす可能性があります 33。ファイナライザーは呼び出されません 33。非推奨のThread.stop()メソッドは実装されていません 33。デバッグと監視にはネイティブデバッガーとツールが必要です(JVMTIはサポートされていません) 33。ネイティブイメージへのコンパイル時間は大幅に長くなる可能性があります(単純なアプリケーションでも数分) 42。Javaエージェントとの互換性は難しい場合があります 42。コミュニティ版のGCには制限があります(G1サポートなし) 42。ビルドはプラットフォームに依存します 37。

5. 比較分析

5.1. 技術的および仕様の違い

  • JEP 483: JDK 24に統合されたJVM機能。Ahead-of-Timeでクラスをロードおよびリンクしてキャッシュに格納。トレーニング実行とキャッシュ作成ステップが必要。新しい-XX:AOT*コマンドラインオプションを使用。
  • AppCDS: JDK 10で導入されたJVM機能。解析済みのクラスバイトコードの共有アーカイブ(静的または動的)を作成。-XX:SharedArchiveFileおよび関連オプションを使用。起動時間の改善とメモリフットプリントの削減を目指す。
  • GraalVM Native Image: ネイティブ実行可能ファイルを生成するスタンドアロンのAhead-of-Timeコンパイラ。静的分析を実行。動的な機能にはメタデータが必要。native-imageツールおよび関連プラグインを使用。

JEP 483はAppCDSの進化版であり、事前ロードに加えて事前リンクに焦点を当てており、JVMのクラスローディングメカニズムと緊密に統合されています。GraalVM Native Imageは、ネイティブコードに直接コンパイルすることでより根本的なアプローチを取り、JVMのランタイム動作の多くをバイパスします。

5.2. 概念の違い

  • JEP 483: 既存のJVMフレームワーク内でクラスのロードとリンキングを事前に実行することで、JVMの起動プロセスを最適化します。
  • AppCDS: JVMプロセス間でクラスメタデータを共有することにより、冗長なロードと解析を削減し、起動を改善します。
  • GraalVM Native Image: Javaバイトコードをネイティブコードにコンパイルすることにより、実行モデルを根本的に変更し、従来のJVMを必要としないスタンドアロンの実行可能ファイルを作成します。

JEP 483とAppCDSはJVM内で動作し、その動作を最適化することを目指しています。GraalVM Native Imageは、Javaアプリケーションの代替実行パスを作成することを目指しており、一部の動的な機能をトレードオフとして、大幅なパフォーマンス向上を実現します。

5.3. パフォーマンス比較

  • JEP 483: 約40〜67%の起動時間改善が報告されています 4。
  • AppCDS: 一般的に30〜50%の起動時間改善 16。メモリフットプリントも削減します。
  • GraalVM Native Image: 最も劇的な起動時間短縮(95〜99%)を実現 4。メモリ消費量も大幅に削減し、即座にピークパフォーマンスを提供します 18。

表1: パフォーマンス比較

機能 起動時間の改善 メモリフットプリント ピークパフォーマンス ウォームアップ
JEP 483 〜40-67% わずかな影響? JVMと同様 なし
AppCDS 〜30-50% 削減 JVMと同様 なし
GraalVM Native Image 95-99% 大幅に削減 即時 なし

この表は、各技術の主要なパフォーマンス特性を簡潔かつ高レベルで比較し、読者が関連するトレードオフを迅速に把握できるようにします。

5.4. デプロイメントと構成の複雑さ

  • JEP 483: トレーニング実行とキャッシュ管理が必要。厳格な環境の一貫性要件 5。
  • AppCDS: アーカイブ作成(静的または動的)が必要。JVMバージョンとクラスパスの一貫性が重要。Quarkusなどのフレームワークでの統合により使用が簡素化 12。
  • GraalVM Native Image: 時間のかかるAhead-of-Timeコンパイルが必要。動的な機能のメタデータの管理が複雑。プラットフォームに依存するビルド 28。

JEP 483はシームレスな統合を目指していますが、一貫性の要件が運用上の複雑さを増す可能性があります。AppCDSはより長い歴史を持ち、一部のフレームワークではより優れたツールサポートがあります。GraalVM Native Imageは最も大きなメリットを提供しますが、ビルドの複雑さと制限事項という代償を伴います。

5.5. Java機能のサポートと互換性

  • JEP 483: ユーザー定義のクラスローダーと特定のJVMTIエージェントには制限あり。ZGCはまだサポートされていません 3。コード変更なしで任意のJavaアプリケーションと互換性があります 3。
  • AppCDS: 一般的にほとんどのJava機能と互換性がありますが、JVMバージョンとクラスパスの慎重な管理が必要です 15。
  • GraalVM Native Image: クローズドワールドの仮定により、動的なクラスロード、リフレクション、動的プロキシ、JNI、シリアライゼーション、およびJavaエージェントや一部のJava機能との互換性に関して大きな制限があります。多くのライブラリやフレームワークで特定の構成が必要です 28。

JEP 483は、既存のJavaアプリケーションとの互換性が最も優れているように見え、次いでAppCDSとなります。GraalVM Native Imageは、多くの場合、大幅な構成が必要であり、Javaの動的な機能に大きく依存するアプリケーションには、慎重な検討と潜在的なコード変更なしには適さない可能性があります。

6. 結論と推奨事項

6.1. 主な調査結果の概要

JEP 483は、JDK 24の新機能であり、トレーニング実行に基づいてクラスのロードとリンキングを事前に行うことで、起動時間を改善します。AppCDSはJDK 10で導入され、クラスメタデータを共有することで起動時間とメモリフットプリントを削減します。GraalVM Native Imageは、Javaコードをスタンドアロンのネイティブ実行可能ファイルにコンパイルし、起動時間、メモリ使用量、およびパフォーマンスを大幅に改善します。

6.2. 推奨事項

  • JEP 483の選択: JDK 24以降を使用しており、大幅なアプリケーション変更なしに適度な起動時間の改善を望み、トレーニング環境とランタイム環境の一貫性要件を満たせる場合に選択してください。大規模なアプリケーションやフレームワークの最適化の第一歩として適しています。
  • AppCDSの選択: JDK 10以降を使用しており、複数のJVMインスタンス間で起動時間を改善し、メモリフットプリントを削減する必要があり、JVMバージョンとクラスパスの依存関係を管理できる場合に選択してください。Native Imageよりも制限が少なく、メリットのバランスが取れています。Quarkusなどのフレームワークでは統合が簡素化されています。
  • GraalVM Native Imageの選択: 最も劇的な起動時間の短縮が必要であり、厳しいリソース制約がある場合(例:サーバーレス、マイクロサービス)に選択してください。動的なJava機能との互換性の問題や、慎重な構成とテストの必要性を理解しておく必要があります。ビルドプロセスはより複雑で時間がかかる可能性があります。

6.3. トレードオフの強調

選択は、アプリケーションの特定のニーズと制約、デプロイメント環境、および許容できる複雑さと潜在的な互換性のリスクに依存することを強調します。

6.4. テストの重要性

期待されるパフォーマンス向上を検証し、予期しない問題を特定するために、ターゲット環境で各技術を徹底的にテストすることを推奨します。

Works cited

  1. Oracle Releases Java 24, accessed March 19, 2025, https://www.oracle.com/news/announcement/oracle-releases-java-24-2025-03-18/
  2. Java 24 Delivers New Experimental and Many Final Features - InfoQ, accessed March 19, 2025, https://www.infoq.com/news/2025/03/java24-released/
  3. Inside JDK 24: Understanding Ahead-of-Time Class Loading & Linking, accessed March 19, 2025, https://softwaremill.com/inside-jdk-24-understanding-ahead-of-time-class-loading-and-linking/
  4. Java 24 Launches with JEP 483 for Enhanced Application Performance and Future Plans for 2025 - DEV Community, accessed March 19, 2025, https://dev.to/ssojet/java-24-launches-with-jep-483-for-enhanced-application-performance-and-future-plans-for-2025-588e
  5. What′s new in Java 24 - PVS-Studio, accessed March 19, 2025, https://pvs-studio.com/en/blog/posts/java/1233/
  6. JEP 483: Ahead-of-Time Class Loading & Linking. Project Leyden in JDK 24 - YouTube, accessed March 19, 2025, https://www.youtube.com/watch?v=7--d5ITE2QY
  7. JEP 483: Ahead-of-Time Class Loading & Linking. Project Leyden in JDK 24 - BellSoft, accessed March 19, 2025, https://bell-sw.com/videos/jep-483-ahead-of-time-class-loading-linking-project-leyden-in-jdk-24/
  8. JEP 483: Ahead-of-Time Class Loading & Linking - OpenJDK, accessed March 19, 2025, https://openjdk.org/jeps/483
  9. JEP 483: Ahead-of-Time Class Loading & Linking #jdk24 #JEP #java - YouTube, accessed March 19, 2025, https://www.youtube.com/watch?v=BRyhHFqcYok
  10. Java 24 Rolls Out Today! Find Out Why It's Aptly Named - Foojay.io, accessed March 19, 2025, https://foojay.io/today/java-24-rolls-out-today-find-out-why-its-aptly-named/
  11. Project Leyden Ships Third Option for Faster Application Start with JEP 483 in Java 24, accessed March 19, 2025, https://www.infoq.com/news/2025/03/java-24-leyden-ships/
  12. JEP 310: Application Class-Data Sharing - OpenJDK, accessed March 19, 2025, https://openjdk.org/jeps/310
  13. CDS and AppCDS in Hotspot - Dev.java, accessed March 19, 2025, https://dev.java/learn/jvm/cds-appcds/
  14. JEP 483: Ahead-of-Time Class Loading and Linking | Hacker News, accessed March 19, 2025, https://news.ycombinator.com/item?id=42481813
  15. AppCDS - Quarkus, accessed March 19, 2025, https://quarkus.io/guides/appcds
  16. Speed up Java application startup time with AppCDS - Red Hat Developer, accessed March 19, 2025, https://developers.redhat.com/articles/2024/01/23/speed-java-application-startup-time-appcds
  17. 4 Class Data Sharing - Java - Oracle Help Center, accessed March 19, 2025, https://docs.oracle.com/en/java/javase/17/vm/class-data-sharing.html
  18. How to reduce Java application startup time - BellSoft, accessed March 19, 2025, https://bell-sw.com/blog/how-to-reduce-java-application-startup-time/
  19. Java 10 - Class-Data sharing - TutorialsPoint, accessed March 19, 2025, https://www.tutorialspoint.com/java/java10_class_data_sharing.htm
  20. Application / Dynamic Class Data Sharing In HotSpot JVM – Ionut ..., accessed March 19, 2025, https://ionutbalosin.com/2022/04/application-dynamic-class-data-sharing-in-hotspot-jvm/
  21. How to Improve JVM-Based Application Startup Time? - SoftwareMill, accessed March 19, 2025, https://softwaremill.com/how-to-improve-jvm-based-application-startup-time/
  22. OpenJDKの概要とJava Platform Standard Editionにおける役割 - 株式会社一創, accessed March 19, 2025, https://www.issoh.co.jp/tech/details/3971/
  23. クラス・データ共有, accessed March 19, 2025, https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/class-data-sharing.html
  24. Reducing Java Startup Time: 4 Approaches - BellSoft, accessed March 19, 2025, https://bell-sw.com/videos/reducing-java-startup-time-4-approaches/
  25. JEP 483: Ahead-of-Time Class Loading & Linking : r/java - Reddit, accessed March 19, 2025, https://www.reddit.com/r/java/comments/1ekk9ut/jep_483_aheadoftime_class_loading_linking/
  26. Optimizing Java Performance. Java has long been a fundamental pillar… | by kiarash shamaii | Medium, accessed March 19, 2025, https://medium.com/@kiarash.shamaii/optimizing-java-performance-42919a64a989
  27. How to optimize Java startup and runtime performance - Pluralsight, accessed March 19, 2025, https://www.pluralsight.com/resources/blog/software-development/optimize-java-startup-runtime-performance
  28. Native Image - GraalVM, accessed March 19, 2025, https://www.graalvm.org/latest/reference-manual/native-image/
  29. GraalVM Native Image Quick Start - Oracle Help Center, accessed March 19, 2025, https://docs.oracle.com/en/learn/graalvm-native-image-quick-start/index.html
  30. Introducing GraalVM Native Images :: Spring Boot, accessed March 19, 2025, https://docs.spring.io/spring-boot/reference/packaging/native-image/introducing-graalvm-native-images.html
  31. Native Image - Oracle Help Center, accessed March 19, 2025, https://docs.oracle.com/en/graalvm/jdk/23/docs/reference-manual/native-image/
  32. GraalVM Native Image, accessed March 19, 2025, https://www.graalvm.org/22.3/reference-manual/native-image/
  33. Native Image Compatibility and Optimization Guide - GraalVM, accessed March 19, 2025, https://www.graalvm.org/22.0/reference-manual/native-image/Limitations/
  34. Native Image Compatibility Guide - GraalVM, accessed March 19, 2025, https://www.graalvm.org/latest/reference-manual/native-image/metadata/Compatibility/
  35. Native Image Compatibility Guide - Oracle Help Center, accessed March 19, 2025, https://docs.oracle.com/en/graalvm/jdk/23/docs/reference-manual/native-image/metadata/Compatibility/
  36. Working with Native Image efficiently | graalvm - Medium, accessed March 19, 2025, https://medium.com/graalvm/working-with-native-image-efficiently-c512ccdcd61b
  37. AWS CRT Client for Java adds GraalVM Native Image support | AWS Developer Tools Blog, accessed March 19, 2025, https://aws.amazon.com/blogs/developer/aws-crt-client-for-java-adds-graalvm-native-image-support/
  38. Building native images and compiling with GraalVM and sbt - vandebron.tech, accessed March 19, 2025, https://www.vandebron.tech/blog/building-native-images-and-compiling-with-graalvm-and-sbt
  39. GraalVM Native Image: Benefits, Challenges, and the Future By Shaun Smith, Thomas Wuerthinger, Séba - YouTube, accessed March 19, 2025, https://www.youtube.com/watch?v=isr44p7eplQ
  40. Javaに革命を起こすGraalVM Native Image - InfoQ, accessed March 19, 2025, https://www.infoq.com/jp/articles/native-java-graalvm/
  41. GraalVM Native ImageとOracle Functionsで爆速Java - Cloudii(クラウディ), accessed March 19, 2025, https://cloudii.jp/news/blog/oracle-cloud/20191207-1575649062/
  42. Is GraalVM the Go-To Choice? : r/java - Reddit, accessed March 19, 2025, https://www.reddit.com/r/java/comments/1gil2lb/is_graalvm_the_goto_choice/
  43. Quarkus, jlink and Application Class Data Sharing (AppCDS) | Loic's Blog, accessed March 19, 2025, https://www.loicmathieu.fr/wordpress/en/informatique/quarkus-jlink-et-application-class-data-sharing-appcds/
  44. Benchmarking Web Services using GraalVM Native Image - Inner Product, accessed March 19, 2025, https://www.inner-product.com/posts/benchmarking-graalvm-native-image/
  45. 4 Class Data Sharing - Java - Oracle Help Center, accessed March 19, 2025, https://docs.oracle.com/en/java/javase/21/vm/class-data-sharing.html
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment