CDS

クラスデータ共有 (CDS) は、Java アプリケーションの起動時間とメモリフットプリントの削減に役立つ JVM 機能 [Oracle] です。

この機能を使用するには、アプリケーションの特定のクラスパスに対して CDS アーカイブを作成する必要があります。Spring Framework は、アーカイブの作成を容易にするフックポイントを提供します。アーカイブが利用可能になったら、ユーザーは JVM フラグを介してアーカイブの使用をオプトインする必要があります。

CDS アーカイブの作成

アプリケーションの CDS アーカイブは、アプリケーションの終了時に作成できます。Spring Framework は、ApplicationContext がリフレッシュされるとプロセスが自動的に終了できる動作モードを提供します。このモードでは、すべての非遅延初期化シングルトンがインスタンス化され、InitializingBean#afterPropertiesSet コールバックが呼び出されています。ただし、ライフサイクルは開始されておらず、ContextRefreshedEvent はまだ公開されていません。

アーカイブを作成するには、2 つの追加の JVM フラグを指定する必要があります。

  • -XX:ArchiveClassesAtExit=application.jsa: 終了時に CDS アーカイブを作成します

  • -Dspring.context.exit=onRefresh: 前述のように、Spring アプリケーションが開始され、すぐに終了します。

CDS アーカイブを作成するには、JDK/JRE にベースイメージが必要です。起動スクリプトに上記のフラグを追加すると、次のような警告が表示される場合があります。

-XX:ArchiveClassesAtExit is unsupported when base CDS archive is not loaded. Run with -Xlog:cds for more info.

ベース CDS アーカイブは通常、すぐに使用できる状態で提供されますが、必要に応じて次のコマンドを発行して作成することもできます。

$ java -Xshare:dump

アーカイブの使用

アーカイブが利用可能になったら、作業ディレクトリに application.jsa ファイルがあるものとして、起動スクリプトに -XX:SharedArchiveFile=application.jsa を追加して使用します。

CDS キャッシュが有効かどうかを確認するには、CDS を有効にできない場合にエラーメッセージを出力して終了する -Xshare:on を使用できます (テスト目的のみで、本番環境では使用しないでください)。

キャッシュの効果を確認するには、追加の属性 -Xlog:class+load:file=cds.log を追加してクラス読み込みログを有効にします。これにより、クラスとそのソースをロードしようとするたびに cds.log が作成されます。次の例に示すように、キャッシュからロードされるクラスには「共有オブジェクトファイル」ソースが必要です。

[0.064s][info][class,load] org.springframework.core.env.EnvironmentCapable source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.BeanFactory source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.ListableBeanFactory source: shared objects file (top)
[0.064s][info][class,load] org.springframework.beans.factory.HierarchicalBeanFactory source: shared objects file (top)
[0.065s][info][class,load] org.springframework.context.MessageSource source: shared objects file (top)

CDS を有効にできない場合、またはキャッシュからロードされないクラスが多数ある場合は、アーカイブを作成して使用するときに次の条件が満たされていることを確認してください。

  • まったく同じ JVM を使用する必要があります。

  • クラスパスは JAR のリストとして指定する必要があり、ディレクトリと * ワイルドカード文字の使用は避けてください。

  • JAR のタイムスタンプは保持する必要があります。

  • アーカイブを使用する場合、クラスパスはアーカイブの作成に使用されたクラスパスと同じで、順序も同じである必要があります。追加の JAR またはディレクトリは最後に指定できます (ただし、キャッシュされません)。