Javaアプリケーションを64ビットモードのJDK/JRE上で動作させる場合、通常のC/C++アプリケーションの場合と同様、実行モード上の制約から、Javaヒープに格納されるオブジェクト参照(ポインタ情報)で必要となる領域は「64ビット表現/8バイト域」が管理単位となります。
そのため64ビットモードのJDK/JRE上でJavaアプリケーションを動作させる場合、32ビットモードのJDK/JRE上で動作させる場合に対して、1.5~2倍のJavaヒープ量が必要となります。
しかし64ビットモードで実行されるFJVMの場合は、Javaヒープの大きさ(メモリ割り当てプール)が32GB未満の場合に限り、オブジェクト参照で必要となる領域を「32ビット表現/4バイト域」に圧縮して管理する機能「64ビットモード実行時におけるオブジェクト参照圧縮機能」により、当該機能のない64ビットモードで実行されるJDK/JREよりも少ないJavaヒープ量でJavaアプリケーションが実行できます。
1オブジェクト参照当たりで必要となるJavaヒープの領域が減るため、たとえば極端な例ですが、従来はある大きさに100個のオブジェクト参照を格納できていた場合、当該機能により200個のオブジェクト参照がJavaヒープ上に格納できるようになります。つまり当該機能がないもしくは使用しない場合に必要となるJavaヒープ量を、当該機構を用いた場合に適用した場合、相対的により大きなJavaヒープ値を指定したことと等価となります。その結果、ガーベジコレクション処理の発行回数が減り、アプリケーション実行性能の向上が期待できます。
注意
オブジェクト参照圧縮機能の無効化
本来「64ビット表現/8バイト域」が必要なメモリ域を「32ビット表現/4バイト域」に圧縮して管理するため、オブジェクト参照使用時には、圧縮した情報を「64ビット表現/8バイト域」に展開する必要があります。その圧縮/展開処理は従来よりも余分なCPU消費に繋がるため、Javaアプリケーションとしての実行性能が落ちる可能性が考えられます。
64ビットモードで実行されるFJVMの場合は、デフォルト状態でオブジェクト参照圧縮機能が有効になっています。そのため、Javaアプリケーションとしての実行性能が問題となった場合は、以下のオプションを指定することで、FJVMのオブジェクト参照圧縮機能を無効にすることができます。
64ビットモードで実行されるFJVMのオブジェクト参照圧縮機能を無効にするオプション
-XX:-UseCompressedOops |
注) 64ビットモードで実行される場合に指定できます。
なお、Javaヒープの大きさ(メモリ割り当てプール)が32GB以上であった場合は、以下のメッセージを標準出力へ出力して、オブジェクト参照圧縮機能は自動的に無効となります。
Javaヒープの大きさは、ページサイズなどのシステム情報を元に、Java VMによる制御が最適となるように調整された値となるため、-Xmxで指定された値と若干異なる場合があります。このため、このオプションで指定したサイズが、32GBより若干小さい場合でもオブジェクト参照圧縮機能が無効になる場合があります。
FJVMのオブジェクト参照圧縮機能が自動的に無効となった場合に出力されるメッセージ
Java HotSpot(TM) 64-Bit Server VM warning: Max heap size too large for Compressed Oops |