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で指定した大きさまで拡大します。これらの値を同じにするとヒープサイズ調整のオーバーヘッドがなくなりパフォーマンスが上がる場合もあります。