この章では、Javaアプリケーションの起動時間とメモリー・フットプリントを減らすのに役立つクラス・データ共有(CDS)機能について説明します。
クラス・データ共有(CDS)は、複数のJava仮想マシン(JVM)間のデータを動的に共有できるようにします。これにより、起動時間とメモリー・フットプリントを減らすことができます。
インストーラを使用してJREをインストールすると、インストーラがシステムJava Archive (JAR)ファイルから一連のクラスをprivate内部表現にロードして、その表現を共有アーカイブと呼ばれるファイルにダンプします。JREインストーラを使用していない場合は、共有アーカイブを手動で生成できます。
JVMを開始すると、共有アーカイブがメモリー・マッピングされ、これらのクラス用の読取り専用のJVMメタデータを複数のJVM処理で共有できます。共有アーカイブの復元はクラスのロードより速いため、起動時間が短縮され、コストを節約できます。
クラス・データ共有は、G1、シリアル、パラレルおよびparallelOldGCガベージ・コレクタでサポートされています。共有文字列機能(クラス・データ共有の一部)では、64ビットの非Windowsプラットフォーム上のG1ガベージ・コレクタのみがサポートされています。
CDSをJava SEに含める主要な動機は、起動時間の短縮です。使用するコア・クラスの数に比べてアプリケーションが小さいほど、起動時間の節約比率が大きくなります。
同一のホスト上の共有アーカイブの一部が読取り専用としてマップされ、複数のJVM処理で共有されます。それ以外の場合、このデータは各JVMインスタンス内でレプリケートされる必要があるため、アプリケーションの起動時間が長くなります。
共有アーカイブに、Java Hotspot VMが使用できる形式でクラス・データが格納されます。それ以外の場合はランタイム・モジュラ・イメージの元のクラス情報にアクセスするためにメモリーが必要になりますが、この場合は必要ありません。これらの節約により、同じシステム上でより多くのアプリケーションを同時に実行できます。Windowsアプリケーションでは、処理フットプリント(様々なツールで測定)が増えたように見える場合があります。これは、処理のアドレス空間にマッピングされるページが増えるためです。これは、ランタイム・モジュラ・イメージに対して保持する必要があるメモリーの量(Windows内)が減ることによって相殺されます。フットプリントの削減は、依然として優先度の高い課題です。
サポートされているすべてのプラットフォームに対して共有アーカイブを再生成できます。
デフォルトのクラス・リストには、コア・ライブラリ・クラスの小さなセットのみが含まれます。共有アーカイブに他のクラスを含めることもできます。追跡出力をロードしているクラスまたはアプリケーションを実行しているクラスからクラス・リストを作成するには、次のコマンドを入力して、ロードされたすべてのライブラリ・クラスをダンプします。
java -XX:DumpLoadedClassList=<class_list_file>
共有アーカイブを生成するには、プロファイリングに基づいて作成されたクラス・リストを使用する必要があります。
アーカイブ・ファイルは、JVMの共有ライブラリとともに次の場所にあります。
Solaris、LinuxおよびmacOSプラットフォームの場合、共有アーカイブは/lib/[arch]/server/classes.jsa
に格納されます
Windowsプラットフォームの場合、共有アーカイブは/bin/server/classes.jsa
に格納されます
アーカイブ・ファイルが存在する場合、新しいアーカイブ・ファイルを生成すると、既存のファイルが上書きされます。新しいアーカイブを生成する前に古いアーカイブを手動で削除する必要はありません。
アーカイブ・ファイルを再生成するには、管理者としてログインします。ネットワークに接続している場合は、Java SEインストールと同じアーキテクチャのコンピュータにログオンします。インストール・ディレクトリに対する書込み権限を持っていることを確認してください。
ユーザー定義のクラス・リストを使用して共有アーカイブを再生成するには、次のコマンドを入力します。
java -XX:SharedClassListFile=<class_list_file> -Xshare:dump
アーカイブが生成されると、診断情報が出力されます。