2.13 Java共有クラスのIBMテクノロジ
IBM Technology for Java SDKでのクラス共有によって、ロードされたすべてのクラス(アプリケーション・クラスとシステム・クラスの両方)を共有し、クラス・データを共有しているJVMに制限を設けない、透過的かつ動的な方法が提供されます(実行時のバイトコード修正が使用される場合を除く)。
複数のJVM間でアプリケーションのすべての不変クラス・データを共有すると、明確なメリットがあります。
· 複数のJVMインスタンスの使用が有意義な場合に仮想メモリーのフットプリントが軽減されます。
· 投入されたキャッシュからクラスをロードする方がディスクからクラスをロードするよりも高速です。これは、クラスがすでにメモリー内にあり、部分的に検証されているためです。
したがって、クラスを共有すると、類似のタスクを実行する新しいJVMインスタンスを定期的に開始するアプリケーションにとってもメリットがあります。
1つのJVMで空のキャッシュを投入するコストが最小限で済みます。複数のJVMでキャッシュを同時に投入する場合、通常、両方のJVMでディスクからクラスをロードするよりもこのアクティビティの方が高速です。
IBMのクラス共有機能に関する重要点は以下のとおりです。
· クラスは指定のクラス・キャッシュに保管されます。このクラス・キャッシュは、メモリーマップ・ファイル、またはキャッシュを使用する必要がある最初のJVMで割り当てられる共有メモリーの領域になります。
· すべてのJVMはキャッシュからの読み込みを行い、キャッシュを更新できますが、JVMに一度に接続できるキャッシュは1つだけです。
· キャッシュは、そのキャッシュに接続されたJVMの有効期間が過ぎても存続します。これは明示的に消去されるまで、あるいはオペレーティング・システムが停止するまで持続します。
· JVMがクラスをロードする場合、最初に接続されているキャッシュ内のクラスを探し、必要なクラスが見つかればキャッシュからそのクラスをロードします。
· キャッシュ内にクラスが見つからない場合、ディスクからクラスをロードし、そのクラスを適宜キャッシュに追加します。
· キャッシュがいっぱいの場合は、キャッシュ内のクラスを引き続き共有できますが、新しいデータは追加できません。
· クラス・キャッシュは、キャッシュに接続されているJVMの有効期間を過ぎても存続するため、ファイル・システム上のクラスに変更が加えられた場合、キャッシュ内の一部のクラスは無効に(古く)なります。この状況は透過的に管理されます。つまり、更新されたバージョンのクラスがクラスをロードする次のJVMで検出され、クラス・キャッシュは適宜更新されます。
· 実行時に修正されるバイトコードの共有はサポートされますが、注意して使用する必要があります。
· クラス・データ・キャッシュへのアクセスは、セキュリティ・マネージャーがインストールされている場合、Java権限で保護されます。
· リフレクションで生成されたクラスは共有できません。
· 共有できるのは、変更していないクラス・データのみです。リソース、オブジェクト、JITコンパイル済みコード、および同様の項目をキャッシュに保管することはできません。
共有クラスの作成
共有クラスを切り替えるには、SystemDefault.properties -Xshareclassesオプションと-Xscmx command-lineオプションを使用します。
-Xscmx<サイズ>はキャッシュ・サイズを指定します。このオプションは、キャッシュが作成され、同じ名前のキャッシュが存在しない場合にのみ適用されます。省略値のキャッシュ・サイズはプラットフォームに依存します。使用されるサイズ値を確認するには、-verbose:sizesをコマンド行引数として追加します。最小キャッシュ・サイズは4KBです。最大キャッシュ・サイズはプラットフォームに依存します。
指定できるキャッシュ・サイズは、システムで使用可能な物理メモリーとページング・スペースで制限されます。プロセスの仮想アドレス・スペースは共有クラス・キャッシュとJavaヒープ間で共有されるため、Javaヒープの最大サイズを増やすと、作成可能な共有クラス・キャッシュのサイズは減少します。
-Xshareclasses:<サブオプション>はクラス共有を有効にします。多くのサブオプションを取り、その一部はキャッシュ・ユーティリティになります。キャッシュ・ユーティリティは、VMを開始せずに指定したキャッシュに対して必要な操作を行います。複数のサブオプションをコンマで区切って組み合わせることができますが、キャッシュ・ユーティリティは相互排他になります。
#AllowOptions
-Xscmx16M
-Xshareclasses:name=myJSM
共有クラスのリスト表示
キャッシュをリスト表示する場合、共有クラス・キャッシュを作成したときと同じJVMを使用する必要があります。ただし、すべてのバージョンのキャッシュをリスト表示するJDK6バージョンを除きます。
JDK5では、共有クラスをリスト表示するJVMで互換性のある共有クラスが見つからない場合、どの共有クラスがあるかどうかにかかわらず、JVMSHRC005Iメッセージが表示されます。
JDK6では、VMは通常、他のJ9 VMから共有クラス・キャッシュを認識しますが、非互換の共有クラスとしてキャッシュをリスト表示します。
ヒント:JAVA_HOME環境変数を設定するのではなく、JDKのjavaシェル・スクリプト・ファイルの絶対パスを使用します。
QSH
/QOpenSys/QIBM/ProdData/JavaVM/jdk60/64bit/bin/java -Xshareclasses:listAllCaches
Listing all caches in cacheDir /tmp/javasharedresources/
Cache name level persistent last detach time
Compatible shared caches
myJSM Java6 64-bit yes In use
Incompatible shared caches
myJSM Java5 64-bit no Wed Jun 25 14:49:44 2008
myJSM Java5 32-bit no Wed Jun 25 14:46:06 2008
myJSM Java6 32-bit yes Wed Jun 18 12:18:59 2008
注:4つのmyJSMキャッシュがあり、開始されたSTRJSM JVMバージョンごとに1つのキャッシュがあります。
共有クラスの消去
キャッシュを消去する場合、共有クラス・キャッシュが作成されたときと同じJVMを使用する必要があります。
QSH
/QOpenSys/QIBM/ProdData/JavaVM/jdk50/64bit/bin/java -Xshareclasses:destroy,name=myJSM
JVMSHRC010I Shared Cache "myJSM" is destroyed
Unable to create Java Virtual Machine.