kagamihogeの日記

kagamihogeの日記です。

JEP 344: Abortable Mixed Collections for G1をテキトーに訳した

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の中核部分なので、このコードは既存テストが使えます。

Risks and Assumptions

  • 必須とオプショナルにコレクションを分ける場合、オプショナルなcollection set用の追加データを保持する必要があります。このことは多少のCPUオーバーヘッドを課すことになり、このオーバーヘッドは1%未満でオプショナルなcollection setを使うmixed collectionsでだけ発生します。
  • オプショナルなcollection setを使用するmixed collections中のネイティブメモリ使用率が上がる可能性があります。オプショナルパート内で追加のリージョンポインターをmixed collection中はトラッキングする必要があるためです。

*1:at most down to one region at a time. 訳に自信無し

*2:The mechanism we propose guarantees space reclamation progress by reclaiming the space of the collection set on a region basis, which is G1's granularity of space reclamation. が原文。最後の方のwhich~あたりが上手く訳せんくって本文には含めていない