4 クラス・データ共有
この章では、Javaアプリケーションの起動時間とメモリー・フットプリントの削減に役立つクラス・データ共有(CDS)機能について説明します。
トピック:
クラス・データ共有
クラス・データ共有(CDS)機能は、複数のJava仮想マシン(JVM)間の起動時間とメモリー・フットプリントの削減に役立ちます。
JDK 12以降、デフォルトCDSアーカイブはOracle JDKバイナリに事前パッケージ済です。
デフォルトでは、デフォルトCDSアーカイブは実行時に有効化されます。デフォルトの共有アーカイブを無効化するには、-Xshare:off
を指定します。
JVMを開始すると、共有アーカイブがメモリー・マッピングされ、これらのクラス用の読取り専用のJVMメタデータを複数のJVM処理で共有できます。共有アーカイブへのアクセスは、クラスのロードよりも高速であるため、起動時間が短縮されます。
クラス・データ共有は、ZGC、G1、シリアルおよびパラレル・ガベージ・コレクタでサポートされています。
CDSをJava SEに含める主要な動機は、起動時間の短縮です。使用するコア・クラスの数に比べてアプリケーションが小さいほど、起動時間の節約比率が大きくなります。
-
同一のホスト上の共有アーカイブの一部が読取り専用としてマップされ、複数のJVM処理で共有されます。それ以外の場合、このデータは各JVMインスタンス内でレプリケートされる必要があるため、アプリケーションの起動時間が長くなります。
-
共有アーカイブに、Java Hotspot VMが使用できる形式でクラス・データが格納されます。他の場合はランタイム・モジュラ・イメージの元のクラス情報にアクセスするためにメモリーが必要になりますが、この場合は使用されません。これらのメモリーの節約により、同じシステム上でより多くのアプリケーションを同時に実行できます。Windowsアプリケーションでは、プロセスのメモリー・フットプリント(様々なツールで測定)が増えたように見える場合があります。これは、プロセスのアドレス空間にマッピングされるページが増えるためです。この増加は、ランタイム・モジュラ・イメージに対して保持する必要があるメモリーの量(Windows内)が減ることによって相殺されます。フットプリントの削減は、依然として優先度の高い課題です。
アプリケーション・クラス・データ共有
起動時間およびフットプリントをさらに削減するために、アプリケーション・クラス・パスからの選択済クラスを含めるようにCDS拡張する、アプリケーション・クラス・データ共有(AppCDS)が導入されました。
この機能により、アプリケーション・クラスを共有ドライブに配置できます。共通のクラス・メタデータは、異なるJavaプロセスで共有されます。AppCDSにより、組込みシステム・クラス・ローダー、組込みプラットフォーム・クラス・ローダーおよびカスタム・クラス・ローダーで、アーカイブ済のクラスをロードできるようになります。複数のJVMが同じアーカイブ・ファイルを共有している場合、メモリーは保存され、システムの全体的なレスポンス時間が向上します。
Java Development Kitツール仕様のアプリケーション・クラス・データ共有に関する項を参照してください。
手動によるクラス・データ共有の制御
クラス・データ共有はデフォルトで有効になっています。この機能は手動で有効と無効を切り替えることができます。
診断およびデバッグのために、次のコマンドライン・オプションを使用できます。
-
-Xshare:off
- クラス・データ共有を無効にする場合。
-
-Xshare:on
- クラス・データ共有を有効にする場合。クラス・データ共有を有効にできない場合は、エラー・メッセージを出力して終了します。
ノート:
-Xshare:on
は、テスト目的でのみ使用します。CDSアーカイブを使用できない場合(たとえば、特定のVMパラメータが変更された場合や、別のJDKが使用されている場合)、起動時にVMが予期せず終了することがあります。このオプションは、本番環境では使用しないでください。 -
-Xshare:auto
- クラス・データ共有をデフォルトで有効にする場合。可能な場合は常にクラス・データ共有を有効にします。
詳細は、Java Development Kitツール仕様のCDSアーカイブの使用に関する項を参照してください。