株式会社空想科学テクノロジー

取り扱い方法

止まる時間の設定と、足りなくなったときの振る舞い。

決めるのは、2 つです

YamatoMM は、回収とコンパクションを自分で進めます。その動かし方で、プログラマーが決めるものは 2 つです。

止まる時間1 周期(= ゲームなら 1 フレーム)に、何マイクロ秒、何ミリ秒まで使うか。
足りなくなったとき領域をどれだけ確保するか。また、足りなくなった時に伸ばすか、止まるか。

止まる時間は、プログラマーが決めます

上限は、プログラマーが時間で設定します。 YamatoMM は、その時間を超えない範囲で、動かす件数をその場で調整します。 1 周期の持ち時間の内側で、毎周期 1 ミリ秒未満から数ミリ秒に分けて進め、収まらない分は次の周期へ回します。

件数でなく時間で管理しますので、止まる長さで移す数が決まります。 1 周期に何ミリ秒まで使えるかは、実行時にわかります。その数値を時間として渡せば、回収はその中で進みます。

通常は毎周期少しずつ進めますが、画面の切り替わりや読み込み中、通信の待ちなど、まとめて止めてよい瞬間に呼ぶこともできます。 回収が追いつかないときは、上限を外して一度に回収します。

上限が掛かるのは、毎周期の回収とコンパクションです。掛からないものが 2 つあります。参照が無くなった瞬間に走る解放(= デストラクタの連鎖。プログラムの側の時間です)と、確保が間に合わないときの一度の回収(= 緊急。その周期は伸びます)。後者は、確保する充分な量を予め決めていれば起きません。

※ Java や C# の回収は、自分で呼べますが、呼ばない時にも止まります。長さは、Java では目標値の指定まで、C# では指定できません。

足りなくなったときの振る舞いを、OS に任せません

多くの言語は、メモリが足りなくなったときの振る舞いを OS に任せています。 Linux の多くの設定では、確保は失敗せずに成功を返し、後で OS がプロセスを強制終了します。 プロセスに、安全に終了する機会は与えられません。組み込みでは OS そのものが無いこともあります。

YamatoMM は、起動時に最大値を一括で確保し、足りなくなったときに伸ばすか止まるかをプログラマーが選びます。 確保した領域の中で足りなくなったことを YamatoMM 自身が知り、決めた振る舞いで止まれます。 コンパクションすることで、その領域の中で確保に失敗する確率を下げます。

当局が言う「メモリ安全」は、壊れないことまでです。足りなくなったときの話は含みません。 ここは定義が不足している部分で、コンパクションと、決められた振る舞いが効く所です。