この章では、Javaアプリケーションの起動時間とメモリー・フットプリントの削減に役立つクラス・データ共有(CDS)機能について説明します。
クラス・データ共有(CDS)機能は、複数のJava仮想マシン(JVM)間の起動時間とメモリー・フットプリントの削減に役立ちます。
インストーラを使用してOracle Java Runtime Environment (JRE)をインストールすると、インストーラがシステムJava Archive (JAR)ファイルからデフォルトのクラスのセットをprivate内部表現にロードして、その表現を共有アーカイブと呼ばれるファイルにダンプします。JREインストーラを使用していない場合は、共有アーカイブを手動で生成できます。
JVMを開始すると、共有アーカイブがメモリー・マッピングされ、これらのクラス用の読取り専用のJVMメタデータを複数のJVM処理で共有できます。共有アーカイブへのアクセスは、クラスのロードよりも高速であるため、起動時間が短縮されます。
クラス・データ共有は、G1、シリアル、パラレルおよびparallelOldGCガベージ・コレクタでサポートされています。共有文字列機能(クラス・データ共有の一部)では、64ビットの非Windowsプラットフォーム上のG1ガベージ・コレクタのみがサポートされています。
CDSをJava SEに含める主要な動機は、起動時間の短縮です。使用するコア・クラスの数に比べてアプリケーションが小さいほど、起動時間の節約比率が大きくなります。
同一のホスト上の共有アーカイブの一部が読取り専用としてマップされ、複数のJVM処理で共有されます。それ以外の場合、このデータは各JVMインスタンス内でレプリケートされる必要があるため、アプリケーションの起動時間が長くなります。
共有アーカイブに、Java Hotspot VMが使用できる形式でクラス・データが格納されます。他の場合はランタイム・モジュラ・イメージの元のクラス情報にアクセスするためにメモリーが必要になりますが、この場合は使用されません。これらのメモリーの節約により、同じシステム上でより多くのアプリケーションを同時に実行できます。Windowsアプリケーションでは、プロセスのメモリー・フットプリント(様々なツールで測定)が増えたように見える場合があります。これは、プロセスのアドレス空間にマッピングされるページが増えるためです。この増加は、ランタイム・モジュラ・イメージに対して保持する必要があるメモリーの量(Windows内)が減ることによって相殺されます。フットプリントの削減は、依然として優先度の高い課題です。
起動時間およびフットプリントをさらに削減するために、アプリケーション・クラス・パスからの選択済クラスを含めるようにCDS拡張する、アプリケーション・クラス・データ共有(ApsCDS)が導入されました。
この機能により、アプリケーション・クラスを共有ドライブに配置できます。共通のクラス・メタデータは、異なるJavaプロセスで共有されます。AppCDSにより、組込みシステム・クラス・ローダー、組込みプラットフォーム・クラス・ローダーおよびカスタム・クラス・ローダーで、アーカイブ済のクラスをロードできるようになります。複数のJVMが同じアーカイブ・ファイルを共有している場合、メモリーは保存され、システムの全体的なレスポンス時間が向上します。
Java Platform, Standard Editionツール・リファレンスでアプリケーション・クラス・データ共有を参照してください。
サポートされているすべてのプラットフォームに対して共有アーカイブを再生成できます。
JREとともにインストールされるデフォルト・クラスには、コア・ライブラリ・クラスの小さいセットのみが含まれます。共有アーカイブに他のクラスを含めることもできます。追跡出力をロードしているクラスまたはアプリケーションを実行しているクラスからクラス・リストを作成するには、次のコマンドを入力して、ロードされたすべてのライブラリ・クラスをダンプします。
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
アーカイブが生成されると、診断情報が出力されます。