クラスデータの共有

概要

クラスデータの共有 (CDS) は、J2SE 5.0 の新機能で、Java プログラミング言語アプリケーション、特に小さなアプリケーションの起動時間を短縮すること、また占有スペースを少なくすることを目的としています。Sun の提供するインストールプログラムを使用して 32 ビット のプラットフォームに JRE をインストールすると、インストールプログラムがシステムの jar ファイルから一連のクラスを専用の内部表現にロードして、その表現を「共有アーカイブ」と呼ばれるファイルにダンプします。クラスデータの共有は Microsoft Windows 95/98/Me ではサポートされていません。Sun の JRE インストールプログラムを使用しない場合は、以下で説明するように、この作業を手動で行うこともできます。続いて行われる JVM 呼び出しの間に、共有アーカイブがメモリマッピングされて、これらのクラスをロードするコストが削減されます。また、これらのクラスの JVM のメタデータの多くが、複数の JVM 処理で共有できるようになります。

J2SE 5.0 では、クラスデータの共有がサポートされているのは、Java HotSpot Client VM で、かつシリアルガベージコレクタ使用の際のみです。

CDS を 5.0 リリースに含める主要な目的は、CDS による起動時間の短縮です。CDS では、特定のコアクラスをロードするという固定のコストがなくなるため、小さなアプリケーションのほうがより良い結果が得られます。アプリケーションが小さいほど、使用するコアクラスの数が少なくなり、節約される起動時間の割合が大きくなります。

新規のJVM インスタンスの占有スペースのコストは、2 つの方法で削減されました。まず、現在は 5 から 6 M バイトを占める共有アーカイブ部分が、マップの読み取り専用になり、複数の JVM 処理で共有されるようになります。これまでは、このデータは各 JVM インタフェースで複製されていました。また、共有アーカイブには Java Hotspot VM が使用する形でクラスデータが含まれています。これにより、rt.jar 内の元のクラス情報にアクセスするために使われていたメモリが必要なくなりました。これらの節減により、同じマシン上でさらに多くのアプリケーションを同時に実行できるようになります。Microsoft Windows については、さまざまなツールで測定されるように、処理の占有スペースが増えたように見える場合があります。これは、処理用のアドレススペースに大量のページがマッピングされるためです。これは、rt.jar で一部を保持するために必要とされるメモリ量 (Microsoft Windows 内) が削減されることで相殺されます。占有スペースの削減は優先度の高い課題です。

共有アーカイブの再生成

状況によっては、システム管理者が共有アーカイブを手動で再生成する必要があります。通常、この作業が必要なのは Solaris だけで、インストールを実行するマシンとは異なるアーキテクチャのマシンに、ネットワーク経由で J2SE パッケージがインストールされた場合のみです。これに関係なく、ここで取り上げる再生成に関する説明は、サポートされているすべてのプラットフォームに当てはまります。

共有アーカイブファイルは、JVM の共有ライブラリと同じ場所にあります。Unix プラットフォームでは、jre/lib/[arch]/client/classes.jsa に格納され、Microsoft Windows プラットフォームでは jre/bin/client/classes.jsa に格納されます。このファイルがある場合は、再生成を行う前に手動で削除する必要があります。

アーカイブを再生成するには、まず管理者としてログインします。ネットワークに接続した状態で、J2SE のインストールと同じアーキテクチャのマシンにログインし、インストールディレクトリに書き込み可能なアクセス権があることを確認します。次のコマンドを実行します。

java -Xshare:dump
アーカイブが生成されると、診断情報が出力されます。

手動によるクラスデータの共有の制御

クラスデータの共有機能は、使用できる条件が整えば自動的に有効になります。次に示すコマンド行オプションは、主に診断とデバッグを行うためのものです。今後のリリースで変更、または削除される可能性があります。

-Xshare:off
クラスデータの共有を無効にします。
-Xshare:on
クラスデータの共有を有効にする必要があります。様々な理由で有効にできない場合は、エラーメッセージを出力して終了します。
-Xshare:auto
デフォルトでは、可能な場合はいつでもクラスデータの共有を有効にします。