この問題を避けるために、KLICの共有メモリ実装では、 各ノードが独立にGCする非同期GCを採用した。 同時に複数のノードがGCする代りに、ノードが通常処理している中、 あるノードが非同期にGCを始めるのである。
この方式は共有バスアクセスが時間軸に一定になることを期待している。その結果 バスを待ち合わせするアイドル時間を軽減させることにある。
非同期GCでは、古い面を参照して通常処理していたノードが古い面の領域の 不足を検知してGC処理に切り替わる。ノードは参照している古い面のデータを 新しい面にコピーする。それが終わると、また新しい面を参照面として通常処理 に移る。 もし、2つの面しかなければ、新面があふれた 場合にコピーする面がなくなってしまう。それゆえ、もう一つの未使用面を用意 している。未使用面の確保は実データ使用量が一面のサイズを越えない限り、共 有ヒープ領域のオーバーフローを起こさないことを保証している。
図11.2 に非同期GCの状態を示した。 この例では、最初に2つのノードが旧面を 参照している。そして、1つのノードが旧面の領域の不足を検知して、参照デー タを新面にコピーする。その間、もう一方のノードは通常処理を行っている。 一方のノードがGCを終え、その後にもう一方のノードが旧面の領域の不足を検 知して、参照データを新面にコピーする。
新面を使いきった場合に、未だ旧面を参照しているノードがいた場合には、 それらのノードに対して、割り込みにより強制GCを通知する。それらのノードが 新面に参照データをコピーし終われば、旧面は未使用面に切り替わる。この ように面は回転して使用され、新面は次の旧面、未使用面は新面へと切り替わる。 3面を使用する非同期GCでは、以下のような問題を解決しなければならない。
これらの問題の解決方法を以下に述べる。