サーバ VM を実行しているサーバクラスマシンでは、ガベージコレクタ (GC) が、これまでのシリアルコレクタ (-XX:+UseSerialGC
) からパラレルコレクタ (-XX:+UseParallelGC
) に変更されました。このデフォルトは、-XX:+UseSerialGC
コマンド行オプションを使用して java
コマンドにオーバーライドできます。
-XX:+UseParallelGC
) を使用してどちらかの VM (クライアントかサーバ) を実行するサーバクラスマシンでは、初期ヒープサイズと最大ヒープサイズが以下のように変更されました。
マシンの物理メモリの 1/64 より大きいサイズか、または妥当な最小サイズ。J2SE 5.0 より前は、デフォルトの初期ヒープサイズは妥当な最小サイズで、プラットフォームごとに異なっていた。このデフォルトは、-Xmx
コマンド行オプションを使用してオーバーライドが可能
物理メモリの 1/4 よりも小さいサイズか、または 1GB。J2SE 5.0 より前のデフォルトの最大ヒープサイズは 64MB。このデフォルトは、-Xmx
コマンド行オプションを使用してオーバーライドが可能
パラレルガベージコレクタ (UseParallelGC
) は、少量のヒープのコレクションに時間がかかりすぎると、メモリ不足の例外をスローします。ヒープサイズを大きくすると、この例外を回避できます。パラメータの -XX:GCTimeLimit=
time-limit および -XX:GCHeapFreeLimit=
space-limit を設定することもできます。time-limit と space-limit はそれぞれ以下の内容を表します。
-XX:+UseParallelGC
ガベージコレクタと共にデフォルトで使用される -XX:+UseAdaptiveSizePolicy
の実装が、以下の 3 つの目標を考慮して変更されました。実装では以下のことを (この順序で) チェックします。
フラグ
-XX:MaxGCPauseMillis=
nnn デフォルトでは、一時停止時間目標はありません。一時停止時間の目標がどの程度まで達成できるかについては明確な制限があります。GC の一時停止時間は、ヒープ内のライブデータの量により異なります。コレクションの大小は、様々な面でライブデータの量に依存します。このパラメータは注意して扱う必要があります。値が小さすぎると、システムがガベージコレクションに余分な時間を使ってしまいます。
-XX:GCTimeRatio=
nnn
たとえば、-XX:GCTimeRatio=19
が、GC の合計時間の 5% と 95% のスループットを目標に設定したとします。つまり、アプリケーションでは、コレクタの 19 倍の時間が必要ということになります。
デフォルト値は 99 で、アプリケーションがコレクタの少なくとも 99 倍の時間を必要とするということです。つまり、コレクタは多くても合計時間の 1% で実行されることになります。サーバアプリケーションの場合、これは良い選択といえます。値が高すぎると、ヒープサイズがその最大値にまで達する可能性があります。
推奨案
ヒープがデフォルトの最大ヒープサイズよりも大きいことが分からない場合は、ヒープに最大値を設定しないようにします。アプリケーションに対して十分なスループット目標を設定します。
理想的な状況では、ヒープは選択したスループット目標をサポートする値 (最大値未満) にまで増えます。
ヒープが最大値まで増えた場合、スループットはその最大値内では達成できないということになります。最大ヒープはできるだけ大きくしますが、プラットフォームの物理メモリよりも大きくならないように設定して、もう一度アプリケーションを実行します。それでもスループット目標が達成できない場合は、プラットフォームで使用可能なメモリに対して目標が高すぎることになります。
スループットは達成できるものの、一時停止が長すぎる場合は、一時停止時間目標を選択します。この場合、スループット目標が達成できない可能性があるため、アプリケーションにとって妥協点となる値を選択します。