コンカレントコレクタや CMS とも呼ばれる、コンカレントマークスイープコレクタは、ガベージコレクション一時停止の影響を受けるアプリケーションをターゲットにしています。このコレクタは、ほとんどのガベージコレクションアクティビティーを同時に実行します。つまり、アプリケーションスレッドが実行されている間、ガベージコレクションによる一時停止を短く保ちます。JDK 6 の CMS コレクタに行われた主なパフォーマンス拡張については、次で説明します。これらの変更、CMS コレクタ、および HotSpot のガベージコレクションの詳細は、以下で参照されるドキュメントを参照してください。
これらの機能は、CMS コレクタが使用されているときのみ適用されます。オプション -XX:+UseConcMarkSweepGC
が CMS コレクタを選択します。
System.gc()
および Runtime.getRuntime().gc()
メソッドは、未使用のオブジェクトをリサイクルするためにガベージコレクタを実行するように JVM に指示します。これらのメソッドの HotSpot 実装は一般的に、ヒープ全体を収集するためにすべてのアプリケーションスレッドを停止します。このため一時停止が長くなります (特にヒープが大きい場合)これは、一時停止を短く保つという CMS コレクタの目標に反します。
JDK 6 では、CMS コレクタは、System.gc()
または Runtime.getRuntime().gc()
呼び出しに反応して一時停止が長くなることを避けるために、オプションでこれらのコレクションを同時に実行できます。この機能を有効にするには、次のオプションを
-XX:+ExplicitGCInvokesConcurrent
java
コマンド行に追加します。
CMS コレクタが使用されるときに若い世代のデフォルトサイズを大きくするために、いくつかの変更が行われました。
これらの変更によって主な影響は、ガベージコレクションオーバーヘッドが減少することで、アプリケーションパフォーマンスが向上しました。ただし、若い世代のデフォルトサイズが増加したため、アプリケーションでは若い世代の一時停止時間が増加し、メモリーフットプリントが増加する可能性があります。世代、Survivor 領域、およびサイズを調整するために使用可能なオプションについては、必要に応じて以下で参照されるドキュメントを参照してください。
CMS コレクタが、複数のスレッドを使用して、複数のプロセッサを持つプラットフォームでパラレルにパラレルマーキングタスクを実行するようになりました。これにより、パラレルマーキングサイクルの時間が短縮され、コレクタはより多くのスレッドおよびより高いオブジェクト割り当て率を持つアプリケーションをサポートできます (特に大きなマルチプロセッサマシン上で)。以前のリリースでは、パラレルマーキング用に 1 つのスレッドだけを使用していたため、非常に高いオブジェクト割り当て率を持つアプリケーションに対応するコレクタの能力が制限されていました。
HotSpot メモリー管理ホワイトペーパーでは、CMS コレクタおよび HotSpot で使用可能なその他のコレクタと、世代、Survivor 領域、およびその他のメモリー管理概念について説明しています。
HotSpot ドキュメントページには、各リリースに固有のガベージコレクションチューニングガイドへのリンクが含まれています。アプリケーションに最適なガベージコレクタを選択するためのガイドラインと、ガベージコレクションオーバーヘッドを減らすのに役立つテクニックが示されています。