並行 Mark Sweep コレクタの拡張機能

説明

並行コレクタや CMS とも呼ばれる並行 Mark Sweep コレクタは、ガベージコレクションによる一時停止の影響を受けるアプリケーションをターゲットにしています。このコレクタは、ほとんどのガベージコレクション動作を並行に実行します。つまり、アプリケーションスレッドが実行されている間、ガベージコレクションによる一時停止が短くなります。JDK 6 の CMS コレクタに対して行われた主なパフォーマンス拡張については、次で説明します。これらの変更、CMS コレクタ、およびホットスポットのガベージコレクションの詳細は、次のドキュメントを参照してください。

これらの機能は、CMS コレクタを使用しており、オプション -XX:+UseConcMarkSweepGC で CMS コレクタを選択している場合にのみ当てはまります。

System.gc() の同時実行

System.gc() および Runtime.getRuntime().gc() メソッドは、未使用のオブジェクトを再利用するためにガベージコレクタを実行するように JVM に指示します。これらのメソッドのホットスポット実装によって、ヒープ全体を収集するためにすべてのアプリケーションスレッドが停止します。これにより、特にヒープが大きい場合に一時停止が長くなります。一時停止を短くするという CMS コレクタの目的とは反対に動作します。

JDK 6 では、CMS コレクタは、System.gc() または Runtime.getRuntime().gc() 呼び出しへの応答のため一時停止が長くなることを避けるために、オプションでこれらのコレクションを並行に実行できます。この機能を有効にするには、次のオプションを追加します。

-XX:+ExplicitGCInvokesConcurrent

このオプションは、java コマンド行に追加します。

デフォルトの若い世代のサイズの増加

CMS コレクタが使用されるときの若い世代のデフォルトサイズを大きくするために、いくつかの変更が行われました。

これらの変更によって、ガベージコレクションによるオーバーヘッドが減少し、アプリケーションのパフォーマンスが向上しました。ただし、デフォルトの若い世代のサイズが増加したため、アプリケーションでは若い世代の一時停止時間が増加し、メモリーサイズが増加する可能性があります。世代、Survivor 領域、およびサイズを調整するために使用可能なオプションについては、必要に応じて次のドキュメントを参照してください。

並列マーク付け

CMS コレクタは複数のスレッドを使用して、複数のプロセッサを持つプラットフォームで並列に並行マーク付けタスクを実行します。これにより、並行マーク付けサイクルの時間が短縮され、特に大規模なマルチプロセッサマシン上で、コレクタは数多くのスレッドおよび高いオブジェクト割り当てレートを持つアプリケーションをサポートできます。以前のリリースでは、並行マーク付けに対して 1 つのスレッドだけを使用していたため、高いオブジェクト割り当てレートを持つアプリケーションに対応するコレクタの機能が制限されていました。

詳細情報

ホットスポットのメモリー管理ホワイトペーパーでは、世代、Survivor 領域、その他のメモリー管理概念だけでなく、CMS コレクタ、ホットスポットで使用可能なほかのコレクタについても説明されています。

ホットスポットのドキュメントページには、各リリースに固有のガベージコレクションの調整を行うためのガイドへのリンクが含まれています。このガイドには、アプリケーションに最適なガベージコレクタを選択するためのガイドライン、およびガベージコレクションによるオーバーヘッドを減らす場合に役立つ技術が示されています。