GCを適切に行わせるためのヒープサイズの設定

一般にヒープサイズが小さいとGCが頻発してアプリケーションのパフォーマンスが低下します。さらに、ヒープサイズが必要量を下回る場合はOutOfMemoryErrorが発生してアプリケーションが停止してしまいます。一方、ヒープサイズが大きいと、GCの起動回数は減りますが、GC1回当たりの処理時間、すなわちアプリケーション停止状態が長くなり、アプリケーションの応答時間に問題が出る場合もあります。システムの物理メモリのフリー領域が不足するまでヒープサイズを大きくすると、物理メモリからスワップ領域へのページングが起こってしまい、かなりのパフォーマンスが劣化する可能性もあります。

JVMのヒープサイズオプション

ヒープサイズオプション サイズ
-Xms 初期ヒープサイズ(全体)
-Xmx 最大ヒープサイズ(全体)
-Xmn(-XX:NewSize) New世代領域サイズ
-XX:MaxNewSize New世代領域サイズ
-XX:NewRatio New世代領域とOld世代領域の比率(Old世代領域/New世代領域)
-XX:SurvivorRatio New世代領域とSurvivor領域の比率(Eden領域/From領域)
-XX:TargetSurvivorRatio New世代領域GC後のFrom領域内オブジェクトの割合目標

-Xms、-Xmx(-Xms≦-Xmx)に異なる値を設定すると、ヒープサイズは起動時には-Xmsで指定された大きさですが、状況によってJVMがヒープが足りないと判断した場合は最大-Xmxで指定した大きさまで拡大します。これらの値を同じにするとヒープサイズ調整のオーバーヘッドがなくなりパフォーマンスが上がる場合もあります。