9.4.2 しきい値設定の考え方
しきい値は,次の式で算出した値を目安に算出できます。
しきい値≦100−(100×リソース排他解除を待つ間に必要な空きメモリのサイズ)/最大メモリサイズ
しきい値設定の際には,次の点を考慮してください。
-
FullGCの発生頻度
-
リソース排他解除を待つ間に必要な空きメモリ
ここでは,FullGCの発生頻度としきい値の関係と,リソース排他解除を待つ間に必要な空きメモリのサイズの見積もり方法について説明します。
(1) FullGCの発生頻度としきい値の関係
FullGCはプログラムの実行速度に比べて時間の掛かる処理です。このため,JavaVMのチューニングでは,FullGCをできるだけ発生させないようにします。JavaVMのチューニングの考え方については,「7.3.1 チューニングの考え方」を参照してください。
しきい値を設定して明示的に実行するFullGCも,頻度が少なくなるよう,チューニングする必要があります。
設定したしきい値ごとのメモリ使用量の例を,次の図に示します。
JavaVMでのメモリ使用量は,時間の経過とともに増加していき,FullGCが発生すると減少します。
しきい値に0を設定した場合は,JavaVMによって自動的に実行されるまでFullGCは実行されません。しきい値に小さな値を設定した場合は,大きな値を指定した場合に比べて,FullGCが実行される頻度が高くなります。図の場合は,しきい値として80を設定した場合の方が,50を設定した場合よりもFullGCの実行頻度を低く抑えることができています。
ただし,FullGCの実行頻度を少なくした場合,1回の実行に掛かる時間は,頻繁に実行する場合に比べて長くなります。
(2) リソース排他解除を待つ間に必要な空きメモリの見積もり
メモリ使用量がしきい値以上になった場合,リソース排他が解除されるまでFullGCは実行されません。しかし,リソース排他の解除を待っている間にJavaVMが必要とするメモリが不足した場合は,リソース排他解除を待たないでJavaVMによってFullGCが実行されてしまいます。
リソース排他解除を待つ間に空きメモリが不足した場合の例を次の図に示します。
- ポイント
-
JavaVMにFullGCを実行させないために必要な空きメモリについては,「7.2.7 GCの発生とメモリ空間の関係」を参照してください。
FullGCが発生するメモリ使用量を100とする場合,リソース排他解除待ち区間に使用できるメモリサイズは,「100−しきい値(%)」です。
例えば,しきい値として「95」のように高い値を指定した場合は,リソース排他解除を待っている間に使用できる空きメモリが5%と少ないため,リソース排他が解除される前にJavaVMによって自動的にFullGCが実施されてしまうおそれがあります。
このため,しきい値を見積もる場合には,リソース排他待ち区間にメモリが不足しないよう,十分に余裕を持った値を設定するようにしてください。
- 注意事項
-
リソース排他解除待ち区間で空きメモリが不足してJavaVMによるFullGCが実行された場合,リソースの排他が解除されたタイミングで,FullGC制御によってもう一度FullGCが実行されます。