GC チューニング

http://edocs.beasys.co.jp/e-docs/wlcp/wlss21/adminguide/jvmgc.html

Sun JDK のガベージ コレクションのチューニング

Sun の JDK を使用する場合、ガベージ コレクションのパフォーマンス チューニングの目標は、完全なガベージ コレクションの 1 サイクルの実行に要する時間を短縮することです。完全なガベージ コレクションの発生頻度を最小限に抑えようとすると、多くの場合、結果的に、完了までに数秒を要する強制的なガベージ コレクション サイクルの発生を招くことになるので、JVM に対してそのようなチューニングを行うことは避けてください。

プロダクション サーバのライフタイムにおけるガベージ コレクション時間の短縮を実現する最も単純で信頼性の高い方法は、ヒープのサイズを固定してデフォルト コレクタと若い世代用の並行コレクタを使用することにより、新しい世代のサイズを最大でもヒープ全体の 1/3 までに制限することです。次に示す JVM の設定例は、このチューニング方式で使用される主要なガベージ コレクション オプションを指定したものです。
-XX:+UseTLAB -XX:+UseParNewGC -Xms768m -Xmx768m -XX:NewSize=256m -XX:MaxTenuringThreshold=0 -XX:SurvivorRatio=128

上記のオプションには、それぞれ次のような効果があります。
-XX:+UseTLAB - スレッド ローカルのオブジェクト割り当てブロックを使用します。これにより、共有ヒープ ロックに対する競合の発生が減少して、同時実行性が向上します。
-XX:+UseParNewGC - デフォルト コレクタとともに、若い世代用の並行バージョンのコピー コレクタを使用します。これにより、使用可能なすべての CPU が並行して使用されるようになり、休止時間を最小限に抑えられます。この若い世代用のコレクタは、デフォルト コレクタおよび同時マーク アンド スイープ (CMS) コレクタのどちらとも併用できます。
-Xms768m, -Xmx768m - ヒープ サイズを固定して、ガベージ コレクションが予測どおりに実行される可能性を高めます。-Xmx768m を指定するとヒープ サイズが制限されて、完全な GC の実行時にも SIP の再送信が発生することがなくなります。-Xms にも同じ値を指定して起動時のヒープ サイズを最大サイズに一致させると、ヒープが拡張されることがなくなるので、ヒープの拡張を原因とする休止の発生を防ぐことができます。
-XX:NewSize=256m - 若い世代の最小サイズを設定します。プロダクション環境のアプリケーションのテストを開始する際には、若い世代のサイズをヒープ全体のサイズの 1/3 に設定することをお勧めします。若い世代のサイズをそれより大きくすると、マイナー コレクションの発生回数は減少しますが、完全なコレクションの実行に要する時間が長くなるため、応答時間のパフォーマンスが低下するおそれがあります。

マイナー コレクションの発生頻度を微調整するには、若い世代に割り当てるヒープのサイズを徐々に減らしながら、それ以上サイズを減らすと応答時間が許容できないほど低下する限界点の直前まで削減します。
-XX:MaxTenuringThreshold=0 - すべての NewGC サイクルで NewSize の全体を使用できるようにして、寿命の長いオブジェクト (tenured object) の評価を不要にすることにより、休止時間を短縮します。より技術的に言えば、この設定は、生存しているすべてのオブジェクトを、コピーする代わりに、古い世代に昇格することを意味します。
-XX:SurvivorRatio=128 - 上記のゼロのしきい値の指定によって、生存しているすべてのオブジェクトを寿命の長いオブジェクトと見なすように設定した場合は、このように SurvivorRatio を高く設定することによって、実際には存在しない Survivor オブジェクトのために大きな領域が確保されることを防止できます。