止まる時間の設定と、足りなくなったときの振る舞い。
YamatoMM は、回収とコンパクションを自分で進めます。その動かし方で、プログラマーが決めるものは 2 つです。
| 止まる時間 | 1 周期(= ゲームなら 1 フレーム)に、何マイクロ秒、何ミリ秒まで使うか。 |
|---|---|
| 足りなくなったとき | 領域をどれだけ確保するか。また、足りなくなった時に伸ばすか、止まるか。 |
上限は、プログラマーが時間で設定します。 YamatoMM は、その時間を超えない範囲で、動かす件数をその場で調整します。 1 周期の持ち時間の内側で、毎周期 1 ミリ秒未満から数ミリ秒に分けて進め、収まらない分は次の周期へ回します。
件数でなく時間で管理しますので、止まる長さで移す数が決まります。 1 周期に何ミリ秒まで使えるかは、実行時にわかります。その数値を時間として渡せば、回収はその中で進みます。
通常は毎周期少しずつ進めますが、画面の切り替わりや読み込み中、通信の待ちなど、まとめて止めてよい瞬間に呼ぶこともできます。 回収が追いつかないときは、上限を外して一度に回収します。
上限が掛かるのは、毎周期の回収とコンパクションです。掛からないものが 2 つあります。参照が無くなった瞬間に走る解放(= デストラクタの連鎖。プログラムの側の時間です)と、確保が間に合わないときの一度の回収(= 緊急。その周期は伸びます)。後者は、確保する充分な量を予め決めていれば起きません。
※ Java や C# の回収は、自分で呼べますが、呼ばない時にも止まります。長さは、Java では目標値の指定まで、C# では指定できません。
多くの言語は、メモリが足りなくなったときの振る舞いを OS に任せています。 Linux の多くの設定では、確保は失敗せずに成功を返し、後で OS がプロセスを強制終了します。 プロセスに、安全に終了する機会は与えられません。組み込みでは OS そのものが無いこともあります。
YamatoMM は、起動時に最大値を一括で確保し、足りなくなったときに伸ばすか止まるかをプログラマーが選びます。 確保した領域の中で足りなくなったことを YamatoMM 自身が知り、決めた振る舞いで止まれます。 コンパクションすることで、その領域の中で確保に失敗する確率を下げます。
当局が言う「メモリ安全」は、壊れないことまでです。足りなくなったときの話は含みません。 ここは定義が不足している部分で、コンパクションと、決められた振る舞いが効く所です。