一般的に,CopyGCの方が,FullGCよりも短い時間で処理できます。
New領域へのCopyGCの実施によって適切にメモリを回収して,Javaヒープ全体を対象とするFullGCの発生をできるだけ抑止することが,システムの停止回数の削減や,処理性能向上につながります。これを実現するためには,JavaVMオプションでそれぞれのメモリ空間のサイズや割合を適切に設定することが必要です。
また,Tenured領域に配置されるオブジェクトの一部を,明示管理ヒープ機能で管理するExplicitヒープに配置することも,FullGCの発生抑止に効果的です。Explicitヒープは,自動配置設定ファイルや明示管理ヒープAPIを使ってアプリケーションから利用でき,J2EEサーバからも利用されます。明示管理ヒープ機能のデフォルトの設定では,自動解放機能が有効になっています。自動解放機能が有効の場合,JavaVMは,Explicitヒープ領域のメモリを自動的に回収します。Explicitヒープの利用のしかたによっては,自動解放処理が長時間終了しないことがあります。このため,長時間終了しない自動解放処理が発生しないように,明示管理ヒープ機能の適切な利用や,Explicitヒープのメモリサイズの適切なチューニングを実施する必要があります。なお,自動解放処理については,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「8.7 自動解放機能が有効な場合のExplicitメモリブロックの解放」を参照してください。
これらを踏まえ,JavaVMのチューニングは,次の2点を目的として実施します。
理想的なメモリ使用量と経過時間の関係を次の図に示します。
図7-8 理想的なメモリ使用量と経過時間の関係
この図の場合は,寿命の短いオブジェクトはすべてCopyGCによって回収できていて,オブジェクトの昇格や退避が発生しません。このため,CopyGC実行後のメモリサイズが一定です。これによって,FullGCが発生しない,安定した状態での運用を実現できます。
JavaVMのチューニングでは,この状態を理想として,JavaVMの使用するメモリ空間の各領域で使用するメモリサイズを見積もってチューニングします。