JEP 344: Abortable Mixed Collections for G1
http://openjdk.java.net/jeps/344
Owner Erik Helin Type Feature Scope Implementation Status Candidate Component hotspot/gc Discussion hotspot dash gc dash dev at openjdk dot java dot net Effort M Duration M Reviewed by Mikael Vidstedt, Stefan Johansson, Thomas Schatzl Endorsed by Mikael Vidstedt Created 2017/10/27 09:56 Updated 2018/11/10 14:25 Issue 8190269
Summary
G1 mixed collectionsのポーズが指定時間超過時にアボート可能にします。
Non-Goals
G1のすべてのポーズをアボート可能にする。
Motivation
G1の目標の一つは、コレクションポーズにおけるユーザ指定のポーズ時間を満たすことです。G1は高度な分析エンジンを有しており、これはコレクション中に実行すべき作業量を選択するのに使います(一部アプリケーションの振る舞いに依存)。この選択結果はcollection setと呼ばれるリージョンのセットになります。collection setが決定および開始されると、そのcollection setの全リージョンのすべての生存オブジェクトをG1は停止せずに収集します。この振る舞いだと、ヒューリスティックが巨大なcollection setを選択する場合、G1が指定ポーズ時間を超過する場合があり、これは例えばヒューリスティックが"古い(stale)"データを参照するなどしてアプリケーションの振る舞いが変化する場合に発生します。これは特にmixed collections中に発生し、collections setが多数の古いリージョンを保持している場合が多いです。よって、ヒューリスティックが繰り返し誤ったコレクション作業を選択するのを検出するメカニズムが必要で、これがあれば、G1は各ステップでインクリメンタルにコレクション作業を実行し、各ステップ後にコレクションをアボート可能です。こうしたメカニズムによりG1は指定ポーズ時間をより守れるようになります。
Description
collection setのヒューリスティックが連続して多数のリージョンを誤って選択するのを、G1が検出したとき、mixed collectionsをよりインクリメンタルなものにスイッチします。collection setを2つのパート、必須とオプショナル、にスプリットします。必須パートはG1がインクリメンタル処理出来ないcollection setのパート(例:young regions)で構成されますが、効率を高めるためのold regionsを含む場合もできます。このパートは、一例としては、predicted collection setの80%になります。predicted collection setの残り20%はold regionsのみで構成され、オプショナルパートを形成します。
G1の必須パートのコレクション終了後、G1はより細粒度でオプショナルのパートのコレクションを、もし時間が残っていれば、開始します。オプショナルパートのコレクションの粒度は、一度に最大で一つのリージョン*1、残り時間に依存します。任意数のオプショナルcollection setパートのコレクション完了後、G1は残り時間に応じてコレクションの停止を決定します。
予測処理が正確になると、コレクションのオプショナルパートが縮小します。これはすべてのcollection setが必須パートになるまで行います(つまりG1はヒューリスティックに完全に依存する)。再度、予測処理が不正確になると、次回のコレクションは必須とオプショナルパートの両方を再び含むようになります。
Alternatives
- 間違った予測処理をしないように分析エンジンとヒューリスティックを改善する。これ自体は興味深い目標ですが、ヒューリスティックはそれ以前のアプリケーションの振る舞いに依存する事を考えると、100%正確なヒューリスティックを得るのは不可能です。とはいえ、ヒューリスティックの改善は本JEPの必要性の低下に繋がります。
- 予測処理に関する"安全マージン(safety margin)"を常に取る。たとえば、予測処理がxを返す場合、0.8 * x(20%の安全マージン)を常に取ります。これはおおむね動作すると思われますが、G1が指定ポーズ時間の80%のみ使うという意味になるので、予測処理のパフォーマンスが最善にならなくなります。
- mixed collectionsのアボートに既存のevacuation failure mechanismを再利用する。この代替案は却下されており、その理由はアボート時にコレクションが任意のリージョンを解放する保証が無いためです。本JEPで提案するメカニズムでは、collection setの再生によってメモリ空間の再利用が進むことを保証します*2。
Testing
実装を構成する個々のC++のパーツをユニットテストする。アボート可能なmixed collectionsのコードはG1 GCの中核部分なので、このコードは既存テストが使えます。