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