原文はこちら。
The original article was written by Sébastien Deleuze (Spring Framework committer, Broadcom).
https://spring.io/blog/2023/12/04/cds-with-spring-framework-6-1
Runtime efficiency with Springというブログエントリのフォローアップとして、Project Leydenの最適化の調査により、JDKでほとんど使用されていないCDS (“Class Data Sharing”) 機能に関するいくつかの興味深い発見につながり、Spring Framework 6.1で提供できる新機能に具体化されたことをご紹介します。
Runtime efficiency with Spring
https://spring.io/blog/2023/10/16/runtime-efficiency-with-spring
公式ドキュメントに記載されているように、Class Data Sharing (CDS) は、クラス・メタデータをアーカイブ・ファイルにキャッシュして、新しく起動されたJVMにすばやく事前ロードできるようにすることで、JVMの起動時間とメモリー・フットプリントを削減します。これにより、クラスのロードが高速化され、起動時間に大きく影響します。
Class Data Sharing
https://docs.oracle.com/en/java/javase/21/vm/class-data-sharing.html#GUID-7EAA3411-8CF0-4D19-BD05-DF5E1780AA91
デフォルトCDSアーカイブは、一般的なJDKクラスのメタデータを格納するために、最新のJDKディストリビューションにあらかじめパッケージ化されています。カスタマイズしたCDSアーカイブを作成し、アプリケーションのクラスロードを高速化することもできます。
GraalVMネイティブイメージとProject CRaCのいずれであっても、Spring Bootアプリケーションを数十ミリ秒で開始できます。
GraalVM Native Image Support
https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html#native-image
Deploying Spring Boot Applications
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment.efficient.checkpoint-restore
では、なぜCDSを気にする必要があるのでしょうか?私たちは主に3つの理由に気をつけるべきだと思います。
- OpenJDKメインラインの成熟した実稼働対応テクノロジで非常に親しみやすいもので、GraalVMやProject CRaCよりも制約や副作用が少ない。
- Brian GoetzはDevoxxでのProject Leydenのセッションで「ほとんどの人は現在CDSを使用していませんが、比較的少ない作業でスタートアップを合理的に改善できるので、使用すべきでしょう」 と述べている。
- このテクノロジは新しいJVMリリースのたびに改善され続けており、Project Leydenは近い将来、さらに多くの利点を追加することを目指している。
CDSによってSpringアプリケーションにもたらされるものは何なのでしょうか?
Initial CDS support introduced in Spring Framework 6.1
Spring Framework 6.1には、アプリケーションを最適化するための2段階のプロセスを説明する新しいClass Data Sharingの章があります。
Class Data Sharing
https://docs.spring.io/spring-framework/reference/integration/class-data-sharing.html
-Dspring.context.exit=onRefreshという新たなJVMシステム・プロパティのおかげで、トレーニング実行によるCDSアーカイブの作成は可能です。これにより、ほとんどのユース・ケースでBeanの起動やリモート・サービスへのアクセスが不要になります。- アーカイブを使用して本番環境での起動を最適化します。
CDSを使った最適化を完全に効果のあるものにするには、アーカイブを作成してアプリケーションを起動するコマンドで使用されるJDKとクラスパスが同一であることを確認してください。クラスを効率的にキャッシュするには、次の点にも注意してください。
- クラスパスは、ネストされていない通常のJARのリストとして指定する必要があります。
- ディレクトリの使用は避けてください。
- ワイルドカード(
*)の利用は避けてください。
Spring Bootの実行可能JARまたはドキュメント化されたunpackedデプロイメント(JARを展開したもの)は、現時点ではこれらの条件をすべて満たしていないため、最適なCDSパフォーマンスを実現できていません。
Efficient deployments
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment.efficient
そのため、より統合的にCDSをサポートするためにSpring Bootで何が行われるかを想定せずに、関連するデータポイントを取得し、Spring開発者がCDSサポートを調査する方法を提供できるように、Stéphane Nicollと協力してCDSフレンドリーなunpackedデプロイメントに取り組んでいます。詳細については、関連するIssue(spring-boot#38276)をご覧ください。
Investigate automatic CDS support · Issue #34115
https://github.com/spring-projects/spring-boot/issues/34115
Improve exploded structure experience for efficient deployments · Issue #38276
https://github.com/spring-projects/spring-boot/issues/38276
アプリケーションでCDSを使用してフィードバックを提供する場合は、spring-cds-demoリポジトリからインスピレーションを得られるかもしれません。このリポジトリには、Spring Bootの実行可能JARを最適なCDSパフォーマンスで展開する自己完結型のunpack-executable-jar.shスクリプトを含まれています。
Demonstrate how to use Spring Framework 6.1 CDS support
https://github.com/sdeleuze/spring-cds-demo
unpack-executable-jar.sh
https://github.com/sdeleuze/spring-cds-demo/blob/main/unpack-executable-jar.sh
また、Stéphaneが作成した優れたcds-log-parserツールを使用して、どのクラスがCDSキャッシュからロードされたかを表すレポートを生成できます。
CDS Log Parser
https://github.com/snicoll/cds-log-parser
CDS data points with Spring Petclinic
Java 21上で実行、オプションでSpring AOT最適化と組み合わせ、CDS最適化を施した、有名なSpring Petclinicアプリケーションでのデータからの学びを見ていきましょう。
Spring PetClinic Sample Application built with Spring Data JDBC
https://github.com/sdeleuze/spring-petclinic-data-jdbc/tree/cds

まず第1に、CDSとは関係なくすでによく知られていてドキュメントにもありますが、強調しておくべきことでしょう。
Spring Bootアプリケーションの本番デプロイメントは、最適な起動時間のために展開しておく(unpack) べきである
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment.efficient
Buildpacksを使用している場合はすでにunpacked済みですが、そうでない場合は、カスタムデプロイメントをチェックして調整することをお勧めします。
数十MBのCDSアーカイブを作成してアプリケーションに付加して配布する、というほんのわずかな制約はあるにせよ、CDS最適化により、unpackedデプロイメントと比較して起動時間が30%から35%ほど短縮されます。もちろん、GraalVMやProject CRaCほど劇的なメリットはありませんが、このメリットを得るために多くの作業を行う必要もありません。したがって、適切に統合されると、CDSは広く普及する大きな可能性を秘めています。CDSとSpring AOTの最適化を組み合わせると、Petclinicの起動時間を36%から42%ほど短縮できます。
Conclusion
いつものように、私たちはSpringコミュニティからのフィードバックを求めています。そのフィードバックで、より統合されたエクスペリエンスのための潜在的な次のステップのアイデアが出てくるのです。例えば、CDSキャッシュを使用してSpring Bootに最適化されたコンテナを自動ビルドする機能に興味がありますか?
より将来的な展望については、Springチームは引き続きJavaプラットフォームチームと協力して、Project Leydenのpremain最適化でこれらの改善点と発見をどのように活用できるかを検討し、Spring開発者と運用者の制約を可能な限り減らしながら、JVM上のランタイム効率の観点から可能なことの限界を押し広げていきます。
A glimpse into OpenJDK’s future with Spring AOT and Project Leyden
https://spring.io/blog/2023/10/16/runtime-efficiency-with-spring#a-glimpse-into-openjdks-future-with-spring-aot-and-project-leyden