(57)【特許請求の範囲】
【請求項１】
スカビンジ処理およびコンパクション処理によりメモリ空間上のデータの再配置を行うガベージコレクション装置であり、
前記メモリ空間には、セルとトレイとが配置されており、
前記セルが保持するデータは、トレイのアドレスを示すハンドルまたはハンドル以外の数値のいずれかであり、前記トレイはセルのアドレスを示すリファレンスを保持し、メモリ空間上の連続したセルからなるセルブロックは、トレイが保持しているリファレンスを介してたどることができるようになっており、
前記スカビンジ処理は、セルが保持しているデータがハンドルであるか否かの推定処理を行い、ハンドルを保持していると推定されたセルを含むセルブロックのうち、所定のルートセルブロックからトレイが保持しているリファレンスを介してたどることができない未使用セルブロックを開放する処理であり、
前記コンパクション処理は、データを保持しない複数のセルブロックが、メモリ空間上で連続して配置されるようにセルブロックを移動する処理であり、
前記スカビンジ処理における推定処理は、
セルが保持しているデータをハンドルとみなしたとき、当該ハンドルがトレイのアドレスとして許される範囲にあるか否か、および、当該ハンドルを保持しているセルのアドレスをリファレンスとして保持しているトレイが未使用トレイでないかどうかの判定を含み、ハンドルがトレイのアドレスとして許される範囲であり、かつ、ハンドルを保持しているセルのアドレスをリファレンスとして保持しているトレイが未使用トレイであるときに限って、前記セルが保持しているデータがハンドルであると推測する
ことを特徴とするガベージコレクション装置。
【請求項２】
前記未使用トレイは、
トレイが保持するリファレンスがNULLであるトレイであり、
前記スカビンジ処理は、セルブロックを開放する際に、当該セルブロックに含まれるセルのリファレンスを保持するトレイを開放し、未使用トレイにする
ことを特徴とする請求項1記載のガベージコレクション装置。
【請求項３】
前記トレイが保持しているリファレンスを介してたどることは、
前記推定処理によりハンドルを保持していると推測されたセルを含むセルブロックから、そのハンドルでアドレスを示されるトレイに保持されているリファレンスでアドレスを示されるセルを含んだセルブロックへなされる
ことを特徴とする請求項1記載のガベージコレクション装置。
【請求項４】
スカビンジ処理およびコンパクション処理によりメモリ空間上のデータの再配置を行うガベージコレクション方法であり、
前記メモリ空間には、セルとトレイとが配置されており、
前記セルが保持するデータは、トレイのアドレスを示すハンドルまたはハンドル以外の数値のいずれかであり、前記トレイはセルのアドレスを示すリファレンスを保持し、メモリ空間上の連続したセルからなるセルブロックは、トレイが保持しているリファレンスを介してたどることができるようになっており、
前記スカビンジ処理は、セルが保持しているデータがハンドルであるか否かの推定処理を行い、ハンドルを保持していると推定されたセルを含むセルブロックのうち、所定のルートセルブロックからトレイが保持しているリファレンスを介してたどることができない未使用セルブロックを開放する処理であり、
前記コンパクション処理は、データを保持しない複数のセルブロックが、メモリ空間上で連続して配置されるようにセルブロックを移動する処理であり、
前記スカビンジ処理における推定処理は、
セルが保持しているデータをハンドルとみなしたとき、当該ハンドルがトレイのアドレスとして許される範囲にあるか否か、および、当該ハンドルを保持しているセルのアドレスをリファレンスとして保持しているトレイが未使用トレイでないかどうかの判定を含み、ハンドルがトレイのアドレスとして許される範囲であり、かつ、ハンドルを保持しているセルのアドレスをリファレンスとして保持しているトレイが未使用トレイであるときに限って、前記セルが保持しているデータがハンドルであると推測する
ことを特徴とするガベージコレクション方法。
【請求項５】
インストールされて実行されることにより、
スカビンジ処理およびコンパクション処理によりメモリ空間上のデータの再配置を行うガベージコレクタとして動作するプログラムを記録したコンピュータ読み取り可能な記録媒体であり、
前記メモリ空間には、セルとトレイとが配置されており、
前記セルが保持するデータは、トレイのアドレスを示すハンドルまたはハンドル以外の数値のいずれかであり、前記トレイはセルのアドレスを示すリファレンスを保持し、メモリ空間上の連続したセルからなるセルブロックは、トレイが保持しているリファレンスを介してたどることができるようになっており、
前記スカビンジ処理は、セルが保持しているデータがハンドルであるか否かの推定処理を行い、ハンドルを保持していると推定されたセルを含むセルブロックのうち、所定のルートセルブロックからトレイが保持しているリファレンスを介してたどることができない未使用セルブロックを開放する処理であり、
前記コンパクション処理は、データを保持しない複数のセルブロックが、メモリ空間上で連続して配置されるようにセルブロックを移動する処理であり、
前記スカビンジ処理における推定処理は、
セルが保持しているデータをハンドルとみなしたとき、当該ハンドルがトレイのアドレスとして許される範囲にあるか否か、および、当該ハンドルを保持しているセルのアドレスをリファレンスとして保持しているトレイが未使用トレイでないかどうかの判定を含み、ハンドルがトレイのアドレスとして許される範囲であり、かつ、ハンドルを保持しているセルのアドレスをリファレンスとして保持しているトレイが未使用トレイであるときに限って、前記セルが保持しているデータがハンドルであると推測する
ことを特徴とするプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、メモリ上の複数のセルを管理するメモリ管理装置に関するものであり、特に、トレイを用いつつセルに対するスカビンジ処理およびコンパクション処理を行うガベージコレクション装置に関する。
【０００２】
【従来の技術】
従来より、アプリケーションにて用いられるデータに対する、メモリ上の領域の確保および開放を動的に管理する動的記憶管理の技術が知られている。実際、このような動的記憶管理は、アプリケーション中の命令により使用する（データに対応する）領域の確保および不要となった領域の開放を明示的に行う方法と、アプリケーション中の命令により領域の確保を明示的に行うものの、（不要となった領域の開放を明示的に行うことなく）所定の管理部により領域が不要になったことを自動的に判断させこれらの領域を開放の上回収する方法とのいずれかが用いられることによって行われている。
【０００３】
自動的にメモリ上の領域を回収する後者の方法は、ガベージコレクションと呼ばれており、動的な記憶領域を多く必要とするアプリケーションのうち、明示的な開放によることが不利または事実上不可能なものに適用されている。
ところが、これらのようなガベージコレクションを実装するためには、アプリケーションと（ガベージコレクションを行う処理部である）ガベージコレクタとの間での、後述するようなリファレンスフラグを用いての綿密な情報交換を行うための機構を要し、不要になった領域を明示的に開放する動的記憶管理を利用している既存のアプリケーションを変更してガベージコレクションのための機構を組み込むことは非常な困難を伴うものといえる。
【０００４】
既存のアプリケーションに、より少ない労力で組み込むことのできるガベージコレクタとして、Boehmらは、アプリケーションとの情報交換を要しないコンサバティーブ・ガベージ・コレクタ（保守的ガベージコレクタ）を提案している。（次の2つの文献には、この保守的ガベージコレクタに関するより詳細な記述がある。文献1   Hans-Juergen Boehm and Mark Weiser, Garbage collection in an uncooperative environment Software Practice and  Experience Vol.18(9), Sep. 1988, P. 807〜820  文献2  小野 寺民 他  保守的ごみ集め（コンサバティーブ・ガベージ・コレクタ法）  情報処理 Vol.3）
また、これらとは別に、ガベージコレクションをより高速に行うため、ガベージコレクションとして行われる2つの処理のうちの1つであるコンパクション処理（他の1つの処理はスカビンジ処理）にてハンドルと呼ばれる間接アドレッシングを用いる手法が存在する。
【０００５】
以下では、まず、図27〜図30を用いてガベージコレクタにより行われる処理の概要について説明する。続いて、このようなガベージコレクタを実装する例として、リファレンスフラグを用いてアプリケーションとの情報交換を行う第1の従来例のガベージコレクタを図31〜図37を用いて説明し、リファレンスフラグおよびハンドルを用いる第2の従来例のガベージコレクタを図38〜図42を用いて説明する。この後、保守的ガベージコレクションを実装する第3の従来例のガベージコレクタを図43〜図46を用いて説明する。
【０００６】
まず、ガベージコレクタにより行われる処理の概要について説明する。図27はガベージコレクタが用いるヒープ領域の構成を説明するための図であり、図28はヒープ領域を構成するセルに格納される内容（値、データ）の例を示す図である。図28（ａ）は図27に示すヒープ領域内のセルの内容の例を示しており、図28（ｂ）は特に図28（ａ）に示すセルに保持されたリファレンスによる参照を示している。
【０００７】
図27に示すように、ガベージコレクタにより管理されるヒープ領域にはセルの配列が構成され、セルは数値またはリファレンスを保持する。リファレンスには、図28（ａ）に示すように、セルのアドレスを示す有効リファレンスと、セルを指し示さないＮＵＬＬリファレンスとの2種類がある。
たとえば、有効リファレンス0のセルは、有効リファレンス7を保持し、有効リファレンス7のセルを指すこととなっており、図28（ｂ）での有効リファレンス0のセルから有効リファレンス7のセルへの矢印はこれを示している。（ＮＵＬＬリファレンスからは矢印が出ておらず、このことはＮＵＬＬリファレンスがセルを指し示さないことに対応する。）
これらのようなセルからは次のような部分配列がセルブロックとして構成される。図29は、複数のセルから構成されるセルブロックの例を示す図である。図29（ａ）は図27に示すセルに値が代入されることにより構成されるセルブロックの例を示しており、図29（ｂ）は図29（ａ）に示すセルブロック間の参照関係の例を示している。
【０００８】
図29（ａ）に示すように、セルブロックはヒープ領域内に複数存在し得るが、同一のセルが複数のセルブロックに同時に属することはない。ヒープ領域のセルのうちセルブロックのいずれにも属しないセルを未使用セルと呼び、複数の連続する未使用セルからなる領域全体を未使用セルエリアと呼ぶ。また、ヒープ領域に確保される特定の1つのセルブロックをルートセルブロックと呼ぶ。ここでは、有効リファレンス14以降のセルの領域が未使用セルエリアであり、有効リファレンス0のセルがルートセルブロックである。
【０００９】
ヒープ領域内のセルブロックＡとセルブロックＢについて、セルブロックＡに属するいずれかのセルに、セルブロックＢの先頭のセルを指す有効リファレンスが設定されているとき、”セルブロックＡはセルブロックＢを参照している”という。ヒープ領域上にｎ個のセルブロックＸ1〜Ｘnがあり、セルブロックＸi（ｉ＝1，2，3，・・・，ｎ―1）がセルブロックＸi+1をそれぞれ参照しているとき、”セルブロックＸ1からセルブロックＸnをたどることができる”という。
【００１０】
図29（ｂ）では、ルートセルブロックはセルブロック4を参照しており、セルブロック3はセルブロック2を参照しており、セルブロック4はセルブロック2およびセルブロック5を参照している。ルートセルブロックからは、セルブロック4、セルブロック2およびセルブロック5をたどることができ、セルブロック4からは、セルブロック2およびセルブロック5をたどることができる。また、セルブロック3からセルブロック2をたどることができる。
【００１１】
新たな記憶領域を必要とするとき、アプリケーションは、未使用セルエリアのうちの必要なサイズ分のセルに対してセルブロックを割り付け（後述のようにガベージコレクタがこの割り付けを行うものとすることができる）ルートブロックからたどることができる状態にし、これにより、”セルブロックを確保する”。アプリケーションは、セルブロックを確保して、セルブロック内で数値を記憶したり他のセルブロックを参照したりすることにより、複雑なデータ構造のデータを記憶し管理することができることとなる。ルートセルブロックからたどることのできないセルブロックに対しては、アプリケーションはアクセスすることができない。
【００１２】
アプリケーションが管理するデータのデータ構造が変化すると、セルブロック間の参照関係が変化し、その結果ルートセルブロックからたどることができないセルブロックが増加する。これらのようなセルブロックにより未使用セルエリアが小さくなってくると、アプリケーションが要求するサイズ分のセルブロックが確保できなくなってくる。
【００１３】
ガベージコレクタは、このような状態のヒープ領域に対しスカビンジ処理とコンパクション処理とからなるガベージコレクションを行い、これにより、ヒープ領域を、必要なサイズ分のセルブロックをアプリケーションが確保できる状態にする。ガベージコレクタは、スカビンジ処理では、ルートセルブロックからたどることのできないセルブロックのいくつかを開放し、開放されたセルブロックを未使用セルエリアとし、また、コンパクション処理では、セルが複数のセルブロックに属することなく、セルブロック間の参照関係が保たれつつ、かつ、セルブロック内の数値が変更されないように、セルブロックをヒープ領域内で移動させ、（ルートセルブロックからたどることのできないセルブロックにより）分断されていた未使用セルエリアを連続させる。
【００１４】
図30は、図29（ｂ）に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。図30（ａ）は図29（ｂ）に示す状態のヒープ領域に対するスカビンジ処理の結果を示しており、図30（ｂ）は図30（ａ）に示す状態のヒープ領域に対するコンパクション処理の結果を示している。
図29（ｂ）に示す状態のヒープ領域に対してスカビンジ処理が行われると、図30（ａ）のように、ルートセルブロックからたどることのできないセルブロック1およびセルブロック3は開放されて未使用セルエリアとなる。さらに、この図30（ａ）に示す状態のヒープ領域に対してコンパクション処理が行われると、図30（ｂ）のように、ルートセルブロックからセルブロック4への参照ならびにセルブロック4からセルブロック2およびセルブロック5への参照が保たれたまま、開放されたセルブロック1のサイズ分、セルブロック2が前方に（有効リファレンスの値が小さいほうに）移動され、また、開放されたセルブロック1およびセルブロック3のサイズ分、セルブロック4およびセルブロック5が前方に移動されて、セルブロック1およびセルブロック3に対応する未使用セルエリアが、（有効リファレンス14以降の）後方の未使用セルエリアと統合されることとなる。
【００１５】
これらのように、ガベージコレクタは、アプリケーションの使用に伴って変化するヒープ領域の状態を管理し、必要に応じてセルブロックのいくつかを開放し未使用セルエリアを統合して1つの連続する領域とすることにより、ヒープ領域を、アプリケーションから要求されるサイズ分の、連続する領域を確保できる状態にするものであるが、先述のようにその実装には様々なものが知られており、以下では実装に際しての特徴を中心に第1の従来例のガベージコレクタ〜第3の従来例のガベージコレクタについて順に説明する。
【００１６】
図31は第1の従来例のガベージコレクタが用いるヒープ領域の構成を説明するための図であり、図32はヒープ領域を構成するセルに格納される内容の例およびこれらのセル間の参照関係を示す図である。
図31に示すように、第1の従来例のガベージコレクタは、リファレンスフラグを用いるものであり、各セルにはリファレンスフラグが対応付けられている。このリファレンスフラグには、対応付けられたセルに数値が保持されているとき0が設定され、対応付けられたセルにリファレンスが保持されているとき1が設定される。（リファレンスフラグを配列であるセルの要素数と等しい要素数の配列としてヒープ領域内にて確保するものとし、配列のオフセットを有効リファレンスに対応させるものとすることができる。）
図32に示すヒープ領域は、図28（ｂ）と同一のセル内容を保持するものであるが、たとえば、リファレンスが保持されている、有効リファレンス4、有効リファレンス5のセルに対応するリファレンスフラグには1が設定されており、数値が保持されている、有効リファレンス9、有効リファレンス10のセルに対応するリファレンスフラグには0が設定されている。
【００１７】
図33は、第1の従来例のガベージコレクタが用いるヒープ領域にて割り当てられるセルブロックの例およびこれらのセルブロック間の参照関係を示す図である。また、図34は、図33に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。図34（ａ）は図33に示す状態のヒープ領域に対するスカビンジ処理の結果を示しており、図34（ｂ）は図34（ａ）に示す状態のヒープ領域に対するコンパクション処理の結果を示している。
【００１８】
図33に示すセルブロックの構成は、図29（ｂ）に示すセルブロックの構成と同様であり、図34（ａ）に示すスカビンジ処理の結果、図34（ｂ）に示すコンパクション処理の結果は、それぞれ、図30（ａ）に示すスカビンジ処理の結果、図30（ｂ）コンパクション処理の結果と同様である。
特に、第1の従来例のガベージコレクタは、リファレンスフラグを用いつつ、ヒープ領域に対するスカビンジ処理およびコンパクション処理を行うものであるが、次にこれらの処理の手順を説明する。
【００１９】
図35は第1の従来例のガベージコレクタが行うスカビンジ処理Ａの手順を示すフローチャートであり、図36および図37は第1の従来例のガベージコレクタが行うコンパクション処理Ａの手順を示すフローチャートである。ここでは、使用中フラグが、ルートセルブロックからたどることができるか否かを示すために各セルブロックに対して設定され、スカビンジ処理を終了したときに使用中フラグが1であるセルブロックは、ルートセルブロックからたどることができることを示すものとする。
【００２０】
スカビンジ処理Ａでは、まず、セルブロックｘ（ｘ＝1〜Ｍ（Ｍはセルブロックの個数））の使用中フラグＦxに対して0が代入され（Ｓ101）、すべてのセルブロックに対する使用中フラグが0に初期化され、ルートセルブロックの内容（リファレンス）がスタックにプッシュされる（Ｓ102）。
スタックに積まれたリファレンスはポップされ（Ｓ103）、ポップされたリファレンスが指すセルブロックｘの先頭セルが対象セルに設定され（Ｓ104）、セルブロックｘに対する使用中フラグＦxに1が代入される（Ｓ105）。
【００２１】
続いて、対象セルのリファレンスフラグは1であるか否かが判定され（Ｓ106）、対象セルのリファレンスフラグが1であれば（Ｓ106にてＹｅｓ）、対象セルの内容であるリファレンスがスタックにプッシュされ（Ｓ107）Ｓ108へと処理が進められ、対象セルのリファレンスフラグが1でなければ（Ｓ106にてＮｏ）、Ｓ107での処理は行われることなくＳ108へと処理が進められる。
【００２２】
Ｓ108では同一のセルブロック内で対象セルに後続するセルがあるか否かが判定され、後続するセルがあれば（Ｓ108にてＹｅｓ）後続するセルが対象セルとされて（Ｓ109）Ｓ106からの処理が繰り返され、後続するセルがなければ（Ｓ108にてＮｏ）続いてスタックが空であるか否かが判定される（Ｓ110）。
スタックが空でなければ（Ｓ110にてＮｏ）、Ｓ103からの処理が繰り返され、スタックが空であれば（Ｓ110にてＹｅｓ）、本処理は終了する。
【００２３】
これらのような第1の従来例のガベージコレクタでのスカビンジ処理Ａによると、リファレンスフラグが用いられセルの内容がリファレンスであるか否かが判定されつつ、ルートセルブロックからたどることのできるセルブロックが特定され、これらの特定されたセルブロックの使用中フラグが1とされ、これら以外のセルブロックが未使用セルエリアとして開放されることとなる。
【００２４】
このようなスカビンジ処理Ａに続くコンパクション処理Ａでは、まず、セルブロックを特定するためのｘに1が代入され、セルブロックｘに対してコンパクション後のリファレンス値を示すＲxを算出するための、リファレンス値Ｗに0が代入される（Ｓ201）。
セルブロックｘの使用中フラグは1であるか否かが判定され（Ｓ202）、この使用中フラグが1であれば（Ｓ202にてＹｅｓ）、セルブロックｘに対するリファレンス値Ｒxにリファレンス値Ｗが代入されて（Ｓ203）、コンパクション後のセルブロックｘの先頭セルのリファレンス値Ｒxが確定され、リファレンス値Ｗにセルブロックｘのセル数Ｓxが加えられ（Ｓ204）、Ｓ205へと処理が進められる。使用中フラグが1でなければ（Ｓ202にてＮｏ）、Ｓ203、Ｓ204での処理は行われることなくＳ205へと処理が進められる。
【００２５】
Ｓ205ではｘがＭに等しいか否かが判定され、ｘがＭに等しくなければ（Ｓ205にてＮｏ）ｘに1が加えられて（Ｓ206）Ｓ202からの処理が繰り返され、ｘがＭに等しければ（Ｓ205にてＹｅｓ）Ｓ207へと処理が進められる。
（これらＳ201〜Ｓ206での処理により、スカビンジ処理Ａで設定された使用中フラグが用いられつつ、ヒープ領域内のすべてのセルブロックに対して、コンパクション後のリファレンス値が確定されることとなる。）
Ｓ207ではｘに1が代入され、セルブロックｘの使用中フラグＦxが1であるか否かが判定される（Ｓ208）。使用中フラグＦxが1であれば（Ｓ208にてＹｅｓ）、ｙに1が代入されて（Ｓ209）、セルブロックｙの使用中フラグＦyが1であるか否かが判定される（Ｓ210）。
【００２６】
セルブロックｙの使用中フラグＦyが1であれば（Ｓ210にてＹｅｓ）セルブロックｙの先頭セルは対象セルに設定され（Ｓ211）、対象セルのリファレンスフラグが1でありかつ対象セルの内容がセルブロックｘへのリファレンスである場合（Ｓ212にてＹｅｓかつＳ213にてＹｅｓ）、対象セルにリファレンス値Ｒxが代入され（Ｓ214）Ｓ215へと処理が進められ、これら以外の場合には（Ｓ212にてＮｏまたはＳ213にてＮｏ）Ｓ214での処理は行われることなくＳ215へと処理が進められる。また、セルブックｙの使用中フラグＦyが1でなければ（Ｓ210にてＮｏ）Ｓ211〜Ｓ214での処理は行われることなくＳ215へと処理が進められる。
【００２７】
Ｓ215では同一のセルブロック内で対象セルに後続するセルがあるか否かが判定され、後続するセルがあれば（Ｓ215にてＹｅｓ）後続するセルが対象セルとされて（Ｓ216）Ｓ211からの処理が繰り返され、後続するセルがなければ（Ｓ215にてＮｏ）ｙがＭに等しいか否かが判定される（Ｓ217）。ｙがＭに等しくなければ（Ｓ217にてＮｏ）ｙに1が加えられて（Ｓ218）Ｓ210からの処理が繰り返され、ｙがＭに等しければ（Ｓ217にてＹｅｓ）Ｓ219へと処理が進められる。
【００２８】
使用中フラグＦxが1でなければ（Ｓ208にてＮｏ）、Ｓ209〜Ｓ218での処理は行われることなくＳ219へと処理が進められる。
Ｓ219ではｘがＭに等しいか否かが判定され、ｘがＭに等しくなければ（Ｓ219にてＮｏ）ｘに1が加えられて（Ｓ220）Ｓ208からの処理が繰り返され、ｘがＭに等しければ（Ｓ219にてＹｅｓ）Ｓ221へと処理が進められる。
（これらＳ207〜Ｓ220での処理により、リファレンスフラグが用いられつつ、使用中フラグが1であるセルブロックに含まれるセルのリファレンス値が、コンパクション前後で参照関係が保たれるよう、先に確定されたコンパクション後のリファレンス値に更新されることとなる。ここでは、特に、ヒープ領域内の使用中のセルブロックｘが検索され、セルブロックｘを指しているセルブロックｙ中のセルにコンパクション後のリファレンス値が代入されることにより、上記のリファレンス値の更新が行われている。）
Ｓ221ではｘに1が代入され、セルブロックｘの使用中フラグＦxが1であるか否かが判定される（Ｓ222）。この使用中フラグＦxが1であれば（Ｓ222にてＹｅｓ）セルブロックｘの内容が先のようにして算出されたリファレンス値Ｒxが示すセルからコピーされ（Ｓ223）Ｓ224へと処理が進められ、使用中フラグＦxが1でなければ（Ｓ222にてＮｏ）Ｓ223での処理は行われることなくＳ224へと処理が進められる。
【００２９】
Ｓ224ではｘがＭに等しいか否かが判定され、ｘがＭに等しくなければ（Ｓ224にてＮｏ）ｘに1が加えられて（Ｓ225）Ｓ222からの処理が繰り返され、ｘがＭに等しければ（Ｓ224にてＹｅｓ）リファレンス値Ｗから以降が未使用セルブロックとされ（Ｓ226）、本処理は終了する。
（これらＳ221〜Ｓ226での処理により、先に確定されたセルブロックごとのコンパクション後のリファレンス値に基づいて、実際にセルブロックが移動されることとなる。）
これらのように、コンパクション処理Ａでは、まず、スカビンジ処理Ａで設定された使用中フラグが用いられつつ、ヒープ領域内のすべてのセルブロックに対して、コンパクション後のリファレンス値が確定され（Ｓ201〜Ｓ206での処理）、リファレンスフラグが用いられつつ、使用中フラグが1であるセルブロックに含まれるセルのリファレンス値が、コンパクション前後でセルブロック間の参照関係が保たれるよう、先に確定されたコンパクション後のリファレンス値に更新され（Ｓ207〜Ｓ220での処理）、その後、コンパクション後のリファレンス値に基づいて実際にセルブロックが移動される（Ｓ221〜Ｓ226での処理）。
【００３０】
以上のように、第1の従来例のガベージコレクタは、リファレンスフラグを用いての、ヒープ領域に対するスカビンジ処理Ａ（図35）およびコンパクション処理Ａ（図36、37）を行う。
図38は第2の従来例のガベージコレクタが用いるヒープ領域の構成を説明するための図であり、図39はヒープ領域を構成するセルに格納される内容およびトレイに格納される内容の例ならびにこれらのセル間の参照関係を示す図である。
【００３１】
図38に示すように、第2の従来例のガベージコレクタは、リファレンスフラグおよびハンドルを用いるものである。各セルは数値またはハンドルを保持し有効リファレンスによって特定されるものであり、各トレイはリファレンスを保持し有効ハンドルによって特定されるものである。
また、図39に示すように、リファレンスには、セルのアドレスを示す有効リファレンスとセルを指し示さないＮＵＬＬリファレンスとの2種類があり、ハンドルには、有効リファレンスを保持しているトレイのアドレスを示す有効ハンドルとトレイを指し示さないＮＵＬＬハンドルとの2種類がある。
【００３２】
たとえば、有効リファレンス12のセルは、有効ハンドル1を保持し有効ハンドル1のトレイを指すこととなっており、さらに、有効ハンドル1のトレイは、有効リファレンス4を保持し有効リファレンス4のセルを指すこととなっている。図39での有効リファレンス12のセルから有効ハンドル1のトレイへの矢印および有効ハンドル1のトレイから有効リファレンス4のセルへの矢印はこれらを示している。
【００３３】
図40は、第2の従来例のガベージコレクタが用いるヒープ領域にて割り当てられるセルブロックの例およびこれらのセルブロック間の参照関係を示す図である。
図40にて、トレイのうちＮＵＬＬリファレンスを保持するトレイを未使用トレイと呼び、複数の連続する未使用トレイからなる領域全体を未使用トレイエリアと呼ぶ。
【００３４】
ヒープ領域内のセルブロックＡとセルブロックＢについて、セルブロックＢの先頭のセルを指す有効リファレンスを保持しているトレイを指す有効ハンドルが、セルブロックＡに含まれるセルに保持されているとき、”セルブロックＡはセルブロックＢを参照している”という。また、先述のように、ヒープ領域上にｎ個のセルブロックＸ1〜Ｘnがあり、セルブロックＸi（ｉ＝1，2，3，・・・，ｎ―1）がセルブロックＸi+1をそれぞれ参照しているとき、”セルブロックＸ1からセルブロックＸnをたどることができる”という。
【００３５】
ここでは、ルートセルブロックは有効ハンドル3のトレイを介してセルブロック4を参照しており、セルブロック3は有効ハンドル1のトレイを介してセルブロック2を参照しており、セルブロック4は有効ハンドル1のトレイを介してセルブロック2を参照し有効ハンドル4のトレイを介してセルブロック5を参照している。ルートセルブロックからは、セルブロック4、セルブロック2およびセルブロック5をたどることができ、セルブロック4からは、セルブロック2およびセルブロック5をたどることができる。
【００３６】
新たな記憶領域を必要とするとき、アプリケーションは、未使用セルエリアのうちの必要なサイズ分のセルに対してセルブロックを割り付け、未使用トレイエリアのうちの1つのトレイに対して、割り付けられたセルブロックの先頭セルに対応する有効リファレンスを設定し、ルートブロックからたどることができる状態にし、これにより、”セルブロックを確保する”。
【００３７】
アプリケーションの使用に伴い、アプリケーションが、必要とするサイズ分のセルブロックをヒープ領域にて確保できなくなってくると、ガベージコレクタは、スカビンジ処理およびコンパクション処理を行うことにより、ヒープ領域を、必要なサイズ分のセルブロックをアプリケーションが確保できる状態にする。
図41は、図40に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。図41（ａ）は図40に示す状態のヒープ領域に対するスカビンジ処理の結果を示しており、図41（ｂ）は図41（ａ）に示す状態のヒープ領域に対するコンパクション処理の結果を示している。
【００３８】
図40に示す状態のヒープ領域に対してスカビンジ処理が行われると、図41（ａ）のように、セルブロックのいずれからも参照されていない有効ハンドル0のトレイおよび有効ハンドル2のトレイの内容がＮＵＬＬリファレンスに更新され、これらのトレイは未使用トレイとされる。また、これに従って、有効ハンドル0のトレイおよび有効ハンドル2のトレイの更新前の内容である有効リファレンス1および有効リファレンス6がそれぞれ指し示していたセルブロック1およびセルブロック3は開放され、これらのセルは未使用セルエリアとされる。
【００３９】
さらに、この図41（ａ）に示す状態のヒープ領域に対してコンパクション処理が行われると、図41（ｂ）のように、ルートセルブロックからセルブロック4への参照ならびにセルブロック4からセルブロック2およびセルブロック5への参照が保たれたまま、開放されたセルブロック1のサイズ分、セルブロック2が前方に移動され、開放されたセルブロック1およびセルブロック3のサイズ分、セルブロック4およびセルブロック5が前方に移動されて、セルブロック1およびセルブロック3に対応する未使用セルエリアが後方の未使用セルエリアと統合されることとなる。
【００４０】
これらのようなセルブロックの前方への移動に際しては、有効リファレンス0のセルの内容である有効ハンドル3、有効リファレンス9のセルの内容である有効ハンドル1、および、有効リファレンス11のセルの内容である有効ハンドル4は更新されることなく、対応するハンドルの内容である有効リファレンス8、有効リファレンス3および有効リファレンス12が、それぞれ、有効リファレンス4、有効リファレンス1および有効リファレンス8に更新されている。
【００４１】
特に、第2の従来例のガベージコレクタでのコンパクション処理Ｂは、ハンドル（間接アドレッシング）を用いて、第1の従来例のガベージコレクタにて行われるコンパクション処理Ａを高速化するものであるが、続いてこれらの処理の手順について説明する。
図42は、第2の従来例のガベージコレクタが行うコンパクション処理Ｂの手順を示すフローチャートである。ここでは、このコンパクション処理Ｂの実行に先立って、第1の従来例のガベージコレクタが行うスカビンジ処理Ａと同様のスカビンジ処理により、リファレンスフラグが用いられセルの内容がリファレンスであるか否かが判定されつつ、ルートセルブロックからたどることのできるセルブロックが特定され、これらの特定されたセルブロックの使用中フラグが1に設定され、さらに、セルブロックのいずれからも参照されていないトレイの内容がＮＵＬＬリファレンスに更新されているものとする。
【００４２】
コンパクション処理Ｂでは、まず、上述の第1の従来例のガベージコレクタのコンパクション処理ＡでのＳ201〜Ｓ206の処理と同様の処理により、スカビンジ処理で設定された使用中フラグが用いられつつ、ヒープ領域内のすべてのセルブロックに対して、コンパクション後のリファレンス値が確定される（Ｓ30 1〜Ｓ306）。
【００４３】
この後、トレイを特定するｙに1が代入され（Ｓ307）、トレイｙの内容が有効リファレンスであるか否かが判定される（Ｓ308）。トレイｙの内容Ｔyが有効リファレンスであれば（Ｓ308にてＹｅｓ）トレイｙにコンパクション後のリファレンス値Ｒxが設定された後（Ｓ309）、また、トレイｙの内容Ｔyが有効リファレンスでなければ（Ｓ308にてＮｏ）Ｓ309での処理は行われないまま、ｙがトレイの個数Ｎに等しいか否かが判定される（Ｓ310）。ｙがＮに等しくなければ（Ｓ310にてＮｏ）ｙに1が加えられて（Ｓ311）Ｓ308からの処理が繰り返され、ｙがＭに等しければ（Ｓ310にてＹｅｓ）Ｓ312へと処理が進められる。
（これらＳ307〜Ｓ311での処理により、コンパクション前後でトレイからセルへの参照関係が保たれるようトレイの内容が更新されることとなる。）
Ｓ312〜Ｓ317での処理は第1の従来例のガベージコレクタのコンパクション処理ＡでのＳ221〜Ｓ226の処理と同様であり、これらの処理により先に確定されたセルブロックごとのコンパクション後のリファレンス値に基づいて実際にセルブロックが移動され、本処理は終了する。
【００４４】
これらのように、コンパクション処理Ｂでは、まず、スカビンジ処理で設定された使用中フラグが用いられつつ、ヒープ領域内のすべてのセルブロックに対して、コンパクション後のリファレンス値が確定され（コンパクション処理ＡでのＳ201〜Ｓ206の処理と同様のＳ301〜Ｓ306の処理）、コンパクション前後でトレイからセルへの参照関係が保たれるよう有効リファレンスを保持するトレイの内容が更新され（Ｓ307〜Ｓ311の処理）、その後、コンパクション後のリファレンス値に基づいて実際にセルブロックが移動される（コンパクション処理ＡでのＳ221〜Ｓ226の処理と同様のＳ312からＳ317の処理）。
【００４５】
以上のように、第2の従来例のガベージコレクタは、ハンドルを用いつつ、ヒープ領域の管理およびコンパクション処理Ｂを行うものであり、第1の従来例のガベージコレクタが行うコンパクション処理Ａはより高速化されることとなる。
上述のような第1の従来例のガベージコレクタおよび第2の従来例のガベージコレクタは、いずれもリファレンスフラグを用いてセルの内容が数値であるかリファレンスであるかを判定しつつ、ガベージコレクションを行うものである。これに対し、第3の従来例のガベージコレクタは、アプリケーションとの綿密な情報交換を伴うことなく、保守的ガベージコレクションを行うものである。
【００４６】
図43は、第3の従来例のガベージコレクタが用いるヒープ領域のセルに格納される内容の例を示す図である。（第3の従来例のガベージコレクタが用いるヒープ領域は、リファレンスフラグおよびハンドルを用いるものではなく、その構成は図27に示すものに準ずる。）
第3の従来例のガベージコレクタは、セルの内容が数値であるかリファレンスであるかを推測し、あるセルブロックがルートセルブロックからたどることができるセルブロックであるか否かを判定し、これらに基づいてガベージコレクションを行う。また、この推測は、実際にはリファレンスであるセルの内容を数値であると誤ることがないよう行われるものである。（本ガベージコレクタは、実際には数値であるセルの内容がリファレンスであると誤って推測される可能性があることを許容するものである。）
図43にて、たとえば、有効リファレンス12のセルは、有効リファレンス4を保持し、有効リファレンス4のセルを指すこととなっており、有効リファレンス12のセルから有効リファレンス4のセルへの折れ線の矢印はこれを示している。また、本ガベージコレクタでは、実際には数値であるセルの内容がリファレンスであると誤って推測される可能性がある。図43中の曲線の矢印はこの誤推測を示すものであり、有効リファレンス3のセルに保持されている数値14、有効リファレンス9のセルに保持されている数値0および有効リファレンス10のセルに保持されている数値4はいずれもリファレンスであると誤って推測されている。
【００４７】
図44は、第3の従来例のガベージコレクタが用いるヒープ領域にて割り当てられるセルブロックの例およびこれらのセルブロック間の参照関係を示す図である。
実際、（ここでは図示していないが）セルブロックの先頭に次のセルブロックへのポインタを格納するものとし、これらを順次たどっていくことによりヒープ領域上セルブロックの先頭の位置を特定し、あるセル内のデータがセルブロックの先頭を指すものであるか否かを判定することにより、上記のような、実際にはリファレンスであるセルの内容を数値であると誤ることがない推測を行うことができる。
【００４８】
図44に示すセルブロック間の参照関係は、先に図29（ｂ）を用いて示したものと同様であるが、有効リファレンス4のセルに保持されている数値6は、セルブロック3の先頭セルの有効リファレンス6と同じ値であるため、誤ってリファレンスと推測されている。
図45は、図44に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。図45（ａ）は図44に示す状態のヒープ領域に対するスカビンジ処理の結果を示しており、図45（ｂ）は図45（ａ）に示す状態のヒープ領域に対して第1の従来例のガベージコレクタによるものと同様のコンパクション処理を行った結果を示している。（次に示すように、第3の従来例のガベージコレクタは、スカビンジ処理のみを行うものであり、コンパクション処理を行うことができない。）
図44に示す状態のヒープ領域に対してスカビンジ処理が行われると、図45（ａ）のように、ルートセルブロックからたどることのできないセルブロック1は開放されて未使用セルエリアとされる。ルートセルブロックからたどることのできるセルブロック2、セルブロック4およびセルブロック5は、開放されることなく残されたままとなっており、さらに、セルブロック2内有効リファレンス4のセルに保持されている数値6がリファレンスであるものと誤って推測され、セルブロック2がセルブロック3を参照するものと誤って判定されているため、セルブロック3は開放されることなく残されたままとなっている。
【００４９】
この図45（ａ）に示す状態のヒープ領域に、先述の第1の従来例のガベージコレクタによるコンパクション処理Ａ（図36、図37参照）と同様のコンパクション処理を行うものとすると、図45（ｂ）に示すように、セルブロック間の参照関係が保たれたまま、開放されたセルブロック1のサイズ分、セルブロック2、セルブロック3、セルブロック4およびセルブロック5が前方に移動され、セルブロック1に対応する未使用セルエリアが後方の未使用セルエリアと統合されることとなる。
【００５０】
これに加えて、このコンパクション処理により、参照関係が保たれるようセル内に保持されているリファレンスの値が更新されるため、リファレンスであると誤って推測されたコンパクション前の有効リファレンス4の数値6は、セルブロック2の移動分の値を引いた値4に更新されることとなる。すなわち、従来例3のガベージコレクタでは、実際には数値であるセルの内容がリファレンスであるものと誤って推測され、セル内の数値が誤って変更される可能性があるため、コンパクション処理を行うことができない。
【００５１】
これらのように、保守的ガベージコレクタを実装する第3の従来例のガベージコレクタは、スカビンジ処理のみを行うものであるが、次にこれらの処理の手順を説明する。
図46は、第3の従来例のガベージコレクタが行うスカビンジ処理Ｂの手順を示すフローチャートである。
【００５２】
スカビンジ処理Ｂはスカビンジ処理Ａと同様の処理を行うものであるが、スカビンジ処理Ｂでは、スカビンジ処理ＡでのＳ106、Ｓ107の処理（図35参照）が、Ｓ406〜Ｓ408の処理に置き換えられている。すなわち、Ｓ406〜Ｓ408（これら以外のスカビンジ処理Ｂでの処理については、スカビンジ処理Ａに準ずるものとする）では、まず、対象セルの内容が（先述のような推測方法にて）推測され（Ｓ406）、この内容がリファレンスと推測されたか否かが判定される（Ｓ407）。対象セルの内容がリファレンスと推測されていれば（Ｓ407にてＹｅｓ）、リファレンスであると推測された対象セルの内容がスタックにプッシュされ（Ｓ408）、Ｓ409（スカビンジ処理ＡのＳ108に対応）へと処理が進められ、対象セルの内容がリファレンスと推測されていなければ（Ｓ407にてＮｏ）、Ｓ408での処理は行われることなくＳ409へと処理が進められる。（これらの処理の置き換えは、第1の従来例のガベージコレクタがリファレンスフラグを用いているのに対し、第3の従来例のガベージコレクタがセルに対する推測を行うことに対応する。）これらのような第3の従来例のガベージコレクタのスカビンジ処理Ａによると、セルの内容がリファレンスであるか否かが推測されつつ、ルートセルブロックからたどることのできるセルブロックが特定され、これらの特定されたセルブロックの使用中フラグが1とされ、これら以外のセルブロックが未使用セルエリアとして開放されることとなる。
【００５３】
以上のように、第1の従来例のガベージコレクタおよび第2の従来例のガベージコレクタはヒープ領域に対するスカビンジ処理およびコンパクション処理を行い、また、第3の従来例のガベージコレクタはスカビンジ処理のみを行い、アプリケーションが必要とするサイズ分の領域を確保できるようヒープ領域の状態を保つ。
【００５４】
【発明が解決しようとする課題】
しかしながら、第1の従来例のガベージコレクタおよび第2の従来例のガベージコレクタではリファレンスフラグが用いられるため、アプリケーションの実行時にリファレンスフラグに対する操作を要し、（ガベージコレクションを用いることのないアプリケーションに比較して）プロセッサに対する負荷はより大きく、アプリケーションの実行により多くの時間を要することになる。特に、第2の従来例のガベージコレクタでは、コンパクション処理が高速化されてはいるものの、ハンドルが用いられておりこれらに対してリファレンスフラグのみに対するよりもより多くの領域を確保する必要がある。
【００５５】
また、第3の従来例のガベージコレクタでは、アプリケーションの実行に際してフラグが操作されるということがなく、第1の従来例のガベージコレクタおよび第2の従来例のガベージコレクタに比較してアプリケーション実行に対する負荷は小さくなるが、実際には数値であるセルの内容がリファレンスであると誤って推測される可能性があり、この誤りの可能性のある推測結果に基づいてスカビンジ処理が行われるため、コンパクションを実装することができない。コンパクションが実装されなければ、アプリケーションの実行に際してヒープ領域内で未使用セルエリアの分断が起こることとなり、アプリケーションにより要求されるサイズ分の領域をスムーズに確保できるよう、分断された複数の未使用セルエリアを管理する機構が別途必要となることになる。
【００５６】
本発明は、上記のような問題点を考慮してなされたものであり、ガベージコレクションの実行に必要となる領域を小さく抑えてアプリケーションの実行にかかる負荷をより小さくしつつ、高速なコンパクションを行うことのできるガベージコレクション装置を提供することを目的とする。
【００５７】
上記目的を達成するための、本発明に係るガベージコレクション装置は、スカビンジ処理およびコンパクション処理によりメモリ空間上のデータの再配置を行うガベージコレクション装置であり、前記メモリ空間には、セルとトレイとが配置されており、前記セルが保持するデータは、トレイのアドレスを示すハンドルまたはハンドル以外の数値のいずれかであり、前記トレイはセルのアドレスを示すリファレンスを保持し、メモリ空間上の連続したセルからなるセルブロックは、トレイが保持しているリファレンスを介してたどることができるようになっており、前記スカビンジ処理は、セルが保持しているデータがハンドルであるか否かの推定処理を行い、ハンドルを保持していると推定されたセルを含むセルブロックのうち、所定のルートセルブロックからトレイが保持しているリファレンスを介してたどることができない未使用セルブロックを開放する処理であり、前記コンパクション処理は、データを保持しない複数のセルブロックが、メモリ空間上で連続して配置されるようにセルブロックを移動する処理であり、前記スカビンジ処理における推定処理は、セルが保持しているデータをハンドルとみなしたとき、当該ハンドルがトレイのアドレスとして許される範囲にあるか否か、および、当該ハンドルを保持しているセルのアドレスをリファレンスとして保持しているトレイが未使用トレイでないかどうかの判定を含み、ハンドルがトレイのアドレスとして許される範囲であり、かつ、ハンドルを保持しているセルのアドレスをリファレンスとして保持しているトレイが未使用トレイであるときに限って、前記セルが保持しているデータがハンドルであると推測することを特徴とするガベージコレクション装置である。
【００５９】
【発明の実施の形態】
以下、図面を参照しつつ、本発明の実施の形態における実施例の1つであるガベージコレクタについて説明する。
図1は本発明の実施例の1つであるガベージコレクタが用いるヒープ領域の構成を説明するための図であり、図2はヒープ領域を構成するセルに格納される内容の例およびこれらのセル間の参照関係を示す図である。
【００６０】
図1に示すように、本ガベージコレクタにより管理されるヒープ領域には、セルの配列およびトレイの配列が構成される。有効リファレンスによって特定される各セルは数値またはハンドルを保持し、有効ハンドルによって特定される各トレイはリファレンスを保持し、本ガベージコレクタは、トレイに格納される有効リファレンスを用いつつセルの状態を管理する。
【００６１】
リファレンスには、図2に示すように（また従来例のガベージコレクタと同様）、セルのアドレスを示す有効リファレンスとセルを指し示さないＮＵＬＬリファレンスとがあり、ハンドルには、有効リファレンスを保持しているトレイのアドレスを示す有効ハンドルとトレイを指し示さないＮＵＬＬハンドルとがある。ここでは、有効リファレンス0のセルおよび有効リファレンス4のセルに保持されている有効ハンドル2は、有効ハンドル2のトレイを指していることを示しており、有効リファレンス7のセルに保持されている有効ハンドル3は、有効ハンドル3のトレイを指していることを示している。同様に、有効リファレンス12のセルに保持されている有効ハンドル1、有効リファレンス15のセルに保持されている有効ハンドル0および有効リファレンス17のセルに保持されている有効ハンドル4は、それぞれ、対応するトレイを指していることを示している。図上、これらの参照関係はセルからトレイへの折れ線の矢印によって表されている。
【００６２】
また、図2では、有効ハンドル0のトレイに保持されている有効リファレンス3、有効ハンドル1のトレイに保持されている有効リファレンス4、有効ハンドル2のトレイに保持されている有効リファレンス7、有効リファレンス3のトレイに保持されている有効リファレンス8および有効ハンドル4のトレイに保持されている有効リファレンス14がそれぞれ対応するセルを指していることが、トレイからセルへの折れ線の矢印により表されている。
【００６３】
特に本ガベージコレクタは、セルの内容が数値であるかハンドルであるかを推測し、あるセルブロックがルートセルブロックからたどることができるセルブロックであるか否かを推定し、これらに基づいてスカビンジ（トレイの開放）を行い、スカビンジの行われたヒープ領域に対してコンパクションを行うものであり、上記の推測は、実際にはハンドルであるセルの内容を数値であると誤ることがないよう行われる。（本ガベージコレクタは、実際には数値であるセルの内容がハンドルであると誤って推測される可能性があることを許容するものである。）図2中の、有効リファレンス9のセルから有効ハンドル0のトレイへの曲線の矢印、また、有効リファレンス10のセルから有効ハンドル4のトレイへの曲線の矢印は、上記のような推測により、実際には数値であるセルの内容がハンドルであると誤って推測されていることを示している。
【００６４】
実際、プロセッサ（ＣＰＵ）が複数のデータメモリ空間を扱えることを想定して、たとえば32ビットアドレス空間を持つ1つのデータメモリ空間が、データセグメントおよびエキストラセグメントとしてそれぞれ占有されるものとし、データセグメントにセル（データサイズ：32ビット）を割り当て、エキストラセグメントにトレイを割り当てるものとすることができる。この場合には、セルの保持する値により特定されることとなるエキストラセグメント内のトレイを検査し、このトレイが有効リファレンスを保持しているか否かに応じて、セルの保持する値が有効ハンドルであるか数値であるかを推測することができる。
【００６５】
また、プロセッサがデータメモリ空間を1つのみ扱えることを想定して、セルに対応するアドレスの範囲（たとえば3000〜12999）とトレイに対応するアドレスの範囲（0〜2999）とを異ならせるものとすることができる。この場合には、セルの保持する値がトレイに対応するアドレスの範囲にあるか否か、および、このトレイが有効リファレンスを保持しているか否かを検査し、セルの保持する値がトレイに対応するアドレスの範囲にあり、かつ、このトレイが有効リファレンスを保持しているときに限って、セルの保持する値が有効ハンドルであるものと推測することができる。
（ここでは、データセグメントにセルを割り当てセルに対応するアドレスの範囲を0〜9999とし、エキストラセグメントにトレイを割り当てトレイに対応するアドレスの範囲を0〜2999としている。）
上記のようなデータを保持しているセルからは、次のようなセルブロックが構成される。図3は、本ガベージコレクタが用いるヒープ領域にて割り当てられるセルブロックの例およびこれらのセルブロック間の参照関係を示す図である。
【００６６】
（従来例のガベージコレクタと同様）ヒープ領域に確保される特定の1つのセルブロックをルートセルブロックと呼び、セルのうちセルブロックのいずれにも属しないセルを未使用セル、複数の連続する未使用セルからなる領域全体を未使用セルエリアと呼ぶ。また、トレイのうちＮＵＬＬリファレンスを保持するトレイを未使用トレイ、複数の連続する未使用トレイからなる領域全体を未使用トレイエリアと呼ぶ。さらに、”セルブロックＡがセルブロックＢを参照している”、”セルブロックＸ1からセルブロックＸnをたどることができる”、”セルブロックを確保する”等の表現は、第2の従来例のガベージコレクタにおけるものと同様の意味にて用いられるものとする。
【００６７】
図3では、ルートセルブロックは有効ハンドル3のトレイ（有効リファレンス8を保持）を介してセルブロック4を参照しており、セルブロック3は有効ハンドル1のトレイ（有効リファレンス3を保持）を介してセルブロック2を参照しており、セルブロック4は有効ハンドル1のトレイを介してセルブロック2を参照し有効ハンドル4のトレイ（有効リファレンス12を保持）を介してセルブロック5を参照しており、これらは折れ線の矢印によって示されている。有効ハンドル0のトレイは有効リファレンス1を保持しセルブロック1を参照するものであるが、いずれのセルブロックからも参照されていない。
【００６８】
また、セルブロック2に含まれる有効リファレンス4のセルは数値2を保持するものであるが、この数値2はハンドルであるものと誤って推測されており、これらは曲線の矢印によって示されている。
アプリケーションの使用に伴い、アプリケーションが、必要とするサイズ分のセルブロックをヒープ領域にて確保できなくなってくると、本ガベージコレクタは、スカビンジ処理およびコンパクション処理を行う。
【００６９】
図4は、図3に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。図4（ａ）は図3に示す状態のヒープ領域に対するスカビンジ処理の結果を示しており、図4（ｂ）は図4（ａ）に示す状態のヒープ領域に対するコンパクション処理の結果を示している。
図3に示す状態のヒープ領域に対してスカビンジ処理が行われると、図4（ａ）のように、セルブロックのいずれからも参照されていない有効ハンドル0のトレイの内容が有効リファレンス1からＮＵＬＬリファレンスに更新され、このトレイは未使用トレイとされる。また、この更新により、有効ハンドルにより指し示されていないこととなったセルブロック1は開放され、未使用セルエリアとされる。
【００７０】
さらに、ルートセルブロックからたどることのできるセルブロック2、セルブロック3、セルブロック4およびセルブロック5は、開放されることなく残されたままとなっており、これらのセルブロック間の参照に用いられる（と正常に推測された）有効ハンドル1のトレイ、有効ハンドル3のトレイおよび有効ハンドル4のトレイならびにセルブロック2からセルブロック3への参照に用いられると誤って推測された有効ハンドル2のトレイは、開放されることなく残されたままとなっている。
【００７１】
この図4（ａ）に示す状態のヒープ領域に、先述の第2の従来例のガベージコレクタによるコンパクション処理Ｂ（図42参照）と同様のコンパクション処理が行われると、図4（ｂ）のように、ルートセルブロックからセルブロック４への参照、セルブロック3およびセルブロック4からセルブロック2への参照、ならびに、セルブロック4からセルブロック5への参照、これに加えて、誤って推測されたセルブロック2からセルブロック3への参照が保たれたまま、開放されたセルブロック1のサイズ分、セルブロック3〜セルブロック5およびセルブロック2が前方に移動されて、セルブロック1に対応する未使用セルエリアが後方の未使用セルエリアと統合されることとなる。
【００７２】
これらのようなセルブロックの前方への移動に際しては、有効リファレンス0のセルの内容である有効ハンドル3、有効リファレンス7および有効リファレンス9のセルの内容である有効ハンドル1、ならびに、有効リファレンス11のセルの内容である有効ハンドル4、加えて、有効リファレンス4のセルの内容であり有効ハンドルであると誤って推測された数値2は更新されることなく、対応するハンドルの内容である有効リファレンス8、有効リファレンス3、有効リファレンス12および有効リファレンス6が、それぞれ、有効リファレンス6、有効リファレンス1、有効リファレンス10および有効リファレンス4に更新されている。
【００７３】
これらのような本ガベージコレクタは、先述の第2の従来例のガベージコレクタでのコンパクション処理Ｂと同様のコンパクション処理を行うものであるが、以下に示すようなスカビンジ処理を行う。
図5および図6は、本ガベージコレクタが行うスカビンジ処理の手順を示すフローチャートである。（使用中フラグは、第1の従来例のガベージコレクタ等と同様、セルブロックがルートセルブロックからたどることができるか否かを示すよう各セルブロックに対して設定される。）
本スカビンジ処理では、まず、セルブロックｘ（ｘ＝1〜Ｍ（Ｍはセルブロックの個数））の使用中フラグＦxに対して0が代入され（Ｓ1）、ルートセルブロックの内容であるハンドルが指すリファレンスがスタックにプッシュされる（Ｓ2）。
【００７４】
スタックに積まれたリファレンスはポップされ（Ｓ3）、ポップされたリファレンスが指すセルブロックｘの先頭セルが対象セルに設定され（Ｓ4）、セルブロックｘに対する使用中フラグＦxに1が代入される（Ｓ5）。
続いて、対象セルの内容が（先述のような推測方法にて）推測され（Ｓ6）、このセルの内容がハンドルと推測されたか否かが判定される（Ｓ7）。対象セルの内容がハンドルと推測されていれば（Ｓ7にてＹｅｓ）、ハンドルであると推測された対象セルの内容であるハンドルが指すリファレンスが、スタックにプッシュされ（Ｓ8）、Ｓ9へと処理が進められ、対象セルの内容がハンドルと推測されていなければ（Ｓ7にてＮｏ）、Ｓ8での処理は行われることなくＳ9へと処理が進められる。
【００７５】
Ｓ9では同一のセルブロック内で後続するセルがあるか否かが判定され、後続するセルがあれば（Ｓ9にてＹｅｓ）後続するセルが対象セルとされて（Ｓ10）Ｓ6からの処理が繰り返され、後続するセルがなければ（Ｓ9にてＮｏ）続いてスタックが空であるか否かが判定される（Ｓ11）。スタックが空でなければ（Ｓ11にてＮｏ）、Ｓ3からの処理が繰り返され、スタックが空であれば（Ｓ11にてＹｅｓ）、Ｓ12へと処理が進められる。
【００７６】
Ｓ12ではｙに1が代入され、ハンドルｙのトレイの内容が有効リファレンスであるか否かが判定される（Ｓ13）。ハンドルｙのトレイの内容が有効リファレンスであれば（Ｓ13にてＹｅｓ）、続いて、この有効リファレンスが指すセルブロックｘの使用中フラグが0であるか否かが判定される（Ｓ13）。セルブロックｘの使用中フラグが0であれば（Ｓ14にてＹｅｓ）、ハンドルｙのトレイの内容としてＮＵＬＬリファレンスが代入された後（Ｓ15）ｙがトレイの個数Ｎに等しいか否かが判定され（Ｓ16）、セルブロックｘの使用中フラグが0でなければ（Ｓ14にてＮｏ）Ｓ15での処理は行われることなく、Ｓ16へと処理が進められる。
【００７７】
ｙがＮに等しくなければ（Ｓ16にてＮｏ）、ｙに1が加えられ（Ｓ17）Ｓ13からの処理が繰り返され、ｙがＮに等しければ（Ｓ16にてＹｅｓ）、本処理は終了される。
これらのようなスカビンジ処理よると、セルの内容がハンドルであるか否かが推測されつつ、ルートセルブロックからたどることのできるセルブロックが特定され、これらの特定されたセルブロックの使用中フラグが1とされ、これら以外のセルブロックが未使用セルエリアとして開放されることとなる。
【００７８】
本ガベージコレクタでは、以上のようなスカビンジ処理にて実際には数値であるセルの内容をハンドルであると誤って推測する可能性があるが、セルの特定には間接アドレッシング（ハンドル）が用いられており、コンパクション処理ではこのハンドルによって特定されるトレイの内容が更新されるため、セル自体の内容が更新されることはなく、（第3の従来例のガベージコレクタとは異なり）有効にコンパクションが行われることとなる。
【００７９】
また、スカビンジ処理にてハンドルを保持するものと誤って推測されたセルにより指示されることとなるセルブロックは、未使用セルエリアに統合されないこととなるものの、誤推測された数値が書き換えられれば、その次に行われるスカビンジ処理により正常に開放される可能性がある。
以下に、第1の従来例のガベージコレクタ〜第3の従来例のガベージコレクタおよび本ガベージコレクタの特徴を要約する。
【００８０】
【表１】
0004050855.tif 000002
【００８１】
実際、リファレンスフラグは、セル1個（たとえば4バイトで構成されるものとする）につき1ビット必要であるので、ヒープ領域をより有効に活用するために、セル8個分のリファレンスフラグが1つにパックされて利用される。アプリケーション実行中セルに値を代入するとき、このセルがリファレンスであるか数値であるかを示すためリファレンスフラグを設定する必要があり、このようなリファレンスフラグへのアクセスに多くの時間がかかる。また、スカビンジ処理を行う際には、セルの値がリファレンスであるか数値であるかを検知しなくてはならず、上記のようにして構成されるリファレンスフラグへのアクセスに多くの時間がかかる。
【００８２】
［表1］に示すように、第1の従来例のガベージコレクタおよび第2の従来例のガベージコレクタは、セル内容の判定にリファレンスフラグを用いるものであり、アプリケーションの実行中リファレンスフラグを用いてアプリケーションと情報交換しまたスカビンジ処理に際してリファレンスフラグを参照するため、アプリケーション実行によるプロセッサへの負荷およびスカビンジ処理に要する負荷はより大きなものとなり、一定の処理能力を有するプロセッサでの処理を想定したとき、（第3の従来例のガベージコレクタおよび本発明のガベージコレクタに比べて）より多くの時間をこれらの処理に要することとなる。（第1の従来例のガベージコレクタと第2の従来例のガベージコレクタとを比較すると、第2の従来例のガベージコレクタが行うコンパクション処理Ｂ（図42参照）ではハンドルが用いられるため、Ｓ307〜Ｓ311の処理は、同様に更新後のリファレンス値を設定することとなる、第1の従来例のガベージコレクタが行うコンパクション処理Ａ（図36および図37参照）のＳ207〜Ｓ220の処理に比較して簡素であり、コンパクション処理に要する負荷が小さなものとなっている。）
第1の従来例のガベージコレクタおよび第2の従来例のガベージコレクタに対して、第3の従来例のガベージコレクタおよび本発明のガベージコレクタは、保守的ガベージコレクタでありセル内容の判定に推測を用いるものであり、上記のようなアプリケーション実行中のリファレンスフラグの操作およびスカビンジ処理に際してのリファレンスフラグの参照は不要であり、アプリケーション実行の負荷およびスカビンジ処理に要する負荷は小さく、より短い時間にてこれらの処理を行うことができる。（上述しなかったが、第2の従来例のガベージコレクタでコンパクション処理を行う際には、対応するリファレンスフラグの移動がセルの移動に伴われ、本発明のガベージコレクタと比較してコンパクション処理に対する負荷が大きいといえる。）
特に、第3の従来例のガベージコレクタは、スカビンジ処理にてセル内容を誤って推測する可能性があることからコンパクション処理を行うことができないものであるが、本ガベージコレクタでのスカビンジ処理は、保守的ガベージコレクタにてコンパクション処理を行うことを可能にするものである。
【００８３】
次に、以上説明してきたような本発明に係るガベージコレクタの（プログラム記憶式）コンピュータへのより具体的な実装例として、端末からの入力に応じて座席を予約するための予約システムを説明する。
図7は本発明に係るガベージコレクタを用いる予約システムの構成の概略を示す図であり、図8は本予約システムに含まれる予約データベース管理部4の構成を説明するための図である。
【００８４】
図7に示すように、本予約システムは、端末部Ａ1、端末部Ｂ2、端末部Ｃ3および予約データベース管理部4を含んでいる。本予約システムでは、端末部Ａ1、端末部Ｂ2および端末部Ｃ3のいずれかでのユーザの（1以上の）座席数の入力に応じて、この座席数分の座席の予約が予約データベース管理部4に要求される。予約データ管理部4は、必要座席数分の座席番号の2組の候補を仮予約し、それらの候補を予約を要求してきた端末部に返す。予約が返された端末部は、ユーザの入力によりそれら候補のうちのいずれかを選択し、選択結果を予約データベース管理部4に報告し、予約データベース管理部4はユーザの選択した候補を本予約し予約を終了する。
【００８５】
予約データベース管理部4は、図8に示すように、予約の実行に伴って用いられるセルを初期化する初期化部41、全体の動作を制御してユーザの所望する座席数分の座席を予約するアプリケーション部42、セルブロック内のセルに値を代入するセル代入部43、および、アプリケーション部42の要求に応じて記憶領域上にセルブロックを割り当て必要に応じてガベージコレクションを行うガベージコレクタ44を含んでおり、ガベージコレクタ44は、セルブロックの割り当てを行うセルブロック割り当て部441、ならびに、上述のようなスカビンジ処理を行うスカビンジ処理部442および前述のようなコンパクション処理を行うコンパクション処理部443を含んでいる。
【００８６】
実際、アプリケーション部42、初期化部41、セルブロック割り当て部441、スカビンジ処理部442、コンパクション処理部443、端末部Ａ1〜Ｃ3、および、セル代入部43では、次に、図9〜図17に示すような処理が行われ、ガベージコレクタ44によりアプリケーション部42の要する記憶領域が確保され必要に応じてスカビンジ処理およびコンパクション処理が行われつつ、座席の予約が実行される。（これらの処理の手順を説明した後、図18〜図24を用いて端末部Ａ1〜端末部Ｃ3からのユーザの入力を想定したセルブロックの変化を具体的に説明する。）
図9〜図17に示す処理の実行に際して用いられるセルブロックは、セル配列の部分配列であり、先頭セルのリファレンス（アドレス）をｘ、セルブロック内容の長さをｎとして、次のような構成によるものとする。
・Ｃ［ｘ］＝次のセルブロックの先頭リファレンス
・Ｃ［ｘ＋1］＝ｎ（＝セルブロック内容の長さ）
・Ｃ［ｘ＋2］＝使用中フラグまたはコンパクションに用いられるワーク
・Ｃ［ｘ＋3］〜Ｃ［ｘ＋2＋ｎ］＝アプリケーションにて自由に使用されるセルブロックの内容
特に、ここではルートセルブロックを次に示すようなセルであるものとする。（これらの値は、後に示すような処理によって初期化部41にて代入される。）
・Ｃ［1］＝5
・Ｃ［2］＝1
・Ｃ［3］＝ＮＵＬＬ
・Ｃ［4］＝ＮＵＬＬ
本予約システムでの予約の実行に際して、ガベージコレクタ44は、セルブロックの割り当てを要求されること以外にはアプリケーションの動作（アプリケーション部42での処理および端末部Ａ1〜端末部Ｃ3での処理）にはかかわらず独立した動作を行うものであり、このアプリケーションからの要求に応じて、必要な際にスカビンジ処理、コンパクション処理を行う。また、ガベージコレクタ44は、上記のようなセルブロックの構成のみを識別して処理を行うものであり、スカビンジ処理部442は、（Ｃ［ｘ＋3］〜Ｃ［ｘ＋2＋ｎ］に対応する）セルブロックの内容を示すセルが数値であるかハンドルであるかをあらかじめ識別するものではなく、セルの内容を（具体的には後に示すような図12のＳ41、Ｓ42等の処理により）推測するものである。
【００８７】
上記のようにガベージコレクタ44はアプリケーションにて用いられるセルブロックの内容を知るものではないが、アプリケーションは予約を実行するため次に示すようなデータ構造を有するシステムセルブロックおよび候補セルブロックを用いる。
システムセルブロック（先頭セルのリファレンスをｘ0としている）
・Ｃ［ｘ0］〜Ｃ［ｘ0＋2］＝各々上述のＣ［ｘ］〜Ｃ［ｘ＋2］に対応する値
・Ｃ［ｘ0＋3］＝端末部Ａ1の候補セルブロックへのリファレンスを格納するハンドル
・Ｃ［ｘ0＋4］＝端末部Ｂ2の候補セルブロックへのリファレンスを格納するハンドル
・Ｃ［ｘ0＋5］＝端末部Ｃ3の候補セルブロックへのリファレンスを格納するハンドル
端末部ｔ（＝Ａ、Ｂ、Ｃ）に対する候補セルブロック（先頭セルのリファレンスをｘtとしている）
・Ｃ［ｘt］〜Ｃ［ｘt＋2］＝各々上述のＣ［ｘ］〜Ｃ［ｘ＋2］に対応する値
・Ｃ［ｘt＋3］＝予約座席数
・Ｃ［ｘt＋4］〜Ｃ［ｘt＋3＋予約座席数］＝候補1として仮予約した座席の座席番号
・Ｃ［ｘt＋4＋予約座席数］〜Ｃ［ｘt＋3＋2×予約座席数］＝候補2として仮予約した座席の座席番号
フローチャート中およびフローチャートの説明に当たっては、次に示すような表記を用いるものとする。
・Ｃ：  セル配列
・Ｎ：  セルの個数（セル配列のサイズ）
・Ｃ［1］〜Ｃ［Ｎ］：  セル
・Ｔ：  トレイ配列
・Ｍ：  トレイの個数（トレイ配列のサイズ）
・Ｔ［1］〜Ｔ［Ｍ］：  トレイ
・ＮＵＬＬ：  数値0
・Ｕ：  未使用セルブロックの先頭リファレンス
・Ｗ：  コンパクション時のワーク
・Ｓ：  リファレンススタック
図9はアプリケーション部42での処理の手順を示すフローチャートであり、図10は初期化部41での処理の手順を示すフローチャートである。
【００８８】
図9に示すように、アプリケーション部42の処理では、まず、初期化部41が呼び出され、（後に図10を用いて示すような手順によって）記憶領域上のセルブロックが初期化されまたルートセルブロックが設定される（Ｓ21）。続いて、必要セル数ｎに3が代入されてセルブロック割り当て部441が呼び出され、（後に図11に示すような手順による）セルブロック割り当て部441での処理により得られたハンドルｈがＣ［4］に代入され、システムセルブロックが確保される（Ｓ22）。
【００８９】
この後、ｓに1が代入されて（Ｓ23）、処理に用いられるｋにｓが代入され端末部ｓ（ｓ＝1、2、3であり、端末部1〜端末部3を、端末部Ａ1〜端末部Ｃ3にそれぞれ対応させる）が呼び出される（Ｓ24）。端末部ｓでは、より詳細には後に図15および図16に示すような手順によって、ユーザの予約の要求への応答が行われ必要に応じてガベージコレクションが行われつつセルブロックの割り当てとセルブロックへの値の代入等の処理が行われ、座席の仮予約および本予約が順次行われることとなる。端末部ｓの呼び出しの後にはｓに1が加えられて（Ｓ25）、ｓの値が3より大きいか小さいかに応じてＳ23からの処理（Ｓ26にてＹｅｓ）またはＳ24からの処理（Ｓ26にてＮｏ）が繰り返され、端末部Ａ1、端末部Ｂ2、端末部Ｃ3の呼び出しが順次繰り返される。
【００９０】
上記のアプリケーション部42のＳ21での処理では初期化部41が呼び出されるが、図10に示すように、初期化部41の処理では、まず、ｘに1が代入され（Ｓ2101）、Ｃ［ｘ］にＮＵＬＬが代入され（Ｓ2102）、ｘがセルの個数Ｎに等しいか否かが判定される（Ｓ2103）。ｘがＮに等しくなければ（Ｓ2103にてＮｏ）ｘに1が加えられて（Ｓ2104）Ｓ2102からの処理が繰り返され、ｘがＮに等しければ（Ｓ2103にてＹｅｓ）Ｓ2105へと処理が進められる。（これらのＳ2 101〜Ｓ2104での処理はすべてのセルＣ［1］〜Ｃ［Ｎ］をＮＵＬＬに初期化するものである。）
続いて、Ｓ2105では再びｘに1が代入され、Ｔ［ｘ］にＮＵＬＬが代入され（Ｓ2106）、ｘがトレイの個数Ｍに等しいか否かが判定される（Ｓ2107）。ｘがＭに等しくなければ（Ｓ2107にてＮｏ）ｘに1が加えられて（Ｓ2108）Ｓ2106からの処理が繰り返され、ｘがＭに等しければ（Ｓ2107にてＹｅｓ）Ｓ2109へと処理が進められる。（これらのＳ2105〜Ｓ2108での処理はすべてのトレイＴ［1］〜Ｔ［Ｍ］をＮＵＬＬに初期化するものである。）
Ｓ2109ではＣ［1］に5、Ｃ［2］に1が代入されることによりルートセルブロックが設定され、また、未使用セルブロックの先頭リファレンスＵに5が代入され（Ｓ2109）、初期化部41での処理は終了し、この後、上記のアプリケーション部42のＳ22での処理によりセルブロック割り当て部441が呼び出される。
【００９１】
図11はセルブロック割り当て部441での処理の手順を示すフローチャートであり、図12はセルブロック割り当て部441から呼び出されるスカビンジ処理部442での処理の手順を示すフローチャートであり、図13および図14はセルブロック割り当て部441から呼び出されるコンパクション処理部443での処理の手順を示すフローチャートである。
【００９２】
図11に示すように、セルブロック割り当て部441の処理では、まず、必要セル数ｎが（Ｎ―Ｕ―3）以下であるか否か（すなわち記憶領域上必要なセルの確保が可能か否か）が判定される（Ｓ2201）。ｎが（Ｎ―Ｕ―3）以下であれば（Ｓ2201にてＹｅｓ）Ｓ2205へと処理が進められ、ｎが（Ｎ―Ｕ―3）以下でなければ（Ｓ2201にてＮｏ）、続いて、（後に図12に示す手順にて処理を行う）スカビンジ処理処理部442および（後の図13および図14に示す手順にて処理を行う）コンパクション処理部443が順に呼び出され（Ｓ2202、Ｓ2203）、再び、必要セル数ｎが（Ｎ―Ｕ―3）以下であるか否かが判定される（Ｓ2204）。ｎが（Ｎ―Ｕ―3）以下でなければ（Ｓ2204にてＮｏ）使用することのできるセルが不足しているものとして異常終了し、ｎが（Ｎ―Ｕ―3）以下であれば（Ｓ2204にてＹｅｓ）Ｓ2205へと処理が進められる。
【００９３】
Ｓ2205ではｈに1が代入され、（後に更新される）ｈがトレイの個数Ｍ以下であるか否かが判定される（Ｓ2206）。ｈがＭ以下でなければ（Ｓ2206にてＮｏ）使用することのできるトレイが不足しているものとして異常終了し、ｈがＭ以下であれば（Ｓ2206にてＹｅｓ）Ｔ［ｈ］がＮＵＬＬであるか否かが判定される（Ｓ2207）。Ｔ［ｈ］がＮＵＬＬでなければ（Ｓ2207にてＮｏ）ｈに1が加えられ（Ｓ2208）Ｓ2206からの処理が繰り返され、Ｔ［ｈ］がＮＵＬＬであれば（Ｓ2207にてＹｅｓ）Ｓ2209へと処理が進められる。
【００９４】
Ｓ2205〜Ｓ2208での処理により使用されていないトレイに対応するｈが特定され、Ｔ［ｈ］に未使用セルブロックの先頭リファレンスＵ、Ｃ［Ｕ］に（Ｕ＋ｎ＋3）、Ｃ［Ｕ＋1］にｎがそれぞれ代入され、Ｕに（ｎ＋3）が加えられて（Ｓ2209）、セルブロック割り当て部441での処理が終了する。
（これらのようなセルブロック割り当て部441は、必要セル数ｎを3とするアプリケーション部42のＳ22での呼び出しに応じてシステムセルブロックを確保しこのシステムセルブロックの先頭リファレンスを格納するトレイを特定するハンドルｈを出力し、必要セル数ｎを（2×座席数＋1）とする端末部Ａ1〜端末部Ｃ3のＳ2411での呼び出しに応じて候補セルブロックを確保し新たに確保される候補セルブロックの先頭リファレンスを格納するトレイを特定するハンドルｈを出力する。）
上記のセルブロック割り当て部441のＳ2202ではスカビンジ処理部442が呼び出されるが、図12に示すように、スカビンジ処理部442の処理では、まず、ｘに1が代入され（Ｓ31）、Ｃ［ｘ］がＮＵＬＬであるか否かが判定される（Ｓ32）。Ｃ［ｘ］がＮＵＬＬでなければ（Ｓ32にてＮｏ）Ｃ［ｘ＋2］に0が代入されｘがＣ［ｘ］の示す値に更新されて（Ｓ3 3）Ｓ32からの処理が繰り返され、Ｃ［ｘ］がＮＵＬＬであれば（Ｓ32にてＹｅｓ）Ｓ34へと処理が進められる。（ここでは、Ｃ［ｘ＋2］は使用中フラグとして用いられ、これらのＳ31〜Ｓ33での処理は使用されているセルブロックの使用中フラグを0に初期化するものである。）
Ｓ34ではリファレンススタックＳに1がプッシュされ、（後に更新される）Ｓが空であるか否かが判定される（Ｓ35）。Ｓが空でなければ（Ｓ35にてＮｏ）、Ｓにスタックされているリファレンス（使用されているセルブロックの先頭リファレンス）がｒにポップされ（Ｓ36）、ｒがＮＵＬＬであるか否かが判定される（Ｓ37）。ｒがＮＵＬＬであれば（Ｓ37にてＹｅｓ）Ｓ35からの処理が繰り返され、ｒがＮＵＬＬでなければ（Ｓ37にてＮｏ）（セルブロックの構造によりＳ35以下の処理が無限ループとなることを回避するために）さらにＣ［ｒ＋２］が0であるか否かが判定される（Ｓ38）。
【００９５】
Ｃ［ｒ＋2］が0でなければ（Ｓ38にてＮｏ）Ｓ35からの処理が繰り返され、Ｃ［ｒ＋2］が0であれば（Ｓ38にてＹｅｓ）、Ｃ［ｒ＋2］に1が代入され使用されている（と推定された）セルブロックの使用中フラグが1とされ、ｘに0が代入される（Ｓ39）。
続いて、（後に更新される）ｘが（セルブロック内容のサイズを示す）Ｃ［ｒ＋1］の値より小さいか否か（セルブロック内容として含まれるすべてのセルについて以下の処理が行われたか否か）が判定される（Ｓ40）。ｘがＣ［ｒ＋1］の値より小さくなければ（Ｓ40にてＮｏ）、（対象を次のセルブロックとするため）Ｓ35へと処理が移され、ｘがＣ［ｒ＋1］の値より小さければ（Ｓ40にてＹｅｓ）続いてＣ［ｒ＋3＋ｘ］の値が1以上Ｍ以下であるか否か（Ｓ41）およびＴ［Ｃ［ｒ＋3＋ｘ］］の値がＮＵＬＬであるか否か（Ｓ42）が判定される。Ｃ［ｒ＋3＋ｘ］の値が1以上Ｍ以下であり（Ｓ41にてＹｅｓ）かつＴ［Ｃ［ｒ＋3＋ｘ］］の値がＮＵＬＬでない（Ｓ42にてＮｏ）場合に限ってＴ［Ｃ［ｒ＋3＋ｘ］］がリファレンススタックＳにプッシュされ（Ｓ43）、これらの後、ｘに1が加えられｘの値が更新され（Ｓ44）Ｓ40からの処理が繰り返される。
【００９６】
（セルブロックが順次たどられることにより）リファレンススタックＳが空になると（Ｓ35にてＹｅｓ）、再びｘに1が代入され（Ｓ45）、Ｔ［ｘ］がＮＵＬＬであるか否か（Ｓ46）およびＣ［Ｔ［ｘ］＋2］が1であるか否か（Ｔ［ｘ］の指示するセルブロックの使用中フラグが1であるか否か）（Ｓ47）が判定される。
【００９７】
Ｔ［ｘ］がＮＵＬＬでないとき（Ｓ46にてＮｏ）Ｃ［Ｔ［ｘ］＋2］が1でなければ（Ｓ47にてＮｏ）Ｔ［ｘ］にＮＵＬＬガ代入された（Ｓ48）後、また、Ｔ［ｘ］がＮＵＬＬであるとき（Ｓ46にてＹｅｓ）もしくはＣ［Ｔ［ｘ］＋2］が1であれば（Ｓ47にてＹｅｓ）Ｓ48での処理は行われないまま、ｘに1が加えられて（Ｓ49）、ｘがＮ以下であるか否かが判定される（Ｓ50）。ｘがＮ以下であれば（Ｓ50にてＹｅｓ）Ｓ46からの処理が繰り返され、ｘがＮ以下でなければ（Ｓ50にてＮｏ）スカビンジ処理部442での処理は終了し、この後、上記のセルブロック割り当て部441のＳ2203での処理（図11参照）によりコンパクション処理部443が呼び出される。
【００９８】
特に、上記のようなスカビンジ処理部442のＳ41およびＳ42での処理は、セルブロック内容に対するセルがハンドルを保持しているか数値を保持しているかを推測するためものであり、セルの保持する値が（有効）ハンドルの取り得る値でありかつこのハンドルによって特定されるトレイの値がＮＵＬＬでないときに限って、このセルの保持する値がハンドルであるものと推定される。この推定に応じて、Ｓ43では、ハンドルであるものと推定されたセルの値の指示するトレイに格納されているリファレンスが、リファレンススタックＳにプッシュされ、このリファレンスによって特定されるセルブロックが使用中であるものと推定されることとなる。また、上記のようなスカビンジ処理部442のＳ45〜Ｓ50での処理は、使用されていないセルブロックを指示することとなったトレイにＮＵＬＬを代入し未使用トレイとするものである。（Ｓ45〜Ｓ50での処理によりトレイが有効に再利用されることとなる。）
図13（および図14）に示すように、コンパクション処理部443の処理では、まず、ワークＷ（セルブロックの先頭セルのリファレンスに順次使用中のセルブロックの大きさが加算されていく）およびＵ（すべてのセルブロックの先頭セルのリファレンスを順に指示していくよう更新されていく）に1が代入され（Ｓ51）、Ｃ［Ｕ＋2］が1であるか否か（使用中フラグが1であるか否か）が判定される（Ｓ52）。Ｃ［Ｕ＋2］が1であれば（Ｓ52にてＹｅｓ）Ｃ［Ｕ＋2］にＷが代入され（Ｃ［Ｕ＋2］にセルブロック移動後の先頭セルのリファレンスが格納され）Ｗに値（Ｃ［Ｕ＋1］＋3）（セルブロックのサイズ）が加えられた後、また、Ｃ［Ｕ＋2］が1でなければ（Ｓ52にてＮｏ）Ｃ［Ｕ＋2］の値およびＷの値は変更されないまま、ＵにＣ［Ｕ］の値（次に対象とするセルブロックの先頭リファレンスを示す）が代入されてＵが更新され（Ｓ54）、ＵがＮＵＬＬであるか否かが判定される（Ｓ55）。ＵがＮＵＬＬでなければ（Ｓ55にてＮｏ）Ｓ52からの処理が繰り返され、ＵがＮＵＬＬであれば（Ｓ55にてＹｅｓ）Ｓ56へと処理が進められる。（これらのＳ51〜Ｓ55での処理により、セルブロック移動後の先頭セルのリファレンスが算出され各セルブロックに対する所定のワーク（各セルブロックのＣ［ｘ＋2］に対応するセル）に格納される。）
Ｓ56ではｘに1が代入され、Ｔ［ｘ］がＮＵＬＬであるか否かが判定される（Ｓ57）。Ｔ［ｘ］がＮＵＬＬでなければ（Ｓ57にてＮｏ）Ｔ［ｘ］にはＣ［Ｔ［ｘ］＋2］の値（上記の各セルブロックに対するワークの値）が代入された後、また、Ｔ［ｘ］がＮＵＬＬであれば（Ｓ57にてＹｅｓ）Ｔ［ｘ］の値が変更されないまま、ｘがトレイの個数Ｍに等しいか否かが判定される（Ｓ59）。ｘがＭに等しくなければ（Ｓ59にてＮｏ）ｘに1が加えられ（Ｓ60）Ｓ57からの処理が繰り返され、ｘがＭに等しければ（Ｓ59にてＹｅｓ）Ｓ61へと処理が進められる。（これらのＳ56〜Ｓ60での処理により、すべてのＴ［1］〜Ｔ［Ｍ］がセルブロック移動後の先頭セルのリファレンスを指示するよう更新される。）
Ｓ61ではＵ（使用中のセルブロックの先頭セルのリファレンスを順に指示していくよう更新されていく）に1が代入され、Ｃ［Ｕ＋2］の値が0であるか否か（Ｃ［ｘ＋2］によりセルブロックが使用されていないことが示されているか否か）が判定される（Ｓ62）。
【００９９】
Ｃ［Ｕ＋2］の値が0でなければ（Ｓ62にてＮｏ）、Ｃ［Ｃ［Ｕ＋2］］に（Ｃ［Ｕ＋2］＋Ｃ［Ｕ＋1］＋3）が代入され（移動後のセルブロックの先頭セルＣ［ｘ］に（移動後の）次のセルブロックの先頭セルのリファレンスが代入され）（Ｓ63）、Ｃ［Ｕ＋1］〜Ｃ［Ｕ＋Ｃ［Ｕ＋1］＋2］の内容がＣ［Ｃ［Ｕ＋2］＋1］〜Ｃ［Ｃ［Ｕ＋2］＋Ｃ［Ｕ＋1］＋2］にコピーされ（Ｓ64）、Ｓ65へと処理が進められる。Ｃ［Ｕ＋2］の値が0であれば（Ｓ62にてＹｅｓ）、Ｓ63、Ｓ64での処理は行われることなく、Ｓ65へと処理が進められる。
【０１００】
Ｓ65ではＵにＣ［Ｕ］が代入され更新され、ＵがＮＵＬＬであるか否かが判定され（Ｓ66）、ＵがＮＵＬＬでなければ（Ｓ66にてＮｏ）Ｓ62からの処理が繰り返され、ＵがＮＵＬＬであれば（Ｓ66にてＹｅｓ）Ｓ67へと処理が進められる。（これらのＳ61〜Ｓ66での処理により、実際にセルが移動されることとなる。）
Ｓ67ではｘにＷの値（使用されていないセルの先頭リファレンスを示している）が代入され、Ｃ［ｘ］にＮＵＬＬが代入され（Ｓ68）、ｘがセルの個数Ｎに等しいか否かが判定される（Ｓ69）。ｘがＮに等しくなければ（Ｓ69にてＮｏ）ｘに1が加えられて更新され（Ｓ70）、ｘがＮに等しければ（Ｓ69にてＹｅｓ）コンパクション処理部443での処理は終了し、セルブロック割り当て部441のＳ2204からの処理（図11参照）が続けられる。（Ｓ67からＳ69での処理により、リファレンスがＷ以降のセルにＮＵＬＬが代入される。）
これらのようなコンパクション処理部443での処理は、スカビンジ処理部442での処理により使用中ではないと推定されたセルブロックを未使用セルエリアに統合するものである。
【０１０１】
さらに、先述のアプリケーション部42でのＳ24での処理（図9参照）により、端末部Ａ1〜端末部Ｃ3が呼び出される。
図15および図16は端末部Ａ1〜端末部Ｃ3の各々での処理の手順を示すフローチャートであり、図17は端末部Ａ1〜端末部Ｃ1から呼び出されるセル代入部43での処理の手順を示すフローチャートである。
【０１０２】
図15（および図16）に示すように、端末部ｓ（端末部Ａ1〜端末部Ｃ3の各々）では、まず、ユーザにより新たな予約が要求されたか否かが判定される（Ｓ2401）。
新たな予約が要求されれば（Ｓ2401にてＹｅｓ）、Ｃ［Ｔ［Ｃ［4］］＋2＋ｋ］がＮＵＬＬであるか否か（端末部ｓのための候補セルブロックへのリファレンスを格納するハンドルを指示する、システムセルブロックのセルがＮＵＬＬであるか否か）が判定され（Ｓ2407）、Ｃ［Ｔ［Ｃ［4］］＋2＋ｋ］がＮＵＬＬであれば（Ｓ2407にてＹｅｓ）そのままＳ2410へと処理が進められ、Ｃ［Ｔ［Ｃ［4］］＋2＋ｋ］がＮＵＬＬでなければ（Ｓ2407にてＮｏ）、Ｃ［Ｔ［Ｃ［4］］＋2＋ｋ］が指すこととなる候補セルブロック中の仮予約がキャンセルされ（Ｓ2408）、Ｃ［Ｔ［Ｃ［4］］＋2＋ｋ］にＮＵＬＬが代入された（Ｓ2409）後、Ｓ2410へと処理が進められる。
【０１０３】
Ｓ2410ではユーザによる予約座席数の入力が受け付けられてｘに代入され、（セルブロック内容に対応する）必要セル数を（2×ｘ＋1）としてセルブロック割り当て部441が呼び出され（Ｓ2411）、セルブロック割り当て部441では、図11に示すような処理が行われて候補セルブロックに対応するセルブロックが確保される。続いて、入力を異にしてセル代入部43が2度呼び出され（Ｓ2412、Ｓ2413）、（次に図17に示す手順によって）システムセルブロックおよび候補セルブロックのセルブロック内容に対応するセルに値が代入される。
【０１０４】
この後、予約座席数ｘをもとに予約データベースが検索され、2つの候補が仮予約され、仮予約された2つの候補がハンドルｈが指示する候補セルブロックのセルブロック内容として代入され（Ｓ2414）、2つの候補が表示され（Ｓ2415）、端末部ｓでの処理は終了する。
新たな予約が要求されなければ（Ｓ2401にてＮｏ）、（上記のようにして仮予約されることとなる）2つの候補のうちの1つがユーザにより選択されたか否かが判定される（Ｓ2402）。2つの候補のうちの1つが選択されなければ（Ｓ2402にてＮｏ）そのまま端末部ｓでの処理は終了し、2つの候補のうちの1つが選択されれば（Ｓ2402にてＹｅｓ）Ｓ2403へと処理が進められる。
【０１０５】
Ｓ2403では2つの候補のいずれかを特定する選択番号がｘに代入され、Ｃ［Ｔ［Ｃ［4］］＋2＋ｋ］が指示することとなる候補セルブロック内の選択番号ｘに対応する候補が本予約されることとなり（Ｓ2404）、Ｃ［Ｔ［Ｃ［4］］＋2＋ｋ］にＮＵＬＬが代入され、本予約を終了した候補セルブロックを指示するシステムブロック中のセルが未使用の状態とされる（Ｓ2405）。
【０１０６】
これらの後、本予約を完了したことが表示され（Ｓ2406）、端末部ｓでの処理は終了する。
上記の端末部ｓの処理中Ｓ2412、Ｓ2413ではセル代入部43が呼び出されるが、処理に先立ってセルブロックの先頭リファレンスを指示することとなるハンドルｈがｎに、値を代入するセルに対するオフセットがｍに、セルに代入するための値がｖに代入される。図17に示すように、セル代入部43での処理では、まず、Ｔ［ｎ］がＮＵＬＬであるか否か（Ｓ71）およびｍが0以上Ｃ［Ｔ［ｎ］＋1］未満であるか否か（Ｓ72）が判定される。Ｔ［Ｎ］がＮＵＬＬであれば（Ｓ71にてＹｅｓ）ハンドルが異常であるものとして終了され、ｍが0以上Ｃ［Ｔ［ｎ］＋1］未満でなければ（Ｓ72にてＮｏ）オフセットが異常であるものとして終了される。
【０１０７】
Ｔ［ｎ］がＮＵＬＬでなく（Ｓ71にてＮｏ）かつｍが0以上Ｃ［Ｔ［ｎ］＋1］未満であれば（Ｓ72にてＹｅｓ）、Ｃ［Ｔ［ｎ］＋3＋ｍ］にｖが代入され（Ｓ73）、セル代入部43での処理は終了する。（Ｃ［4］をｎに、（ｋ―1）をｍに、ｈをｖに代入してセル代入部43を呼び出す端末部ｓのＳ2412の処理によりシステムセルブロック内のセルへの値の代入が行われ、ｈをｎに、0をｍに、ｘをｖに代入してセル代入部43を呼び出す端末部ｓのＳ2413の処理により端末部ｓに対応する候補セルブロック内のセルへの値の代入が行われる。）
特に、上記のような端末部ｓのＳ2411の処理によりセルブロック割り当て部441が呼び出されて記憶領域上に候補セルブロックが確保される際には、システムセルブロックが確保される際と同様、必要に応じて、本発明のガベージコレクタ44（図8参照）によるスカビンジ処理部442での処理およびコンパクション処理部443での処理が行われる。
【０１０８】
実際、セルの個数を50（説明の便宜上小さな値をとることとしている）、トレイの個数を4とし次に［表2］に示すような端末部Ａ1〜端末部Ｃ3でのユーザの操作を想定すると、図9〜図16に示す本予約システムでの処理は、図18〜図23に示すような記憶領域上のセルの変化を伴うこととなる。
【０１０９】
【表２】
0004050855.tif 000003
【０１１０】
図18は［表2］中の操作Ｉおよび操作ＩＩ終了直後のセルの状態を示す図であり、図19は操作ＩＩＩ終了後から操作ＩＶに際してのスカビンジ処理中Ｓ34の処理（図12参照）直前のセルの状態を示す図であり、図20は操作ＩＶに際してのスカビンジ処理中Ｓ45の処理直前のセルの状態を示す図であり、図21は操作ＩＶに際してのスカビンジ処理終了直後のセルの状態を示す図である。また、図22は操作ＩＶに際してのコンパクション処理中Ｓ61の処理（図13参照）直前のセルの状態を示す図であり、図23は操作ＩＶに際してのコンパクション処理終了直後のセルの状態を示す図である。
【０１１１】
図18に示すように、操作Ｉによって端末部Ａ1から9席の予約が要求され、操作ＩＩによって端末部Ｂ2から4席の予約が要求された直後には、ガベージコレクタ44が管理する記憶領域上の50のセルのうち、44までが使用されていることとなる。
この後、操作ＩＩＩによって端末部Ａ1から候補の1つが選択されると、図19に示すように、これに応じて、システムセルブロック中のリファレンス8の値がＮＵＬＬ（値0）に変更される（端末部Ａ1での図15のＳ2405での処理に対応）。続いて、操作ＩＶによって端末部Ｃ3から7席の予約が要求される（端末部Ｃ3での図15のＳ2410での処理に対応）と、必要セル数15（＝2×ｘ＋1＝2×7＋1）は2（＝Ｎ―Ｕ―3＝50―45―3）以下ではないので、スカビンジ処理およびコンパクション処理を実行する必要があるものと判定される（図11のＳ2201での処理にてＮｏに対応）。
【０１１２】
スカビンジ処理中Ｓ34直前までの処理（図12参照）によると、まず、ルートセルブロック、システムセルブロック、端末Ａ1に対する候補セルブロックおよび端末Ｂ2に対する候補セルブロックの使用中フラグが0に初期化される（ここでは、セルを初期化するＮＵＬＬ値を0としているので使用中フラグの値は変更されない）。
【０１１３】
ガベージコレクタ44（図8参照）は、セルブロック内容を保持するセルの値（ルートセルブロック中セルＣ［4］が保持する値、システムセルブロック中セルＣ［8］〜セル［10］がそれぞれ保持する値、端末部Ａ1に対する候補セルブロック中セルＣ［14］〜セルＣ［32］がそれぞれ保持する値、端末部Ｂ2に対する候補セルブロック中セルＣ［36］〜セルＣ［44］が保持する値）が数値に対応するものであるか、ハンドルに対応するものであるかをあらかじめ確定することができないものであり、Ｓ41での処理およびＳ42での処理によりセルの値が数値に対応するものであるか、ハンドルに対応するものであるかが推測される。（このような推測はセルブロック間の参照関係を特定するために必要である。）
実際、ルートセルブロック中のセルＣ［4］が保持する値1およびシステムセルブロック中のセルＣ［9］が保持する値3は、有効ハンドルが取り得る範囲にあり、この有効ハンドルによって指示されるトレイが保持する値それぞれ5、33がＮＵＬＬ（値0）ではないので、これらのセルＣ［4］およびセルＣ［9］はいずれもハンドルを保持しているものと推定され、（各セルブロックに対応する使用中フラグに1が代入されることにより）これらのハンドルにより指示されるトレイ内の値によって指示されるシステムセルブロックおよび端末部Ｂ2に対する候補セルブロックが使用中であるものと推定されることとなる。
【０１１４】
これに対して、システムセルブロック中のセルＣ［8］およびセルＣ［10］が保持する値0、ならびに、端末部Ａ1に対する候補セルブロック中のセルＣ［14］が保持する値9は、有効ハンドルが取り得る範囲になく、また、端末部Ｂ2に対する候補セルブロック中のセルＣ［36］が保持する値4は、有効ハンドルが取り得る範囲にあるもののこれにより指示されるトレイには0が保持されており、これらのセルＣ［8］、セルＣ［10］、セルＣ［14］およびセルＣ［36］はいずれも数値を保持しているものと推測される。
（端末部Ａ1に対する候補セルブロックのセルブロック内容を示すセルＣ［15］〜セルＣ［32］および端末部Ｂ1に対する候補セルブロックのセルブロック内容であるセルＣ［37］〜セルＣ［44］に対しても同様の推測が行われる。）
これらのようなセルブロック内容に対応するセルの値についての推測によると、図20に示すように、使用中であると推定された（トレイにより指示されていると推定された）各セルブロックの使用中フラグ（セルＣ［3］、セルＣ［7］およびセルＣ［35］）に1が代入されることとなる。この後、スカビンジ処理中Ｓ45以降の処理により、使用されていないと推測されたセルブロックを指示するトレイＴ［2］の値がＮＵＬＬとされ、セルは図21に示すような状態となる。
【０１１５】
これらのようにセルの値が数値であるかハンドルであるかの推測を伴うスカビンジ処理によりセルブロックの参照関係が推定され、この後に行われるコンパクション処理により、セルは、図22に示す状態を経て図23に示す状態となり、操作ＩＶに際して要求された7席分の座席に対する座席番号（および座席数）を記憶するための領域を確保できる状態となる。
【０１１６】
以上のように、本予約システムは、座席の予約というアプリケーションの動作に直接かかわる部分（アプリケーション部42、初期化部41、セル代入部43および端末部Ａ1〜端末部Ｃ3）と、アプリケーションからの要求に応じて記憶領域の確保および開放を行うガベージコレクタ44とを含み、ガベージコレクタ44は、（セルブロックの確保を指示されること以外）他の部分とは独立して動作する。特に、ガベージコレクタ44は、（リファレンスフラグ等を用いることなく）セル内容が数値であるかハンドルであるかを推測しつつスカビンジ処理を行うものであるため、リファレンスフラグ等のための領域の確保を不要とし、アプリケーションの実行に際してプロセッサに過大な負荷をかけることを防止することができ、また、高速なコンパクションを有効に行うことができる。
【０１１７】
続いて、これらのようなガベージコレクタ44の変形例を説明する。本変形例のガベージコレクタでは、各トレイに対して使用禁止フラグが設定され、これらの使用禁止フラグが用いられつつセルブロックの割り当てが行われる。（本変形例のガベージコレクタの構成、動作等は、以下に示すものを除いてガベージコレクタ44に準ずるものとする。）
図24は本変形例のガベージコレクタの実行に先立って行われる初期化部での処理（図10に示す処理に対応）を示すフローチャートであり、図25は本変形例のガベージコレクタのセルブロック割り当て部での処理（図11に示す処理に対応）を示すフローチャートであり、図26は本変形例のガベージコレクタのセル代入部での処理（図17に示す処理に対応）を示すフローチャートである。
【０１１８】
本変形例のガベージコレクタに対する予約システムの初期化部では、図24のＳ3106の処理として示すように、トレイＴ［ｘ］がＮＵＬＬに初期化されるに伴いこのトレイに対応する使用禁止フラグＤ［ｘ］が0に初期化される。
本変形例のガベージコレクタのセル代入部では、図26のＳ3074およびＳ3075の処理として示すようにして、使用されるセルに代入される値がハンドルに対応する値の範囲にあり、かつ、そのハンドルに対応するトレイがＮＵＬＬを保持している場合、このトレイの使用を禁止するため、対応する使用禁止フラグＤ［ｘ］に1が代入される。
【０１１９】
また、セルブロック割り当て部では、図25のＳ3207の処理として示すように、ＮＵＬＬを保持しかつ対応する使用禁止フラグが0であるトレイに対して、新たに割り当てられるセルブロックに対応するハンドルｈが特定されることとなる。さらに、セルブロック割り当て部では、Ｓ3210〜Ｓ3215の処理として示すように、ｈがトレイの個数Ｍ以下でなければ（Ｓ3206にてＮｏ）すべての使用禁止フラグが0とされてトレイの使用の禁止が解除され、再びＳ3205からの処理が行われる。
【０１２０】
まず、ワークフラグｆに０、ｉに1が代入され（Ｓ3210）、トレイＴ［ｉ］に対応する使用禁止フラグＤ［ｉ］が1であるか否かが判定される（Ｓ3211）。Ｄ［ｉ］が1であれば（Ｓ3211にてＹｅｓ）ｆに1が代入されＤ［ｉ］に0が代入された（Ｓ3212）後、また、Ｄ［ｉ］が1でなければ（Ｓ3211にてＮｏ）Ｓ3212での処理は行われることないまま、ｉがトレイの個数Ｍに等しいか否かが判定される（Ｓ3213）。ｉがＭに等しくなければ（Ｓ3213にてＮｏ）ｉに1が加えられてＳ3211からの処理が繰り返され、ｉがＭに等しければ（Ｓ3213にてＹｅｓ）続いてｆが1であるか否かが判定される（Ｓ3215）。
【０１２１】
ｆが1でなければ（Ｓ3215にてＮｏ）トレイが不足しているものとして異常終了し、ｆが1であれば（Ｓ3215にてＹｅｓ）Ｓ3205へと処理が進められ、これ以降の処理によって、ＮＵＬＬを保持しかつ対応する使用禁止フラグが0に変更されたトレイに対して、新たに割り当てられるセルブロックに対応するハンドルｈが特定されることとなる。
【０１２２】
すなわち、上記のようなセル代入部での処理により、後のスカビンジ処理にて数値と推測されるであろう、セルの値に対応するトレイを使用禁止とし、また、上記のようなセルブロック割り当て部での処理により、ＮＵＬＬを保持しかつ対応する使用禁止フラグが0であるトレイのみに対して、新たに割り当てられるセルブロックに対応するハンドルｈを特定することにより、スカビンジ処理部でのセル内容の推測をより適切に行わせることができる。
【０１２３】
より詳細には、ガベージコレクタ44のスカビンジ処理部での処理では、セル内の値がハンドルに対応する値の範囲にあって、かつ、このセル内の値をハンドルであるとみなしたときこのハンドルによって特定されるトレイがＮＵＬＬを保持していないときに限って、セルがハンドルを保持していると推測される。ハンドルに対応する値の範囲にある数値がセルに代入されるとき、この数値をハンドルとみなしたときにこのハンドルによって特定されるトレイがＮＵＬＬを保持している場合にこのトレイに対応する使用禁止フラグを1とすることにより、トレイの使用が禁止されトレイはＮＵＬＬを保持したままとなるので、ハンドルに対応する値の範囲にあるセル内の数値がハンドルであると誤推測されることが防止されることとなり、セルの開放が遅延することを防止することができる。
【０１２４】
さらに、使用することのできるトレイがなくなった際には、使用禁止フラグによるトレイの使用の禁止が解除され、使用されていないセルの開放の遅延を防止しつつ、トレイを有効に利用することができることとなる。
【０１２５】
【発明の効果】
本発明に係るガベージコレクション装置は、第1種アドレスにより特定され第2種アドレスおよび第2種アドレス以外の数値のいずれかのデータを保持するセルからなる複数のセルブロックのうち、第2種アドレスにより特定され第1種アドレスを保持するトレイを介して他のセルブロックへの参照を繰り返すことにより所定のルートセルブロックからたどることのできるセルブロック以外の、未使用セルブロックを特定するスカビンジ処理と、前記特定された未使用セルブロックおよびスカビンジ処理に先立ちデータを保持しない連続する複数のセルが1つの連続する領域として配置されるよう、第1種アドレスおよびセルからなるメモリ上でセルブロックを移動させ、セルブロックの移動前後にて前記参照の関係が保たれるよう、トレイに保持されている第1種アドレスを更新するコンパクション処理とを行う。
【０１２６】
本ガベージコレクション装置では、第1セルブロックに含まれるセルが第2種アドレスを保持しているか否かを、第2種アドレスが保持されている際に第2種アドレスが保持されていないと誤ることがないよう推測し、第2種アドレスを保持していると推測されたセルにより指示されるトレイが保持する、第1種アドレスに対応するセルを含む第2セルブロックを、第1セルブロックから参照があるものと推定することによって、前記スカビンジ処理での未使用セルブロックの特定が行われる。
【０１２７】
これにより、セルの特定にトレイ（間接アドレッシング）が用いられ、コンパクション処理ではトレイに保持されている第1種アドレスが更新されることとなり、セル自体の内容が更新されることはなく、（第3の従来例のガベージコレクタとは異なり）有効に高速にコンパクションを行うことができる。また、これらのスカビンジ処理、コンパクション処理に際しては、（第1の従来例のガベージコレクタおよび第2の従来例のガベージコレクタのように）リファレンスフラグ等を用いてアプリケーションと情報交換することがないので、リファレンスフラグのための領域を確保する必要がなく、セルを利用するアプリケーションの実行に対して過大な負荷となることが防止される。
【０１２８】
上記のガベージコレクション装置では、前記スカビンジ処理により新たに特定された未使用セルブロックを指示することとなったトレイを、第1種アドレスを保持しない未使用トレイとするものとすることができる。
これにより、上記のような効果に加えて、新たにセルの使用が要求されたとき使用を終えたトレイが有効に再利用されることとなる。
【０１２９】
また、上記のガベージコレクション装置では、セルが保持しているデータが第2種アドレスに対応する範囲にあり、かつ、前記データを第2種アドレスとみなしたとき指示されることとなるトレイが未使用トレイでないときに限って、前記データが第2種アドレスであると、前記推測を行い、新たにセルに代入される数値を第2種アドレスとみなしたとき、前記第2種アドレスによって指示されることとなるトレイの使用を禁止するものとすることができる。
【０１３０】
これにより、先述のような効果に加えて、新たにセルに代入される数値に対応するトレイの使用が禁止され、（セルに代入されるデータによって特定されるトレイが未使用トレイであるか否かが推測の際に判定されるため、）第2種アドレスと同一の範囲内にある数値を第2種アドレスと誤って推測することが回避されることとなる。
【０１３１】
さらに、上記のガベージコレクション装置では、第1種アドレスを保持することまたは使用が禁止されていることにより所定の個数のトレイが使用できない際、新たなトレイの使用が要求されたときに、前記トレイに対する使用の禁止をすべて解除するものとすることができる。
これにより、先述のような効果に加えて、誤推測が回避されつつ、加えて使用を終えたトレイが有効に再利用されることとなる。
【図面の簡単な説明】
【図１】本発明の実施例の1つであるガベージコレクタが用いるヒープ領域の構成を説明するための図である。
【図２】ヒープ領域を構成するセルに格納される内容の例およびこれらのセル間の参照関係を示す図である。
【図３】本ガベージコレクタが用いるヒープ領域にて割り当てられるセルブロックの例およびこれらのセルブロック間の参照関係を示す図である。
【図４】図3に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。
【図５】本ガベージコレクタが行うスカビンジ処理の手順を示す第1のフローチャートである。
【図６】本ガベージコレクタが行うスカビンジ処理の手順を示す第2のフローチャートである。
【図７】本発明に係るガベージコレクタを用いる予約システムの構成の概略を示す図である。
【図８】本予約システムに含まれる予約データベース管理部4の構成を説明するための図である。
【図９】アプリケーション部42での処理の手順を示すフローチャートである。
【図１０】初期化部41での処理の手順を示すフローチャートである。
【図１１】セルブロック割り当て部441での処理の手順を示すフローチャートである。
【図１２】セルブロック割り当て部441から呼び出されるスカビンジ処理部442での処理の手順を示すフローチャートである。
【図１３】セルブロック割り当て部441から呼び出されるコンパクション処理部443での処理の手順を示す第1のフローチャートである。
【図１４】コンパクション処理部443での処理の手順を示す第2のフローチャートである。
【図１５】端末部Ａ1〜端末部Ｃ3の各々での処理の手順を示す第1のフローチャートである。
【図１６】端末部Ａ1〜端末部Ｃ3の各々での処理の手順を示す第2のフローチャートである。
【図１７】端末部Ａ1〜端末部Ｃ1から呼び出されるセル代入部43での処理の手順を示すフローチャートである。
【図１８】［表2］中の操作Ｉおよび操作ＩＩ終了直後のセルの状態を示す図である。
【図１９】操作ＩＩＩ終了後から操作ＩＶに際してのスカビンジ処理中Ｓ34の処理（図12参照）直前のセルの状態を示す図である。
【図２０】操作ＩＶに際してのスカビンジ処理中Ｓ45の処理直前のセルの状態を示す図である。
【図２１】操作ＩＶに際してのスカビンジ処理終了直後のセルの状態を示す図である。
【図２２】操作ＩＶに際してのコンパクション処理中Ｓ61の処理（図13参照）直前のセルの状態を示す図である。
【図２３】操作ＩＶに際してのコンパクション処理終了直後のセルの状態を示す図である。
【図２４】本変形例のガベージコレクタの実行に先立って行われる初期化部での処理（図10に示す処理に対応）を示すフローチャートである。
【図２５】本変形例のガベージコレクタのセルブロック割り当て部での処理（図11に示す処理に対応）を示すフローチャートである。
【図２６】本変形例のガベージコレクタのセル代入部での処理（図17に示す処理に対応）を示すフローチャートである。
【図２７】ガベージコレクタが用いるヒープ領域の構成を説明するための図である。
【図２８】ヒープ領域を構成するセルに格納される内容の例を示す図である。
【図２９】複数のセルから構成されるセルブロックの例を示す図である。
【図３０】図29（ｂ）に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。
【図３１】第1の従来例のガベージコレクタが用いるヒープ領域の構成を説明するための図である。
【図３２】ヒープ領域を構成するセルに格納される内容の例およびこれらのセル間の参照関係を示す図である。
【図３３】第1の従来例のガベージコレクタが用いるヒープ領域にて割り当てられるセルブロックの例およびこれらのセルブロック間の参照関係を示す図である。
【図３４】図33に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。
【図３５】第1の従来例のガベージコレクタが行うスカビンジ処理Ａの手順を示すフローチャートである。
【図３６】第1の従来例のガベージコレクタが行うコンパクション処理Ａの手順を示す第1のフローチャートである。
【図３７】第1の従来例のガベージコレクタが行うコンパクション処理Ａの手順を示す第2のフローチャートである。
【図３８】第2の従来例のガベージコレクタが用いるヒープ領域の構成を説明するための図である。
【図３９】ヒープ領域を構成するセルに格納される内容およびトレイに格納される内容の例ならびにこれらのセル間の参照関係を示す図である。
【図４０】第2の従来例のガベージコレクタが用いるヒープ領域にて割り当てられるセルブロックの例およびこれらのセルブロック間の参照関係を示す図である。
【図４１】図40に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。
【図４２】第2の従来例のガベージコレクタが行うコンパクション処理Ｂの手順を示すフローチャートである。
【図４３】第3の従来例のガベージコレクタが用いるヒープ領域のセルに格納される内容の例を示す図である。
【図４４】第3の従来例のガベージコレクタが用いるヒープ領域にて割り当てられるセルブロックの例およびこれらのセルブロック間の参照関係を示す図である。
【図４５】図44に示す状態のヒープ領域に対するガベージコレクションを説明するための図である。
【図４６】第3の従来例のガベージコレクタが行うスカビンジ処理Ｂの手順を示すフローチャートである。
【符号の説明】
1  端末部Ａ
2  端末部Ｂ
3  端末部Ｃ
4  予約データベース管理部
41  初期化部
42  アプリケーション部
43  セル代入部
44  ガベージコレクタ
441  セルブロック割り当て部
442  スカビンジ処理部
443  コンパクション処理部
【図１】
0004050855.tif 000004
【図２】
0004050855.tif 000005
【図３】
0004050855.tif 000006
【図４】
0004050855.tif 000007
【図５】
0004050855.tif 000008
【図６】
0004050855.tif 000009
【図７】
0004050855.tif 000010
【図８】
0004050855.tif 000011
【図９】
0004050855.tif 000012
【図１０】
0004050855.tif 000013
【図１１】
0004050855.tif 000014
【図１２】
0004050855.tif 000015
【図１３】
0004050855.tif 000016
【図１４】
0004050855.tif 000017
【図１５】
0004050855.tif 000018
【図１６】
0004050855.tif 000019
【図１７】
0004050855.tif 000020
【図１８】
0004050855.tif 000021
【図１９】
0004050855.tif 000022
【図２０】
0004050855.tif 000023
【図２１】
0004050855.tif 000024
【図２２】
0004050855.tif 000025
【図２３】
0004050855.tif 000026
【図２４】
0004050855.tif 000027
【図２５】
0004050855.tif 000028
【図２６】
0004050855.tif 000029
【図２７】
0004050855.tif 000030
【図２８】
0004050855.tif 000031
【図２９】
0004050855.tif 000032
【図３０】
0004050855.tif 000033
【図３１】
0004050855.tif 000034
【図３２】
0004050855.tif 000035
【図３３】
0004050855.tif 000036
【図３４】
0004050855.tif 000037
【図３５】
0004050855.tif 000038
【図３６】
0004050855.tif 000039
【図３７】
0004050855.tif 000040
【図３８】
0004050855.tif 000041
【図３９】
0004050855.tif 000042
【図４０】
0004050855.tif 000043
【図４１】
0004050855.tif 000044
【図４２】
0004050855.tif 000045
【図４３】
0004050855.tif 000046
【図４４】
0004050855.tif 000047
【図４５】
0004050855.tif 000048
【図４６】
0004050855.tif 000049