(57)【特許請求の範囲】
【請求項１】
アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、各メモリセル内に設けた被参照カウンタを用いてリファレンスカウント方式によりガベージコレクションを行うリファレンスカウント手段と、
アプリケーションプログラムの実行とは独立して１以上のメモリセルについて、当該メモリセルが現実に参照されている数を調査する独立カウント手段と、
前記独立カウント手段による調査結果である数を、対応するメモリセルの被参照カウンタに設定する設定手段とを備え、
前記各メモリセル内に設けられた被参照カウンタは、当該メモリセルの被参照数を表すための、１ワード未満の所定ビット数で構成され、
前記リファレンスカウント手段は、アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、当該メモリセルの被参照カウンタが前記所定ビット数で表せる最大値より小さい値であれば、当該被参照カウンタを当該変更に応じて被参照数を表すように増加又は減少させて、被参照カウンタの値が０になれば当該メモリセルを解放し、
前記独立カウント手段は、少なくとも被参照カウンタが前記最大値である各メモリセルについて前記調査を行い、
前記メモリセル内には、独立カウント手段による調査に用いるための前記所定ビット数の調査用カウンタを設けてあり、
前記独立カウント手段は、
調査対象のメモリセルの調査用カウンタを０にする初期設定処理の後に、
所定のルートポインタから直接又はポインタチェーンを介して指されている各メモリセルについての調査用カウンタを、前記所定ビット数で表せる最大値を超えない範囲で、現実に指されている数を示すように増加するカウント処理を行うことにより前記調査を行い、
前記設定手段は、メモリセル毎に、当該メモリセルの調査用カウンタの値を被参照カウンタに設定し、
前記メモリセル内には、独立カウント手段による調査状態が第１段階、第２段階及び第３段階のいずれであるかを示すための作業フラグを設けてあり、
前記独立カウント手段は、
全てのメモリセルの作業フラグに第１段階を示す値を設定し、続いて前記ルートポインタに指されているメモリセルの作業フラグに第２段階を示す値を設定し、
第２段階を示す作業フラグを含むメモリセルがある限り当該メモリセルに順次着目して以下に示すカウントアップ処理を実行する
ことにより前記カウント処理を行い、
前記カウントアップ処理は、着目したメモリセルの作業フラグに第３段階を示す値を設定し、当該メモリセルが他の１以上のメモリセルへのポインタを含むときに当該他の全てのメモリセルについての前記調査用カウンタを前記最大値を超えない限りにおいて１増加するとともに、当該他のメモリセルのうち作業フラグが第１段階を示すものについては作業フラグに第２段階を示す値を設定する処理であり、
前記リファレンスカウント手段は、アプリケーションプログラムの実行により、第３段階を示す作業フラグを含むメモリセルに含まれるポインタが変更された時に、変更前のポインタが指していたメモリセルの調査用カウンタを１減少するとともに、変更後のポインタが指すメモリセルの調査用カウンタを前記最大値を超えない限りにおいて１増加し、
前記独立カウント手段は、前記調査をアプリケーションプログラムの実行と並行して行い、前記カウントアップ処理の実行中はアプリケーションプログラムの実行を抑止する
ことを特徴とするガベージコレクション装置。
【請求項２】
アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、各メモリセル内に設けた被参照カウンタを用いてリファレンスカウント方式によりガベージコレクションを行うリファレンスカウント手段と、
アプリケーションプログラムの実行とは独立して１以上のメモリセルについて、当該メモリセルが現実に参照されている数を調査する独立カウント手段と、
前記独立カウント手段による調査結果である数を、対応するメモリセルの被参照カウンタに設定する設定手段とを備え、
前記各メモリセル内に設けられた被参照カウンタは、当該メモリセルの被参照数を表すための、１ワード未満の所定ビット数で構成され、
前記リファレンスカウント手段は、アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、当該メモリセルの被参照カウンタが前記所定ビット数で表せる最大値より小さい値であれば、当該被参照カウンタを当該変更に応じて被参照数を表すように増加又は減少させて、被参照カウンタの値が０になれば当該メモリセルを解放し、
前記独立カウント手段は、少なくとも被参照カウンタが前記最大値である各メモリセルについて前記調査を行い、
前記メモリセル内には、独立カウント手段による調査に用いるための前記所定ビット数の調査用カウンタを設けてあり、
前記独立カウント手段は、
調査対象のメモリセルの調査用カウンタを０にする初期設定処理の後に、
所定のルートポインタから直接又はポインタチェーンを介して指されている各メモリセルについての調査用カウンタを、前記所定ビット数で表せる最大値を超えない範囲で、現実に指されている数を示すように増加するカウント処理を行うことにより前記調査を行い、
前記設定手段は、メモリセル毎に、当該メモリセルの調査用カウンタの値を被参照カウンタに設定し、
前記メモリセル内には、独立カウント手段による調査状態が第１段階及び第２段階のいずれであるかを示すための作業フラグを設けてあり、
前記独立カウント手段は、
メモリセルのアドレスをスタックに格納するアルゴリズムを用いて、
全てのメモリセルの作業フラグに第１段階を示す値を設定し、続いて前記ルートポインタに指されているメモリセルのアドレスをスタックに積み、
スタックにメモリセルのアドレスが積まれている限り以下に示すカウントアップ処理を実行する
ことにより前記カウント処理を行い、
前記カウントアップ処理は、スタックから取り出したアドレスの示すメモリセルの作業フラグに第２段階を示す値を設定し、当該メモリセルが他の１以上のメモリセルへのポインタを含むときに当該他の全てのメモリセルについての前記調査用カウンタを、前記最大値を超えない限り１増加するとともに、当該他のメモリセルのうち作業フラグが第１段階を示すものについてはそのアドレスをスタックに積む処理であり、
前記リファレンスカウント手段は、アプリケーションプログラムの実行により、第２段階を示す作業フラグを含むメモリセルに含まれるポインタが変更された時に、変更前のポインタが指していたメモリセルの調査用カウンタを１減少するとともに、変更後のポインタが指すメモリセルの調査用カウンタを、前記最大値を超えない限りにおいて１増加し、
前記独立カウント手段は、前記調査をアプリケーションプログラムの実行と並行して行い、前記カウントアップ処理の実行中はアプリケーションプログラムの実行を抑止する
ことを特徴とするガベージコレクション装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、アプリケーションプログラムが使用したメモリについてのガベージコレクションに関し、特にリファレンスカウント方式を用いるガベージコレクションの技術に関する。
【０００２】
【従来の技術】
従来のプログラミング言語には、アプリケーションプログラムの作成者にメモリ領域の確保や解放を意識させず、アプリケーションプログラムが使用した後に不要となったメモリ領域の解放を実行環境側に任せる方法を採るものがある。例えばＪａｖａ言語である。なお、Ｊａｖａは米国Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ社の商標である。
【０００３】
このような言語を用いて記述されたアプリケーションプログラムは、不要となったメモリ領域を自動的に解放するガベージコレクション機構を備える実行環境上で動かされる。
ガベージコレクション機構は、アプリケーションプログラムの実行に際して動的に確保されたメモリセル（以下、単に「セル」という。）がどこからも参照されていない状態になっていることを検出してそのセルを解放し再利用可能状態にする。この一度確保されたセルを解放して再利用可能状態にすることを、セルを回収するともいう。
【０００４】
ここで、セルとは、アプリケーションプログラムが実行時に動的に用いることのできるヒープ領域を細分化した単位をいう。各セルは、例えばオブジェクト指向プログラミング言語におけるいわゆるオブジェクトインスタンスに対応するひとまとまりの可変長領域であり、各セルの内容は、データとデータ型との組の集合である部分と、セルが有効であるか否かを示す有効セルフラグ等を含む管理用の情報である部分とからなる。
【０００５】
なお、データ型は、対応するデータが例えば整数、論理値、ポインタ等のいずれであるかの別を示すものであり、以下、ポインタ型のデータを単に「ポインタ」ともいう。また、有効セルフラグはセルが確保された時から有効を示す値をとりセルが解放された時点でガベージコレクション機構により無効を示す値にされるフラグである。
【０００６】
セルの参照は、そのセルへのポインタを保持することによりなされ、例えば、セルＡからセルＢを参照する場合には、セルＡはセルＢのポインタを内容として含む。
ある時点においてアプリケーションプログラムにより参照されている全てのセルは、１又は複数のルートポインタなるポインタから、直接又は１以上のセル内のポインタを媒介にして、辿ることができる。ここで、ルートポインタは、例えばアプリケーションプログラム全体やその一部を単位としてその単位毎に定められ、アプリケーションプログラムの実行環境によって、その単位毎に最初に確保されたセルのメモリアドレスがルートポインタに格納される。
【０００７】
従って、ガベージコレクション機構は、ある時点においてルートポインタから辿れなくなっているセルを不要なものとして回収対象にする。
以下、従来のガベージコレクションの方式について説明する。
＜0-1．マークアンドスイープ方式＞
マークアンドスイープ方式は、公開特許公報（特開平１１−２３２１６２号）に開示されており、ルートポインタから辿れる全てのセルにマークを付けていく処理を行った後に、全てのセルを走査して、マークの付いていないセルを回収する方式である。
【０００８】
図２７は、従来のマークアンドスイープ方式を説明するための図である。
同図では、アプリケーションプログラムによってセルＭ１〜Ｍ７が生成された後に、セルＭ３及びＭ５が不要となった状態を示している。なお、同図中、セルを参照するポインタの所在部分を起点とし、参照されるそのセルに向かう矢印線によって、参照関係を表している。
【０００９】
ガベージコレクション機構は、カベージコレクションを開始すると、まず、ルートポインタＲＰから直接又はセル内のポインタを介して、辿ることのできる全てのセルにマークを付ける。例えばセル内の管理用の情報部分にマークの有無を表すビット領域を設けておき、初期値としてはマーク無しを表す値にしておき、マークを付加する場合にそのビット領域をマーク有りを表す値に変更する。
【００１０】
これにより、セルＭ１、Ｍ２、Ｍ４、Ｍ６及びＭ７にはマーク（Ｍａｒｋ）が付されることになる。
その後に、ガベージコレクション機構は、マークの付いていないセルを走査して解放する。なお、このマークの付いていないセルの走査の際に、ガベージコレクション機構は、次回のガベージコレクションのために、マークが付いているセルからマークを削除する処理も行う。
【００１１】
これにより、マークの付いていなかったセルＭ３及びＭ５が検出され、このセルＭ３及びＭ５が解放されることになる。
このマークアンドスイープ方式によるガベージコレクションは全てのセルを走査するものであることから、頻繁に実行されると、アプリケーションプログラムの実行性能を著しく低下させる。このため、ガベージコレクション機構は、通常は、ある程度期間をおいて、或いはアプリケーションプログラムと並行して少しずつ、マークアンドスイープ方式によるガベージコレクションを実行する。従って、必然的に、不要になったセルの回収が遅くなる。
【００１２】
＜0-2．リファレンスカウント方式＞
リファレンスカウント方式は、セル毎にそのセルが何箇所から参照されているかを示すカウント値（以下、「リファレンスカウンタ」という。）をセル内の管理用の情報部分に記憶することとし、セルを指すポインタの変更等により参照関係が変化する度にそれに応じてリファレンスカウンタを増加又は減少させ、リファレンスカウンタが０になった時点でそのセルを回収する方式である。
【００１３】
具体的には、あるセル内のポインタが既にいずれかのセルを指している場合において、アプリケーションプログラムの実行過程においてそのポインタの値が他の値に変更されると、ガベージコレクション機構が、元のポインタ値がＮＵＬＬでない限り元のポインタ値により指していたセル内のリファレンスカウンタを１減少し、新たなポインタ値がＮＵＬＬでない限り新たにポインタ値によって指すセル内のリファレンスカウンタを１増加する。
【００１４】
こうして、ガベージコレクション機構は、リファレンスカウンタが０になったセルについては、ルートポインタから辿ることのできなくなったもの即ち不要なものとみなして解放する。なお、セルの解放の際にそのセル内に含まれていたポインタはＮＵＬＬに変更されたものとして再帰的に、前述の、元のポインタ値がＮＵＬＬでない限り元のポインタ値により指していたセル内のリファレンスカウンタを１減少する処理を実行する。
【００１５】
図２８は、従来のリファレンスカウント方式を説明するための図である。
同図は、状態９０１、状態９０２、状態９０３の順に状態が遷移することを示している。なお、同図中、セルを参照するポインタの所在部分を起点とし、参照されるそのセルに向かう矢印線によって、参照関係を表しており、また、各セル内の数値は、そのセルが参照されている数であるリファレンスカウンタを示している。
【００１６】
状態９０１においては、同図では、アプリケーションプログラムによってセルＭ１〜Ｍ７が使用されている状態を示しており、セルＭ５はセルＭ４からのみ参照されているためセルＭ５のリファレンスカウンタは１である。
この状態９０１は、アプリケーションプログラムがいわゆる代入文等を実行してセルＭ４の保持するポインタを、セルＭ５を指す値から、セルＭ６を指す値に変更すると、状態９０２に遷移する。このポインタの変更に際してガベージコレクション機構により、セルＭ５のリファレンスカウンタが１減じられて０になり、セルＭ６のリファレンスカウンタが１増やされ２になる。
【００１７】
続いて、ガベージコレクション機構はリファレンスカウンタが０になったセルＭ５を解放し、セルＭ５が保持していたポインタが指していたセルＭ３のリファレンスカウンタを１減じて０にし、リファレンスカウンタが０になったセルＭ３を解放する。状態９０３はこの結果を表している。
リファレンスカウンタは、セルが参照される可能性のある最大数を表現できるものでなければならないため、一般に１ワード程度の領域がリファレンスカウンタ用として用いられる。
【００１８】
このリファレンスカウント方式によるガベージコレクションは、基本的には不要になったセルを即座に回収することができるという利点を有するが、セル毎にリファレンスカウンタ用に１ワード程度の領域を要するため全体ではガベージコレクションのみのために多くのメモリ領域を必要とする欠点をも有する。
なお、リファレンスカウント方式には、セルへのポインタのチェーンがループしている場合に、ルートポインタから辿ることのできなくなっているセルであるにも拘わらずリファレンスカウンタが０にならないため、その不要なセルを解放できないという問題がある。この問題を解決するために、リファレンスカウント方式を用いる場合にはマークアンドスイープ方式を併せて用いることもある。
【００１９】
＜0-3．カウンタを制限したリファレンスカウント方式＞
次に、リファレンスカウンタ用のメモリ領域の縮小を図り上述のリファレンスカウント方式の欠点を補った方式（以下、「カウンタ制限リファレンスカウント方式」という。）について説明する。この方式は、公開特許公報（特開平５−３２４４５６号）に開示されている。
【００２０】
カウンタ制限リファレンスカウント方式では、セル毎のリファレンスカウンタは０〜７を表すことができる３ビットのみとし、基本的に上述のリファレンスカウント方式と同様の処理手順を実行する。但し、リファレンスカウンタがオーバフローしたセルについては、即ち参照される数が７を超えたセルについては、オーバフローした時にリファレンスカウンタのビットを削除した形に整形してガベージコレクションの対象外のメモリ領域にコピーするとともに、元のセルを解放する。なお、ガベージコレクションの対象外のメモリ領域においたセルについては、ガベージコレクション機構は、リファレンスカウンタの操作やセルの回収を行わない。
【００２１】
このカウンタ制限リファレンスカウント方式によるガベージコレクションは、リファレンスカウンタ用のビット数を抑えてはいるが、そのリファレンスカウンタがオーバフローしたセルが増えると回収されないセルが増加するため、アプリケーションプログラムが新たにセルを確保することができない事態が発生し得るという問題を有する。
【００２２】
【発明が解決しようとする課題】
上述したように、ガベージコレクションにマークアンドスイープ方式のみを用いる場合には、不要になったセルの回収が遅いという問題が生じる。
この問題を解決するリファレンスカウント方式は、リファレンスカウンタ用に必要となるメモリ量が大きいという欠点を有する。
【００２３】
このリファレンスカウント方式の欠点をある程度解消するカウンタ制限リファレンスカウント方式は、使用されるセルのうち小数の例外を除く大部分のセルについて、そのセルが参照される数がある程度小さく、１ワードに対して比較的少ないビット数でその参照される数を表すことができる場合においては有効である。
【００２４】
しかしながら、カウンタ制限リファレンスカウント方式は、大部分のセルの参照される数が、たとえ瞬間的にでも、非常に大きくなる場合には、その参照される数を比較的少ないビット数で表そうとするとオーバフローして大部分のセルが回収不可能なものになってしまうためあまり有効ではない。以下、このような場合の例を挙げる。
【００２５】
図２９は、Ｊａｖａにおける典型的なセルへの参照数の時間的変化を示すグラフである。
同図に示すように、Ｊａｖａ言語により作成された一般的なアプリケーションプログラムにおいては、オブジェクトを定義するクラスが通常は複数階層にわたって他のクラスを継承していることと関連して、オブジェクトの生成後の初期化段階で、生成元のセルへの参照の数は急増し、初期化が終わった後にはその生成元のセルへの参照ポインタを持つセルが消滅してゆき、その後の時間ではその生成元のセルの参照される数は小さい値の範囲で微動する。
【００２６】
このようなアプリケーションプログラムを実行する場合においては、カウンタ制限リファレンスカウント方式は、リファレンスカウンタとして小さいビット数を用いることができなくなるため、有効ではない。
そこで、本発明はかかる問題点に鑑みてなされたものであり、アプリケーションプログラムの動作によりセルの参照される数が瞬間的に大きなピーク値をとるような場合にも有効なガベージコレクション方法、及びその方法を用いるガベージコレクション装置を提供することを目的とする。
【００２７】
【課題を解決するための手段】
上記目的を達成するために、本発明に係るガベージコレクション装置は、アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、各メモリセル内に設けた被参照カウンタを用いてリファレンスカウント方式によりガベージコレクションを行うリファレンスカウント手段と、アプリケーションプログラムの実行とは独立して１以上のメモリセルについて、当該メモリセルが現実に参照されている数を調査する独立カウント手段と、前記独立カウント手段による調査結果である数を、対応するメモリセルの被参照カウンタに設定する設定手段とを備えることを特徴とする。
【００２８】
また、本発明に係るガベージコレクション方法は、アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、各メモリセル内に設けられた被参照カウンタを用いてリファレンスカウント方式によりガベージコレクションを行うリファレンスカウントステップと、アプリケーションプログラムの実行とは独立して１以上のメモリセルについて、当該メモリセルが現実に参照されている数を調査する独立カウントステップと、前記独立カウントステップによる調査結果である数を、対応するメモリセルの被参照カウンタに設定する設定ステップとを含むことを特徴とする。
【００２９】
ここで、独立カウント手段及び独立カウントステップの説明中の「アプリケーションプログラムの実行と独立して」とは、例えばアプリケーションプログラム中のポインタ変更を指定するいわゆる代入のコード等を契機として実行するのではないことを意味し、独立カウント手段等による調査が、従来のリファレンスカウント方式に含まれる動作ではないことを意味する。
【００３０】
セルの被参照数が、瞬間的に大きなピーク値をとる等、時間経過につれて大きく変動するような場合においては、被参照カウンタをピーク値が表せない程度の小さなビット数で構成することとすると被参照カウンタはオーバフローし無効となってしまうが、上記構成により、現実にセルが参照されている数が調査されて被参照カウンタにあらためて設定されることにより被参照カウンタは正しい値に修正され得るため、その後にはリファレンスカウント方式のガベージコレクションによってポインタの変更に伴いセルがどこからも参照されなくなった時点で即座にそのセルが解放されるようになる。
【００３１】
また、本発明に係る制御プログラムは、コンピュータにガベージコレクション処理を行わせるための制御プログラムであって、前記ガベージコレクション処理は、アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、各メモリセル内に設けた被参照カウンタを用いてリファレンスカウント方式によりガベージコレクションを行うリファレンスカウントステップと、アプリケーションプログラムの実行とは独立して１以上のメモリセルについて、当該メモリセルが現実に参照されている数を調査する独立カウントステップと、前記独立カウントステップによる調査結果である数を、対応するメモリセルの被参照カウンタに設定する設定ステップとを含むことを特徴とする。
【００３２】
この制御プログラムをコンピュータにインストールして実行することにより、上述のガベージコレクション方法が実現されるようになる。
【００３３】
【発明の実施の形態】
以下、本発明の実施の形態に係るガベージコレクション装置について説明する。
＜1．実施の形態１＞
＜1-1．構成＞
図１は、本発明の実施の形態１に係るガベージコレクション装置１００の構成図である。
【００３４】
ガベージコレクション装置１００は、ＣＰＵ、メモリ等を備えたコンピュータにおいてメモリに格納された制御プログラムがＣＰＵによって実行されることにより実現され、オペレーティングシステム上で動作し、Ｊａｖａ言語等で作成されたアプリケーションプログラムの実行環境の一部として位置づけられるソフトウェア的な装置である。
【００３５】
なお、同図には、アプリケーションプログラムの実行に際して、ガベージコレクション装置１００に指示を伝える制御機構２００と、セルとして割り当てられる領域を含むメモリ３００とをも示している。
制御機構２００は、アプリケーションプログラムの実行環境の一部であり、アプリケーションプログラムの解釈、実行等の実行制御を行い、アプリケーションプログラムによるポインタの変更をガベージコレクション装置１００に対して伝え、また、メモリ不足等を検出して後述するカウントアンドスイープ処理の実行をガベージコレクション装置１００に要求する機構である。
【００３６】
この制御機構２００は、セル確保部２０１、ポインタ設定部２０２及びカウントアンドスイープ指示部２１０を備える。
ここで、セル確保部２０１は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、つまりアプリケーションプログラム中のオブジェクト生成用のコードを解釈する際に、メモリ３００中の領域をそのオブジェクトのデータを格納するセルとして確保する機能を有する。
【００３７】
セルは、そのセルが参照されている数、つまりそのセルを示すポインタの存在する数を示すリファレンスカウンタを保持している。このリファレンスカウンタには、リファレンスカウント方式において通常用いられるものであってアプリケーションプログラムによるポインタの変更に応じて変化させるべきリファレンスカウンタＡと、後述するカウントアンドスイープ処理においてセルが参照されている数をカウントするために用いられる独特のリファレンスカウンタＢとの２種類がある。なお、セルのデータ構造については後に詳しく説明する。
【００３８】
ポインタ設定部２０２は、アプリケーションプログラムの実行時におけるポインタの変更に対応して、つまりアプリケーションプログラム中のオブジェクトポインタへの代入のコードを解釈した際に、ポインタの変更をガベージコレクション装置１００に対して伝える機能を有する。
また、カウントアンドスイープ指示部２１０は、メモリ不足を検出したとき、即ちメモリ３００中において新たにセルを割り当てることのできるメモリ領域が減少していることを検出したときにガベージコレクション装置１００に対してカウントアンドスイープ処理の実行を要求する機能を有する。
【００３９】
ガベージコレクション装置１００は、アプリケーションプログラムが実行中に確保したセルがどこからも参照されなくなっている場合にそのセルを解放する、いわゆるガベージコレクションをリファレンスカウント方式を変形した方式により行う機能を有し、機能構成要素として、カウンタ変更部１１０、カウンタゼロ判定部１２０、セル解放部１３０、再カウント部１４０、再カウント結果ゼロ判定部１４１及びカウンタ再設定部１４２を備える。
【００４０】
ここで、カウンタ変更部１１０は、制御機構２００中のポインタ設定部２０２からのポインタの変更の通知を受けた時にポインタ変更対応処理を実行するものであり、カウンタ最大値判定部１１１、カウンタ増加部１１２及びカウンタ減少部１１３を有する。
カウンタ最大値判定部１１１は、セルのリファレンスカウンタが最大値になっているか否かを判定するものであり、カウンタ増加部１１２は、セルのリファレンスカウンタを１増加するものであり、カウンタ減少部１１３は、セルのリファレンスカウンタを１減少するものである。
【００４１】
カウンタゼロ判定部１２０は、カウンタ減少部１１３が減少したセルのリファレンスカウンタＡが０になっているか否かを判定し、０であればセル解放部１３０にセルの解放を指示する機能を有する。
セル解放部１３０は、カウンタゼロ判定部１２０又は再カウント結果ゼロ判定部１４１の指示を受けてセルの解放を行うものである。
【００４２】
再カウント部１４０は、カウントアンドスイープ指示部２１０からカウントアンドスイープ処理の実行要求を受けた時にカウントアンドスイープ処理の実行を開始し、各セルが参照されている数をセルのリファレンスカウンタＢを用いてカウントする機能を有する。
再カウント結果ゼロ判定部１４１は、再カウント部１４０によるカウントの結果として全てのセルのうちリファレンスカウンタＢが０であるセルについては、セル解放部１３０にそのセルの解放を指示し、リファレンスカウンタＢが０でないセルについては、カウンタ再設定部１４２にセルにおけるリファレンスカウンタの再設定指示を伝える機能を有する。
【００４３】
カウンタ再設定部１４２は、再設定指示が伝えられたセルのリファレンスカウンタＢの値をレファレンスカウンタＡにコピーする機能を有する。
＜1-2．データ＞
以下、ガベージコレクション装置１００の処理対象となり、アプリケーションプログラムにおけるオブジェクトのデータを格納するために用いられるデータ単位であるセルについて説明する。
【００４４】
図２は、セルのデータ構造を示す図である。なお、同図における１行は、計算機の基本語長となるワード単位に相当する。ここでは、１ワードが３２ビットであるものとして説明する。
セル１１００は、複数ワードで構成され、１ワードのヘッダ部と、可変長のデータ領域１１０６とからなる。
【００４５】
ここで、ヘッダ部は、有効セルフラグ領域１１０１とセル長領域１１０２とリファレンスカウンタＡ領域１１０３とリファレンスカウンタＢ領域１１０４と作業フラグ領域１１０５とから構成される。
有効セルフラグ領域１１０１は、セルが有効か無効かを示す有効セルフラグを格納するための１ビットの領域である。有効セルフラグは、セルが有効であれば１、無効であれば０の値をとる。有効セルフラグが０であるセルの領域は、アプリケーションプログラムにおけるオブジェクトの生成に対応してセル確保部２０１により、新たにセルを割り当てられ得る領域となり、セル確保部２０１により新たにセルが確保された際には有効セルフラグは１に設定される。
【００４６】
なお、セルの解放は有効セルフラグが１から０に変更されることによって実現され、これにより、その有効セルフラグを含むセルが割り当てられていたメモリ領域は、新たにセルを確保するために用いられ得る、再利用可能な領域となる。セル長領域１１０２は、ヘッダ部とデータ領域とを合わせたセル長を示す値を格納する２１ビットの領域である。この領域に格納されるセル長は、例えばワード数で表される。
【００４７】
リファレンスカウンタＡ領域１１０３及びリファレンスカウンタＢ領域１１０４は、リファレンスカウンタＡ及びリファレンスカウンタＢを格納する４ビットずつの領域である。両リファレンスカウンタは０から１５までの数を表すことができるが、最大値である１５は、セルが参照されている数が１５以上に１度なってしまったためにリファレンスカウンタがオーバフローしていることを示すものとして用いられる。リファレンスカウンタに関してこの１５という数を、以下、ＭＡＸ値とも表現する。
【００４８】
作業フラグ領域１１０５は、カウントアンドスイープ処理においてセルに関する状態を３段階で示すために用いられる作業フラグを格納する２ビットの領域である。
セルに関する状態は、ポインタにより参照されていることが検出されていない状態（以下、「白色」とも表現する。）と、そのセルがポインタにより参照されていることが初めて検出された状態（以下、「灰色」とも表現する。）と、そのセルが保持するポインタが示すセルについてのリファレンスカウンタの操作を実行済みである状態（以下、「黒色」とも表現する。）とである。また、作業フラグの値が０であればセルが白色であることを示し、１であればセルが灰色であることを示し、２であればセルが黒色であることを示す。
【００４９】
なお、後述のカウントアンドスイープ処理においては、いわゆる三色アルゴリズムを用いており、各セルは白色、灰色、黒色の順に変化することになる。
データ領域１１０６は、オブジェクトのデータを格納するための領域であり、この領域に、整数型、文字型、ポインタ型等のデータ型の情報が付された１又は複数のデータが格納される。
【００５０】
図３は、メモリ３００の一部の領域にセルが割り当てられている様子を示す図である。なお、同図においてはポインタ型以外の型のデータを「変数」と表現している。
例えば、有効セル１２０１においては、有効セルフラグが１であり、セル長が４ワードであり、リファレンスカウンタＡが２であり、リファレンスカウンタＢが０であり、作業フラグが０であり、ポインタ等を含んでいる。
【００５１】
また、有効セルフラグが０であるフリー領域１２１１は３ワード分の領域であり、新たにセルとして確保され得る領域である。
なお、この複数のセルが格納されている領域において、セルを順次探索する場合には、先頭のセルから、セルのセル長を参照してそのセルのサイズ分だけスキップすれば次のセルに至ることができる。
【００５２】
図４は、ある時点におけるセルの内容とセル間の関係を例示した図である。
同図においては、矢印線の起点によりポインタの所在を示し、矢印の先端によりポインタの指すセルを示している。例えば、セル１１は、ルートポインタ１０から指されており、かつ、セル１２を指すポインタとセル１５を指すポインタとを含んでいることを示している。また、セル１４は、どこからも指されておらず、どこからも参照されていないことを示している。
【００５３】
＜1-3．動作＞
以下、上述した構成を備え、上述したセルを対象としたガベージコレクションを行うガベージコレクション装置１００と、これに関連し、アプリケーションプログラムの解釈実行の制御を行う制御機構２００との動作について説明する。
＜1-3-1．セルの生成＞
アプリケーションプログラムのコードを逐次解釈し実行のための制御を行う制御機構２００は、オブジェクト生成用のコードを解釈対象としたときに、セル確保部２０１によりセル生成処理を行う。
【００５４】
図５は、セル確保部２０１が行うセル生成処理を示すフローチャートである。
セル確保部２０１は、セルに格納すべきオブジェクトのデータの量と、ヘッダ部の１ワード分とを合わせたサイズのセルを確保し、そのセルの有効セルフラグを１にし（ステップＳ４１１）、そのサイズに基づいてセル長を設定する（ステップＳ４１２）。このセルの確保にあたり、セル確保部２０１は、メモリ３００中の有効セルフラグが０であるフリー領域を探索して、そのフリー領域の全部又は一部を利用して新たにセルとして利用する。
【００５５】
セル長を設定した後、セル確保部２０１は、その確保したセルのリファレンスカウンタＡ及びＢを０とし、作業フラグを０にする（ステップＳ４１３）。これによりセルは白色となる。
アプリケーションプログラムにおけるオブジェクト生成用のコードにおいて、通常は生成したオブジェクトを指すようにオブジェクトポインタへの代入が示されており、この場合においては、ステップＳ４１３の後に、制御機構２００はポインタ設定部２０２によりポインタの変更をガベージコレクション装置１００に伝えて、ポインタ変更対応処理を行わせることになる（ステップＳ４１４）。
【００５６】
＜1-3-2．ポインタの変更＞
制御機構２００は、アプリケーションプログラムにおけるオブジェクトポインタへの代入のコードを解釈対象としたときにポインタ設定部２０２を通じてポインタの変更をガベージコレクション装置１００に伝える。なお、ポインタ設定部２０２は、ポインタの変更を伝える際に、変更前後のポインタの値をも伝える。
【００５７】
ガベージコレクション装置１００は、ポインタの変更が伝えられるとポインタ変更対応処理を行う。
図６は、ガベージコレクション装置１００の行うポインタ変更対応処理を示すフローチャートである。
ポインタの変更が伝えられると、ガベージコレクション装置１００のカウンタ変更部１１０は、変更前のポインタがセルを指すか否かを判定し（ステップＳ４２１）、セルを指すものである場合には、その着目している変更前のポインタに基づいてセル参照解除処理を行い（ステップＳ４２２）、セルを指すものでない場合にはステップＳ４２２のセル参照解除処理は行わない。つまり変更前のポインタがＮＵＬＬであればセル参照解除処理は行わない。なお、セル参照解除処理については後に図７を用いて説明する。
【００５８】
続いて、カウンタ変更部１１０は、変更後のポインタがセルを指すか否かを判定し（ステップＳ４２３）、セルを指すものでない場合にはポインタ変更対応処理を終了する。
また、ステップＳ４２３において、変更後のポインタがセルを指すものである場合には、カウンタ変更部１１０はカウンタ最大値判定部１１１によりそのポインタの指すセルのリファレンスカウンタＡがＭＡＸ値であるか否かを判定し（ステップＳ４２４）、ＭＡＸ値でない場合にはカウンタ増加部１１２にうよりそのリファレンスカウンタＡを１増やし（ステップＳ４２５）、ＭＡＸ値である場合にはステップＳ４２５は行わない。
【００５９】
ステップＳ４２５の後に、或いはステップＳ４２４でＭＡＸ値であると判定した場合に、カウンタ変更部１１０はその変更後のポインタを保持するセルの作業フラグは２であるか否か、即ちそのセルが黒色であるか否かを判定し（ステップＳ４２６）、黒色でない場合にはポインタ変更対応処理を終了する。
ステップＳ４２６においてセルが黒色であると判定した場合には、カウンタ変更部１１０は、その変更後のポインタが指すセルの作業フラグは０であるか否か、即ちそのセルが白色であるか否かを判定し（ステップＳ４２７）、白色である場合に限りその変更後のポインタが指すセルの作業フラグを０から１に変更する（ステップＳ４２８）。
【００６０】
ステップＳ４２７、Ｓ４２８に続いて、カウンタ変更部１１０はカウンタ最大値判定部１１１により、変更後のポインタの指すセルのリファレンスカウンタＢがＭＡＸ値であるか否かを判定し（ステップＳ４２９）、ＭＡＸ値でない場合にはカウンタ増加部１１２によりそのリファレンスカウンタＢを１増やして（ステップＳ４３０）、ポインタ変更対応処理を終了し、ＭＡＸ値である場合にはステップＳ４３０を行わずにポインタ変更対応処理を終了する。
【００６１】
図７は、ガベージコレクション装置１００の行うセル参照解除処理を示すフローチャートである。なお、同図ではステップＳ４３５においてセル参照解除処理を再帰的に実行するように表現している。
まず、カウンタ変更部１１０は、セル参照解除処理を行う直前に着目していたポインタに基づき、カウンタ最大値判定部１１１により、その着目していたポインタの指すセルのリファレンスカウンタＡはＭＡＸ値であるか否かを判定する（ステップＳ４３１）。
【００６２】
以下、セル参照解除処理のステップＳ４３１を行う時点で着目していたポインタを処理対象ポインタということとする。
ステップＳ４３１において、処理対象ポインタの指すセルのリファレンスカウンタＡがＭＡＸ値でないと判定した場合には、カウンタ変更部１１０は、カウンタ減少部１１３によりそのリファレンスカウンタＡを１減らし（ステップＳ４３２）、続いてカウンタゼロ判定部１２０は、そのリファレンスカウンタＡが０になったか否かを判定する（ステップＳ４３３）。
【００６３】
ステップＳ４３３において、リファレンスカウンタＡが０になっていると判定された場合には、処理対象ポインタの指すセルの保持する、セルへのポインタに順次着目してセル参照解除処理（図７）を繰り返す（ステップＳ４３４、Ｓ４３５）。これにより、処理対象ポインタの指すセルが保持する、セルへのポインタの数だけステップＳ４３５が繰り返されることになる。なお、処理対象ポインタの指すセルが、セルへのポインタを保持しない場合にはステップＳ４３５の処理は省略される。
【００６４】
セル解放部１３０は、ステップＳ４３３においてリファレンスカウンタＡが０になっていると判定されたセルについて、ステップＳ４３５の繰り返しの後に、有効セルフラグを０にすることによりセルを解放し（ステップＳ４３６）、これによりセル参照解除処理は終了する。
また、ステップＳ４３１において処理対象ポインタの指すセルのリファレンスカウンタＡがＭＡＸ値であると判定した場合、及びステップＳ４３３においてリファレンスカウンタＡが０になっていないと判定した場合には、カウンタ変更部１１０は、処理対象ポインタを保持するセルが黒色か否かを判定し（ステップＳ４３７）、黒色でない場合にはセル参照解除処理を終了し、黒色である場合には、カウンタ最大値判定部１１１によりその黒色のセルのリファレンスカウンタＢがＭＡＸ値であるか否かを判定する（ステップＳ４３８）。
【００６５】
ステップＳ４３８において、リファレンスカウンタＢがＭＡＸ値でないと判定した場合にはカウンタ変更部１１０は、カウンタ減少部１１３によりそのリファレンスカウンタＢを１減らして（ステップＳ４３９）、セル参照解除処理を終了し、ＭＡＸ値であると判定した場合にはステップＳ４３９を行わずにセル参照解除処理を終了する。
【００６６】
＜1-3-3．カウントアンドスイープ処理＞
制御機構２００のカウントアンドスイープ指示部２１０は、単位時間当たりにおいて、ＣＰＵがアプリケーションプログラムの実行に割り当てられる時間に対して比較的少ない時間を用いて、メモリ３００中において新たにセルを割り当てることのできるメモリ領域が予め定めた基準量より減少しているか否かの検出を行って、減少している場合にはその比較的少ない時間を用いてガベージコレクション装置１００にカウントアンドスイープ処理を行わせるよう制御する。なお、時間の割り当てに関しては、例えば、カウントアンドスイープ処理やこれに付随した処理を、アプリケーションプログラムとは別スレッドとして構成し、スレッド毎のいわゆるタイムスライス値を適切に配分すること等によって実現できる。
【００６７】
図８は、ガベージコレクション装置１００の行うカウントアンドスイープ処理を示すフローチャートである。
カウントアンドスイープ指示部２１０からカウントアンドスイープ処理の実行が要求されると、ガベージコレクション装置１００の再カウント部１４０は、まず全てのセルについてのリファレンスカウンタＢを０にして作業フラグを０にする（ステップＳ５０１）。これにより全てのセルが白色になる。
【００６８】
ステップＳ５０１に続いて、再カウント部１４０は、ルートポインタから直接指されている全てのセルについて、作業フラグを１にしてセルを灰色にするとともに、リファレンスカウンタＢがＭＡＸ値でなければリファレンスカウンタＢを１増やす（ステップＳ５０２）。
ステップＳ５０２に続いて、再カウント部１４０は、ルートポインタに端を発するポインタチェーンを辿って、灰色のセルを探索する（ステップＳ５０３）。
【００６９】
再カウント部１４０はステップＳ５０３の探索の結果として、灰色のセルを探索できた場合には（ステップＳ５０４）、探したその灰色のセル内におけるポインタであってセルを指すもの毎に、そのポインタが指すセルが白色ならば、そのセルの作業フラグを０から１に変更することによってその白色のセルを灰色にするステップＳ５０６と、そのポインタが指すセルのリファレンスカウンタＢがＭＡＸ値でなければリファレンスカウンタＢを１増やすステップＳ５０７とを繰り返し行う（ステップＳ５０５〜Ｓ５０７）。但し、探した灰色のセル内にセルを指すポインタがない場合にはステップＳ５０６及びＳ５０７の処理は省略する。
【００７０】
探したその灰色のセル内のポインタ毎にステップＳ５０５により、ステップＳ５０６及びＳ５０７を繰り返し行った後に、再カウント部１４０は、その灰色のセルを黒色にし（ステップＳ５０８）、ステップＳ５０３の処理に戻る。即ち、また別の灰色のセルの探索を開始する。
こうしてステップＳ５０３〜Ｓ５０８が繰り返され、灰色のセルが存在しなくなった場合には、再カウント部１４０は、ステップＳ５０４においてｎｏの分岐に進み、全てのセルについてセル毎にステップＳ５０９〜Ｓ５１２を行う（ステップＳ５０９）。即ち、再カウント部１４０は、全てのセルそれぞれについて順次、再カウント結果ゼロ判定部１４１により、セルのリファレンスカウンタＢが０であるか否かを判定し（ステップＳ５１０）、０でない場合には、カウンタ再設定部１４２がセルのリファレンスカウンタＡをリファレンスカウンタＢと同じ値にするとともにセルを白色にし（ステップＳ５１２）、０である場合にはセル解放部１３０がそのセルの有効セルフラグを０にしてセルを解放する（ステップＳ５１１）。こうして全てのセルについてステップＳ５０９以後の処理が行われると、カウントアンドスイープ処理は完了する。
【００７１】
なお、カウントアンドスイープ処理は、アプリケーションプログラムの実行と並行して行われる。但し、カウンタアンドスイープ処理は、図８に示す単一ステップの実行中においてはアプリケーションプログラムが実行されないようにし、さらにステップＳ５０５の実行開始からステップＳ５０８の実行終了までの間においてもアプリケーションプログラムが実行されないようにされる必要がある。これは、例えば、マルチタスク制御を行うＯＳに対して、ガベージコレクション装置１００が単一ステップやステップＳ５０５〜Ｓ５０８の実行中はＣＰＵを専有することを宣言する等によって実現される。
【００７２】
以下、上述したカウントアンドスイープ処理の進行を図９〜図１３を用いて段階を追って説明する。
図９は、カウントアンドスイープ処理におけるステップＳ５０２の終了直後のセルの内容とセル間の関係を例示した図である。ここでは、説明を簡単にするために６つのセルのみを示している。
【００７３】
カウントアンドスイープ処理の実行前においては、セル１１〜１６はいずれも有効セルフラグは１で有効を示しており、セル１１、セル１３、セル１４及びセル１６のリファレンスカウンタＡはＭＡＸ値になっており、セル１２及びセル１５のリファレンスカウンタＡは１であるものとする。
同図に示す状態は、カウントアンドスイープ処理のステップＳ５０１により、まずセル１１〜１６の全てについて、リファレンスカウンタＢが０にされるとともに作業フラグが０にされた後、ステップＳ５０２により、ルートポインタ１０から直接指されているセル１１のリファレンスカウンタＢが１に増やされ作業フラグが１にされた時点の状態である。この時にはセル１１のみが灰色であって、セル１２〜１６は白色である。
【００７４】
図１０は、カウントアンドスイープ処理における１回目のステップＳ５０８の実行の終了直後のセルの内容とセル間の関係を例示した図である。
同図に示す状態は、図９に示す状態を前提として、ステップＳ５０３により灰色のセル１１が探知されてそのセル内のポインタが指すセル１２及びセル１５について白色から灰色に変えられリるとともにファレンスカウンタＢを１増やされ（ステップＳ５０４〜Ｓ５０７）、ステップＳ５０８によりセル１１を黒色にされた時点の状態である。
【００７５】
図１１は、カウントアンドスイープ処理における２回目のステップＳ５０８の実行の終了直後のセルの内容とセル間の関係を例示した図である。
同図に示す状態は、図１０に示す状態を前提として、ステップＳ５０３により灰色のセル１２が探知されてそのセル内のポインタが指すセル１３及びセル１６について白色から灰色に変えられるとともにリファレンスカウンタＢを１増やされ（ステップＳ５０４〜Ｓ５０７）、ステップＳ５０８によりセル１２を黒色にされた時点の状態である。
【００７６】
図１２は、カウントアンドスイープ処理においてＳ５０４のｎｏの分岐に進んだ直後のセルの内容とセル間の関係を例示した図である。
同図に示す状態は、図１１に示す状態を前提として、ステップＳ５０３〜Ｓ５０８の処理を繰り返し行うことにより、灰色のセルが存在しなくなった時点の状態である。この時、各セルはそのセルが参照されている数をリファレンスカウンタＢにより示すことになる。
【００７７】
図１３は、カウントアンドスイープ処理の終了時点のセルの内容とセル間の関係を例示した図である。
同図に示す状態は、図１２に示す状態を前提として、ステップＳ５０９〜Ｓ５１１が実行されることにより、リファレンスカウンタＢが０であったセル１４は有効セルフラグが１から０にされて解放され、他のセルについてはリファレンスカウンタＢがリファレンスカウンタＡにコピーされた状態である。このカウントアンドスイープ処理により、どこからも参照されていないセル１４の解放が行われ、また、一旦１５回以上も参照されたことによってＭＡＸ値になっていたリファレンスカウンタＡがセルの現在の被参照回数を示す値になおされた。従って、以後はポインタ変更対応処理において、リファレンスカウンタＡに基づき、リファレンスカウンタＡが０になった時点でセルの解放を行うことができるようになる。
【００７８】
＜1-4．考察＞
セルの生存期間における被参照数の経時的変化について考えると、セルへの参照数は、図２９に示したようにセルの生成から短い時間においては、例えば３００回等とリファレンスカウンタで表せない大きな値になり得るが、いずれは、例えば１０回前後等とリファレンスカウンタで表せる大きさに落ち着く。
【００７９】
即ち、Ｊａｖａ言語等、可変長のデータ構造を有するオブジェクトを生成可能とするタイプのプログラミング言語で作成されたアプリケーションプログラムにおいて、そのオブジェクトの生成に対応してメモリ中において確保されるセルは、図２９に示したように確保から短期間においては一旦リファレンスカウンタＡがオーバフローするほど多数の参照がなされるが、その後にはそのセルが参照される数はリファレンスカウンタＡがオーバフローしない程度に落ち着く。
【００８０】
従って、セルの生成から短い時間においてはリファレンスカウンタＡがＭＡＸ値に一旦なってしまうが、いずれ落ち着いた段階でカウントアンドスイープ処理が行われることにより、その時点でのセルの被参照数がリファレンスカウンタＡに再設定されるため、その後は、通常のリファレンスカウンタ方式による場合と同様に、そのセルがどこからも参照されなくなった時に即座にそのセルの解放を行うような制御を実現することが可能になる。
【００８１】
このカウントアンドスイープ処理によれば、どこからも参照されておらず不要となっているセルを解放するマークアンドスイープ方式と同様の効果に加えて、リファレンスカウンタが一旦オーバフローしてリファレンスカウント方式に相当する解放制御が不可能になったセルであっても、その処理時点においてそのセルの被参照数がリファレンスカウンタで表せる範囲内に収まっていれば、以後そのセルについて、リファレンスカウント方式と同様なセルの解放制御を行うことができるようになるという効果が得られる。
【００８２】
なお、この実施の形態１で示した方式を、従来の単なるリファレンスカウント方式と対比すると、実施の形態１で示した方式は、セルの被参照数の初期段階でのピーク値と後の安定状態における値との格差が大きいときには、リファレンスカウントのために必要なセル内の領域を、より小さいものにできる可能性をもつ方式であるといえる。
＜2．実施の形態２＞
以下、本発明の実施の形態２に係るガベージコレクション装置（以下、「変形ガベージコレクション装置」という。）について説明する。
【００８３】
＜2-1．構成＞
変形ガベージコレクション装置は、実施の形態１において説明したガベージコレクション装置１００と基本的な構成は同じであるが、セル内に作業用領域を設けてその作業用領域を利用することによりカウントアンドスイープ処理をより高速に行えるようにしたものである。以下、変形ガベージコレクション装置の機能構成要素についてはガベージコレクション装置１００の機能構成要素と同じ符号を用いて説明する（図１参照）。また、この変形ガベージコレクション装置に対応し、実施の形態１に示した制御機構２００に相当する制御機構を変形制御機構といい、その機能構成要素については制御機構２００の機能構成要素と同じ符号を用いて説明する。
【００８４】
＜2-2．データ＞
以下、変形ガベージコレクション装置の処理対象となり、アプリケーションプログラムにおけるオブジェクトのデータを格納するために用いられるデータ単位であるセルについて説明する。
図１４は、変形ガベージコレクション装置が取り扱うセルのデータ構造を示す図である。なお、同図における１行は、計算機の基本語長となるワード単位に相当する。
【００８５】
セル２１００は、複数ワードで構成され、１ワードのヘッダ部と、１ワードの作業用領域２１０６と、可変長のデータ領域２１０７とからなる。
ここで、ヘッダ部は、有効セルフラグ領域２１０１とセル長領域２１０２とリファレンスカウンタＡ領域２１０３とリファレンスカウンタＢ領域２１０４と作業フラグ領域２１０５とから構成される。
【００８６】
有効セルフラグ領域２１０１、リファレンスカウンタＡ領域２１０３及びリファレンスカウンタＢ領域２１０４はそれぞれ、実施の形態１で図２により示した有効セルフラグ領域１１０１、リファレンスカウンタＡ領域１１０３及びリファレンスカウンタＢ領域１１０４と同等であり、そのためここでは説明を省略する。
【００８７】
セル長領域２１０２は、実施の形態１で示したセル長領域１１０２より１ビット大きく、ヘッダ部と作業用領域とデータ領域とを合わせたセル長を示す値を格納する２２ビットの領域である。この領域に格納されるセル長は、例えばワード数で表される。
作業フラグ領域２１０５は、実施の形態１で示した作業フラグ領域１１０５より１ビット小さく、カウントアンドスイープ処理においてセルに関する状態を示すために用いられる作業フラグを格納する１ビットの領域である。作業フラグは０又は１の値をとり、カウントアンドスイープ処理において最初は０にされる。
【００８８】
作業用領域２１０６は、作業用先頭セルアドレスを格納するためにメモリ３００内に予め設けられた１ワードの領域を始点として、各セルをポインタチェーンで繋ぐために用いられる領域であり、カウントアンドスイープ処理においてルートポインタに端を発するポインタチェーンで繋がれているセルであると判定された場合に、他のセルのアドレスが格納される。
【００８９】
なお、セル２１００が、作業用先頭セルアドレスからのポインタチェーンで繋がれていない場合には、作業用領域２１０６にはＮＵＬＬが格納されており、そのポインタチェーンで繋がれている場合であってチェーンの終端であれば、終端を示すために予め定められている値、例えば、０ｘＦＦＦＦＦＦＦＦ等（以下、「終端マーク」という。）が格納されており、そのポインタチェーンで繋がれている場合であってチェーンの終端でなければ、次のセルのアドレスが格納されている。
【００９０】
また、データ領域２１０７は、実施の形態１で示したデータ領域１１０６と同等であり、そのためここでは説明を省略する。
図１５は、実施の形態２におけるセルの作業用先頭セルアドレス３０からのポインタチェーンを例示する図である。
同図においては、矢印の先端により、アドレスが指すセルを示している。
【００９１】
作業用先頭セルアドレス３０はセルａ３１のアドレスであり、セルａ３１の作業用領域にはセルｂ３２のアドレスが格納されており、セルｂ３２の作業用領域にはセルｃ３３のアドレスが格納されており、セルｃ３３の作業用領域には終端マークが格納されている。また、ポインタチェーンから外れているセルｄ３４の作業用領域にはＮＵＬＬが格納されている。
【００９２】
この実施の形態２では、この作業用先頭セルアドレス３０に端を発するポインタチェーンに対して、カウントアンドスイープ処理においてセルを接続したり切り離したりする際に、ラストインファーストアウトのスタックアルゴリズムを用いる。このため、作業用先頭セルアドレス３０からのポインタチェーンで示されるセルについては、作業用スタックにそのセルが格納されていると表現する。また、セルを作業用スタックにＰＵＳＨするという表現により、ポインタチェーンの先頭にセルを挿入することを表し、セルを作業用スタックからＰＯＰするという表現により、ポインタチェーンの先頭のセルをチェーンから取り除くことを表す。
【００９３】
例えば、図１５に示す状態において、セルｄ３４を作業用スタックにＰＵＳＨすると、作業用先頭セルアドレスはセルｄ３４のアドレスを指すように書きかえられ、セルｄ３４の作業用領域にはセルａ３１のアドレスが格納されることになる。また、その直後に、作業用スタックからＰＯＰできるセルはセルｄ３４となり、セルｄ３４をＰＯＰするとポインタチェーンからセルｄ３４が除かれ、その状態は図１５に示すものに戻る。なお、ＰＯＰ時にはＰＯＰしたセルの作業用領域にはＮＵＬＬが設定される。
【００９４】
＜2-3．動作＞
以下、上述したセルを対象としたガベージコレクションを行う変形ガベージコレクション装置と、これに関連し、アプリケーションプログラムの解釈実行の制御を行う変形制御機構との動作について説明する。
＜2-3-1．セルの生成＞
アプリケーションプログラムのコードを逐次解釈し実行のための制御を行う変形制御機構は、オブジェクト生成用のコードを解釈対象としたときに、セル確保部２０１によりセル生成処理を行う。
【００９５】
図１６は、変形制御機構におけるセル確保部２０１が行うセル生成処理を示すフローチャートである。
セル確保部２０１は、セルに格納すべきオブジェクトのデータの量と、ヘッダ部の１ワード分と作業用領域の１ワード分とを合わせたサイズのセルを確保し、そのセルの有効セルフラグを１にし（ステップＳ６１１）、そのサイズに基づいてセル長を設定する（ステップＳ６１２）。このセルの確保にあたり、セル確保部２０１は、メモリ３００中の有効セルフラグが０であるフリー領域を探索して、そのフリー領域の全部又は一部を利用して新たにセルとして利用する。
【００９６】
セル長を設定した後、セル確保部２０１は、その確保したセルのリファレンスカウンタＡ及びＢを０とし、作業フラグを０にし、作業用領域にＮＵＬＬを設定する（ステップＳ６１３）。
アプリケーションプログラムにおけるオブジェクト生成用のコードにおいて、通常は生成したオブジェクトを指すようにオブジェクトポインタへの代入が示されており、この場合においては、ステップＳ６１３の後に、変形制御機構はポインタ設定部２０２によりポインタの変更を変形ガベージコレクション装置に伝えて、ポインタ変更対応処理を行わせることになる（ステップＳ６１４）。
【００９７】
＜2-3-2．ポインタの変更＞
変形ガベージコレクション装置の行うポインタ変更対応処理は、実施の形態１で示したガベージコレクション装置１００の行うポインタ変更対応処理（図６参照）と基本的に同等である。但し、実施の形態１において作業フラグが２であるか否かの判断をしている点（ステップＳ４２６）を、実施の形態２では作業フラグが１であるか否かの判断をするように置き換え、実施の形態１においてセル内の作業フラグを１に変化させる点（ステップＳ４２８）を、実施の形態２ではセルを作業用スタックにＰＵＳＨするように置き換える。なお、セル参照解除処理（図７参照）についても同様に、実施の形態１において作業フラグが２であるか否かの判断をしている点（ステップＳ４３７）を、実施の形態２では作業フラグが１であるか否かの判断をするように置き換える。
【００９８】
＜2-3-3．カウントアンドスイープ処理＞
変形制御機構のカウントアンドスイープ指示部２１０は、単位時間当たりにおいて、ＣＰＵがアプリケーションプログラムの実行に割り当てられる時間に対して比較的少ない時間を用いて、メモリ３００中において新たにセルを割り当てることのできるメモリ領域が予め定めた基準量より減少しているか否かの検出を行って、減少している場合にはその比較的少ない時間を用いて変形ガベージコレクション装置にカウントアンドスイープ処理を行わせるよう制御する。
【００９９】
図１７は、変形ガベージコレクション装置の行うカウントアンドスイープ処理を示すフローチャートである。
変形制御機構のカウントアンドスイープ指示部２１０からカウントアンドスイープ処理の実行が要求されると、変形ガベージコレクション装置の再カウント部１４０は、まず全てのセルについてのリファレンスカウンタＢを０にして作業フラグを０にし、作業用領域にＮＵＬＬを設定する（ステップＳ７０１）。なお、作業用先頭セルアドレス３０は、初期値が終端マークであり、このステップＳ７０１が実行される時点では終端マークになっている。
【０１００】
ステップＳ７０１に続いて、再カウント部１４０は、ルートポインタから直接指されている全てのセルについて、リファレンスカウンタＢを１増加して順次、作業用スタックにＰＵＳＨする（ステップＳ７０２）。
ここで、ＰＵＳＨは、作業用先頭セルアドレス３０のそのＰＵＳＨ時点での値をそのＰＵＳＨ対象となったセルの作業用領域に格納するとともに、そのＰＵＳＨ対象となったセルのアドレスを作業用セルアドレス３０に設定することにより実現される。
【０１０１】
ステップＳ７０２に続いて、再カウント部１４０は、作業用スタックにセルが格納されているかを判定する（ステップＳ７０３）。再カウント部１４０は、作業用先頭セルアドレス３０の値が終端マーク以外であれば、作業用スタックにセルが格納されていると判定し、終端マークであれば作業用スタックにセルが格納されていないと判定する。
【０１０２】
ステップＳ７０３において作業用スタックにセルが格納されていると判定した場合には、再カウント部１４０は作業用スタックから１つのセルをＰＯＰし、そのＰＯＰしたセルの作業用フラグを１にし（ステップＳ７０４）、そのセルの有効セルフラグを参照してセルが有効であるか否かを判定する（ステップＳ７０５）。
【０１０３】
ここで、ＰＯＰは、作業用先頭セルアドレス３０が指すセルのそのＰＯＰ時点での作業用領域の内容を作業用先頭セルアドレス３０に設定するとともに、そのセルの作業用領域にＮＵＬＬを格納することにより実現される。
ステップＳ７０５においてセルが有効であると判定した場合には、再カウント部１４０は、そのセル内の、セルを指すポインタ毎に、そのポインタが指すセルのリファレンスカウンタＢがＭＡＸ値でなければ１増やすステップＳ７０７と、そのポインタが指すセルの作業フラグが０であり、かつ、作業用領域がＮＵＬＬであれば、そのポインタが指すセルを作業用スタックにＰＵＳＨするステップＳ７０８とを行う（ステップＳ７０６〜Ｓ７０８）。但し、ステップＳ７０４においてＰＯＰしたセル内に、セルを指すポインタがない場合には、ステップＳ７０７及びＳ７０８の処理は省略する。
【０１０４】
ステップＳ７０６〜Ｓ７０８の後に、或いはステップＳ７０５でセルが有効でないと判定した場合に、再カウント部１４０は再び作業用スタックにセルが格納されているかの判定に戻る（ステップＳ７０３）。
ステップＳ７０３において、作業用スタックにセルが格納されていないと判定した場合には、再カウント部１４０は、全てのセルについてセル毎にステップＳ７０９〜Ｓ７１２を行う（ステップＳ７０９）。
【０１０５】
即ち、再カウント部１４０は、全てのセルそれぞれについて順次、再カウント結果ゼロ判定部１４１により、セルのリファレンスカウンタＢが０であるか否かを判定し（ステップＳ７１０）、０でない場合には、カウンタ再設定部１４２がセルのリファレンスカウンタＡをリファレンスカウンタＢと同じ値にするとともに作業フラグを０にし（ステップＳ７１２）、０である場合にはセル解放部１３０がそのセルの有効セルフラグを０にしてセルを解放する（ステップＳ７１１）。こうして全てのセルについてステップＳ７０９以後の処理が行われると、カウントアンドスイープ処理は完了する。
【０１０６】
なお、カウントアンドスイープ処理は、アプリケーションプログラムの実行と並行して行われる。但し、カウントアンドスイープ処理は、図１７に示す単一ステップの実行中においてはアプリケーションプログラムが実行されないようにし、さらにステップＳ７０４の実行開始からステップＳ７０８の実行終了までの間においてもアプリケーションプログラムが実行されないようにされる必要がある。これは、例えば、マルチタスク制御を行うＯＳに対して、変形ガベージコレクション装置が単一ステップやステップＳ７０４〜Ｓ７０８の実行中はＣＰＵを専有することを宣言する等によって実現される。
【０１０７】
以下、上述したカウントアンドスイープ処理の進行を図１８〜図２２を用いて段階を追って説明する。
図１８は、カウントアンドスイープ処理におけるステップＳ７０１の終了直後のセルの内容とセル間の関係を例示した図である。ここでは、説明を簡単にするために６つのセルのみを示している。
【０１０８】
カウントアンドスイープ処理の実行前においては、セル４１〜４６はいずれも有効セルフラグは１で有効を示しており、セル４１、セル４３、セル４４及びセル４６のリファレンスカウンタＡはＭＡＸ値になっており、セル４２及びセル４５のリファレンスカウンタＡは１であるものとする。
同図に示す状態は、カウントアンドスイープ処理のステップＳ７０１により、まずセル４１〜４６の全てについて、リファレンスカウンタＢが０にされるとともに作業フラグが０にされた時点の状態である。この時点での作業用先頭セルアドレスの値は終端マークである。
【０１０９】
図１９は、カウントアンドスイープ処理におけるステップＳ７０２の実行の終了直後のセルの内容とセル間の関係を例示した図である。
同図に示す状態は、図１８に示す状態を前提として、ステップＳ７０２によりルートポインタから指されているセル４１について、リファレンスカウンタＢが１に増やされ、作業用スタックにＰＵＳＨされた時点の状態である。
【０１１０】
図２０は、カウントアンドスイープ処理におけるステップＳ７０６の繰り返し処理が終わった直後のセルの内容とセル間の関係を例示した図である。
同図に示す状態は、図１９に示す状態を前提として、ステップＳ７０４によりセル４１がＰＯＰされかつその作業フラグを１にされ、セル４１が保持するポインタが指すセル４２及びセル４５が順次作業用スタックにＰＵＳＨされかつリファレンスカウンタＢを１増やされた状態である。
【０１１１】
図２１は、カウントアンドスイープ処理において再びステップＳ７０６が終わった直後のセルの内容とセル間の関係を例示した図である。
同図に示す状態は、図２０に示す状態を前提として、ステップＳ７０４によりセル４５がＰＯＰされかつその作業フラグを１にされ、セル４５が保持するポインタが指すセル４６が作業用スタックにＰＵＳＨされかつリファレンスカウンタＢを１増やされた状態である。
【０１１２】
図２２は、カウントアンドスイープ処理においてステップＳ７０３のｎｏの分岐に進んだ直後のセルの内容とセル間の関係を例示した図である。
同図に示す状態は、図２１に示す状態を前提として、ステップＳ７０３〜Ｓ７０８の処理を繰り返し行うことにより、作業用スタックに格納されているセルがなくなった時点の状態である。この時、各セルはそのセルが参照されている数をリファレンスカウンタＢにより示すことになる。
【０１１３】
この図２２に示した状態の後、ステップＳ７０９〜Ｓ７１２が行われることにより、セル４４は有効セルフラグが０にされることにより解放され、他のセルではリファレンスカウンタＡがリファレンスカウンタＢと同じ値に再設定されることになる。
＜2-4．考察＞
このように各セルに作業用領域を設けて作業用スタックを利用する方式によれば、実施の形態１で示したような灰色のセルを探索する処理にかかる時間を短縮でき、高速にカウントアンドスイープ処理を行うことができるようになる。
【０１１４】
なお、従来のリファレンスカウント方式を用いる場合においても、セルへのポインタのチェーンがループしている場合に不要なセルを解放できないという問題を解決するためにマークアンドスイープ方式を併せて用いることもあり、アプリケーションプログラムの動作に並行してこのマークアンドスイープ方式による処理を行うためには作業用スタックを用いる実施形態が有効となる。この作業用スタックの実現のために各セルに１ワードの作業用領域を設けた形態をとって従来のリファレンスカウント方式とマークアンドスイープ方式とを併用した場合と対比すると、実施の形態２で示した方式は、セルの被参照数の初期段階でのピーク値と後の安定状態における値との格差が大きいときには、リファレンスカウントのために必要なセル内の領域をより小さいものにできる可能性をもつ方式であるといえる。
＜3．実施の形態３＞
以下、本発明の実施の形態３に係るガベージコレクション装置（以下、「第２変形ガベージコレクション装置」という。）について説明する。
【０１１５】
＜3-1．構成＞
第２変形ガベージコレクション装置は、実施の形態１において説明したガベージコレクション装置１００と基本的な構成は同じであるが、リファレンスカウンタＡとＢとの２つではなく、セル毎に１つしかリファレンスカウンタを用いなくても、リファレンスカウント方式を基礎としてカウントアンドスイープ処理を行うことができるようにしたものである。以下、第２変形ガベージコレクション装置の機能構成要素についてはガベージコレクション装置１００の機能構成要素と同じ符号を用いて説明する（図１参照）。また、この第２変形ガベージコレクション装置に対応し、実施の形態１に示した制御機構２００に相当する制御機構を第２変形制御機構といい、その機能構成要素については制御機構２００の機能構成要素と同じ符号を用いて説明する。
【０１１６】
＜3-2．データ＞
以下、第２変形ガベージコレクション装置の処理対象となり、アプリケーションプログラムにおけるオブジェクトのデータを格納するために用いられるデータ単位であるセルについて説明する。
図２３は、第２変形ガベージコレクション装置が取り扱うセルのデータ構造を示す図である。なお、同図における１行は、計算機の基本語長となるワード単位に相当する。
【０１１７】
セル３１００は、複数ワードで構成され、１ワードのヘッダ部と、可変長のデータ領域３１０５とからなる。
ここで、ヘッダ部は、有効セルフラグ領域３１０１とセル長領域３１０２とリファレンスカウンタ領域３１０３と作業フラグ領域３１０４とから構成される。
有効セルフラグ領域３１０１及び作業フラグ領域３１０４はそれぞれ、実施の形態１で図２により示した有効セルフラグ領域１１０１及び作業フラグ領域１１０５と同等であり、そのためここでは説明を省略する。なお、この実施の形態３においては、実施の形態１と同様にセルの作業フラグが０であることをセルが白色であると、作業フラグが１であることをセルが灰色であると、作業フラグが２であることをセルが黒色であるとも表現する。
【０１１８】
セル長領域３１０２は、実施の形態１で示したセル長領域１１０２より４ビット大きく、ヘッダ部と作業用領域とデータ領域とを合わせたセル長を示す値を格納する２５ビットの領域である。この領域に格納されるセル長は、例えばワード数で表される。
リファレンスカウンタ領域３１０３は、リファレンスカウンタを格納する４ビットの領域である。リファレンスカウンタは０から１５までの数を表すことができるが、最大値である１５は、セルが参照されている数が１５以上に１度なってしまったためにリファレンスカウンタがオーバフローしていることを示すものとして用いられる。
【０１１９】
データ領域３１０５は、実施の形態１で示したデータ領域１１０６と同等であり、そのためここでは説明を省略する。
また、第２変形ガベージコレクション装置では、カウントアンドスイープ処理の実行中か否かを示すために、メモリ中の１ビットをカウントアンドスイープ実行中フラグと定めて、実行中であればカウントアンドスイープ実行中フラグをオン（ＯＮ）にし、実行中でなければオフ（ＯＦＦ）にする。
【０１２０】
＜3-3．動作＞
以下、上述したセルを対象としたガベージコレクションを行う第２変形ガベージコレクション装置と、これに関連し、アプリケーションプログラムの解釈実行の制御を行う第２変形制御機構との動作について説明する。
＜3-3-1．セルの生成＞
アプリケーションプログラムのコードを逐次解釈し実行のための制御を行う第２変形制御機構は、オブジェクト生成用のコードを解釈対象としたときに、セル確保部２０１によりセル生成処理を行う。
【０１２１】
このセル生成処理は、実施の形態１で示したセル生成処理（図５参照）と基本的に同等である。但し、ステップＳ４１３の「リファレンスカウンタＡ及びＢを０」とするところを「リファレンスカウンタを０」とするように読み替える必要がある。
＜3-3-2．ポインタの変更＞
第２変形制御機構は、アプリケーションプログラムにおけるオブジェクトポインタへの代入のコードを解釈対象としたときにポインタ設定部２０２を通じてポインタの変更を第２変形ガベージコレクション装置に伝える。なお、ポインタ設定部２０２は、ポインタの変更を伝える際に、変更前後のポインタの値をも伝える。
【０１２２】
第２変形ガベージコレクション装置は、ポインタの変更が伝えられるとポインタ変更対応処理を行う。
図２４は、第２変形ガベージコレクション装置の行うポインタ変更対応処理を示すフローチャートである。
ポインタの変更が伝えられると、第２変形ガベージコレクション装置のカウンタ変更部１１０は、変更前のポインタがセルを指すか否かを判定し（ステップＳ８２１）、セルを指すものである場合には、その着目している変更前のポインタに基づいてセル参照解除処理を行い（ステップＳ８２２）、セルを指すものでない場合にはステップＳ８２２のセル参照解除処理は行わない。つまり変更前のポインタがＮＵＬＬであればセル参照解除処理は行わない。なお、セル参照解除処理については後に図２５を用いて説明する。
【０１２３】
続いて、カウンタ変更部１１０は、変更後のポインタがセルを指すか否かを判定し（ステップＳ８２３）、セルを指すものでない場合にはポインタ変更対応処理を終了する。
また、ステップＳ８２３において、変更後のポインタがセルを指すものである場合には、カウンタ変更部１１０は、カウントアンドスイープ実行中フラグを参照してカウントアンドスイープ処理が実行中であるか否かを判定し（ステップＳ８２４）、実行中であれば変更後のポインタを保持するセルは黒色であるか否か、つまりそのセルの作業フラグは２であるか否かを判定する（ステップＳ８２７）。
【０１２４】
ステップＳ８２７において、変更後のポインタを保持するセルが黒色でないと判定した場合には、カウンタ変更部１１０はポインタ変更対応処理を終了する。
ステップＳ８２７において、変更後のポインタを保持するセルが黒色であると判定した場合には、カウンタ変更部１１０は、その変更後のポインタが指すセルの作業フラグは０であるか否か、即ちそのセルが白色であるか否かを判定し（ステップＳ８２８）、白色である場合に限りその変更後のポインタが指すセルの作業フラグを０から１に変更する（ステップＳ８２９）。
【０１２５】
ステップＳ８２８、Ｓ８２９の後には、或いはステップＳ８２４においてカウントアンドスイープ処理が実行中でないと判定した場合には、カウンタ変更部１１０は、カウンタ最大値判定部１１１により、変更後のポインタの指すセルのリファレンスカウンタがＭＡＸ値であるか否かを判定し（ステップＳ８２５）、ＭＡＸ値でない場合にはカウンタ増加部１１２によりそのリファレンスカウンタを１増やして（ステップＳ８２６）、ポインタ変更対応処理を終了し、ＭＡＸ値である場合にはステップＳ８２６を行わずにポインタ変更対応処理を終了する。
【０１２６】
図２５は、第２変形ガベージコレクション装置の行うセル参照解除処理を示すフローチャートである。なお、同図ではステップＳ８３６においてセル参照解除処理を再帰的に実行するように表現している。
まず、カウンタ変更部１１０は、カウントアンドスイープ実行中フラグを参照してカウントアンドスイープ処理が実行中であるか否かを判定し（ステップＳ８３１）、実行中でなければ、セル参照解除処理を行う直前に着目していたポインタに基づき、カウンタ最大値判定部１１１により、その着目していたポインタの指すセルのリファレンスカウンタはＭＡＸ値であるか否かを判定する（ステップＳ８３２）。
【０１２７】
以下、セル参照解除処理のステップＳ８３１を行う時点で着目していたポインタを処理対象ポインタということとする。
ステップＳ８３２において、処理対象ポインタの指すセルのリファレンスカウンタがＭＡＸ値でないと判定した場合には、カウンタ変更部１１０は、カウンタ減少部１１３によりそのリファレンスカウンタを１減らし（ステップＳ８３３）、続いてカウンタゼロ判定部１２０は、そのリファレンスカウンタが０になったか否かを判定する（ステップＳ８３４）。
【０１２８】
ステップＳ８３４において、リファレンスカウンタが０になっていると判定された場合には、処理対象ポインタの指すセルの保持する、セルへのポインタに順次着目してセル参照解除処理（図２５）を繰り返す（ステップＳ８３５、Ｓ８３６）。これにより、処理対象ポインタの指すセルが保持する、セルへのポインタの数だけステップＳ８３６が繰り返されることになる。なお、処理対象ポインタの指すセルが、セルへのポインタを保持しない場合にはステップＳ８３６の処理は省略される。
【０１２９】
セル解放部１３０は、ステップＳ８３４においてリファレンスカウンタが０になっていると判定されたセルについて、ステップＳ８３６の繰り返しの後に、有効セルフラグを０にすることによりセルを解放し（ステップＳ８３７）、これによりセル参照解除処理は終了する。
また、ステップＳ８３１においてカウントアンドスイープ処理が実行中であると判定した場合には、カウンタ変更部１１０は、処理対象ポインタを保持するセルが黒色であるか否かを判定し（ステップＳ８３８）、黒色であった場合には、カウンタ最大値判定部１１１により処理対象ポインタの指すセルのリファレンスカウンタはＭＡＸ値であるか否かを判定する（ステップＳ８３９）。
【０１３０】
ステップＳ８３９において、カウンタ最大値判定部１１１が処理対象ポインタの指すセルのリファレンスカウンタがＭＡＸ値でないと判定した場合には、カウンタ減少部１１３はそのリファレンスカウンタを１減らし（ステップＳ８４０）、これによりセル参照解除処理は終了する。
また、ステップＳ８３２において処理対象ポインタの指すセルのリファレンスカウンタがＭＡＸ値であると判定された場合と、ステップＳ８３４においてリファレンスカウンタが０になっていないと判定された場合と、ステップＳ８３８において処理対象ポインタを保持するセルが黒色でないと判定された場合と、ステップＳ８３９において処理対象ポインタの指すセルのリファレンスカウンタはＭＡＸ値であると判定された場合とには、セル参照解除処理は終了する。
【０１３１】
＜3-3-3．カウントアンドスイープ処理＞
第２変形制御機構のカウントアンドスイープ指示部２１０は、単位時間当たりにおいて、ＣＰＵがアプリケーションプログラムの実行に割り当てられる時間に対して比較的少ない時間を用いて、メモリ３００中において新たにセルを割り当てることのできるメモリ領域が予め定めた基準量より減少しているか否かの検出を行って、減少している場合にはその比較的少ない時間を用いて第２変形ガベージコレクション装置にカウントアンドスイープ処理を行わせるよう制御する。
【０１３２】
図２６は、第２変形ガベージコレクション装置の行うカウントアンドスイープ処理を示すフローチャートである。
カウントアンドスイープ指示部２１０からカウントアンドスイープ処理の実行が要求されると、第２変形ガベージコレクション装置の再カウント部１４０は、まず、カウントアンドスイープ実行中フラグをＯＮにし（ステップＳ８５１）、全てのセルについてのリファレンスカウンタを０にして作業フラグを０にする（ステップＳ８５２）。これにより全てのセルが白色になる。
【０１３３】
ステップＳ８５２に続いて、再カウント部１４０は、ルートポインタから直接指されている全てのセルについて、作業フラグを１にしてセルを灰色にするとともに、リファレンスカウンタがＭＡＸ値でなければリファレンスカウンタを１増やす（ステップＳ８５３）。
ステップＳ８５３に続いて、再カウント部１４０は、ルートポインタに端を発するポインタチェーンを辿って、灰色のセルを探索する（ステップＳ８５４）。
【０１３４】
再カウント部１４０はステップＳ８５４の探索の結果として、灰色のセルを探索できた場合には（ステップＳ８５５）、探したその灰色のセル内におけるポインタであってセルを指すもの毎に、そのポインタが指すセルが白色ならば、そのセルの作業フラグを０から１に変更することによってその白色のセルを灰色にするステップＳ８５７と、そのポインタが指すセルのリファレンスカウンタがＭＡＸ値でなければリファレンスカウンタを１増やすステップＳ８５８とを繰り返し行う（ステップＳ８５６〜Ｓ８５８）。但し、探した灰色のセル内にセルを指すポインタがない場合にはステップＳ８５７及びＳ８５８の処理は省略する。
【０１３５】
探したその灰色のセル内のポインタ毎にステップＳ８５６により、ステップＳ８５７及びＳ８５８を繰り返し行った後に、再カウント部１４０は、その灰色のセルを黒色にし（ステップＳ８５９）、ステップＳ８５４の処理に戻る。即ち、また別の灰色のセルの探索を開始する。
こうしてステップＳ８５４〜Ｓ８５９が繰り返され、灰色のセルが存在しなくなった場合には、再カウント部１４０は、ステップＳ８５５においてｎｏの分岐に進み、全てのセルについてセル毎にステップＳ８６０〜Ｓ８６２を行う（ステップＳ８６０）。即ち、再カウント部１４０は、全てのセルそれぞれについて順次、再カウント結果ゼロ判定部１４１により、セルのリファレンスカウンタが０であるか否かを判定し（ステップＳ８６１）、０である場合に限りセル解放部１３０がそのセルの有効セルフラグを０にしてセルを解放する（ステップＳ８６２）。こうして全てのセルについてステップＳ８６０による処理の繰り返しを行った後に、第２変形ガベージコレクション装置はカウントアンドスイープ実行中フラグをＯＦＦにし（ステップＳ８６３）、カウントアンドスイープ処理を終了する。
【０１３６】
なお、カウントアンドスイープ処理は、アプリケーションプログラムの実行と並行して行われる。但し、カウントアンドスイープ処理は、図２６に示す単一ステップの実行中においてはアプリケーションプログラムが実行されないようにし、さらにステップＳ８５６の実行開始からステップＳ８５９の実行終了までの間においてもアプリケーションプログラムが実行されないようにされる必要がある。これは、例えば、マルチタスク制御を行うＯＳに対して、第２変形ガベージコレクション装置が単一ステップやステップＳ８５６〜Ｓ８５９の実行中はＣＰＵを専有することを宣言する等によって実現される。
【０１３７】
＜3-4．考察＞
このようにセル毎にリファレンスカウンタを１つだけ用いることとする方式によれば、カウントアンドスイープ処理の実行中においては、ポインタの変更によってどこからも参照されなくなったセルを即座に解放することはできなくなるが、リファレンスカウンタを２つ用いる方式よりもリファレンスカウントのために必要な領域が少ないので、セル長領域に多くのビットを割り当てることや、１ワードのヘッダ部に他の情報を盛り込むこと等が可能になる。
＜4．補足＞
以上、本発明に係るガベージコレクション装置について、実施の形態１〜３を用いて説明したが、本発明はこのような実施の形態に限られないことは勿論である。即ち、
（１）実施の形態１〜３では、ガベージコレクションをガベージコレクション装置と制御機構との連携により行うこととしたが、これらはソフトウェアで実現されるものであるため、両者を明確に分離する必要性はなく、また、相互の機能分担を変更しても差し支えなく、ガベージコレクション装置に制御機構の一部機能を含めてもよい。
（２）実施の形態１〜３では、リファレンスカウンタが０〜１５の数を表せる４ビットで構成され、０から１４までの被参照数をカウントでき、１５という値でカウンタのオーバフローを表すこととしたが、リファレンスカウンタのサイズはこれに限定されることはない。基本的に、セルの生成からある程度時間が経過したときにおけるセルの被参照数、言い換えればピーク時ではなく定常状態における安定値（図２９参照）を、オーバフローすることなくカウント可能な程度であってピーク値はカウント不可能な程度の小さ目なサイズにするのが適切である。なお、安定値はアプリケーションプログラムの構造に依存する面をもつため、実行対象のアプリケーションプログラムを想定して、リファレンスカウンタを適切に定めるとよい。例えば、安定値が２０程度であれば、リファレンスカウンタとしては０〜３１の数を表せる５ビット程度が適切なものとなる。
（３）実施の形態１〜３で示した各セル中のセル長領域のサイズは、単なる一例にすぎず、例えばセル長領域のサイズを小さくしてその分だけ他の管理用の情報等をセル内に盛り込んでもよい。
（４）実施の形態１〜３では、メモリ不足を検出したときにカウントアンドスイープ処理を実行することとしたが、これに限定されることはなく、単に周期的にカウントアンドスイープ処理を実行することとしてもよい。また、例えばリファレンスカウンタがＭＡＸ値になっているセルの数を把握しておき、その数が所定の基準値より多くなった場合にカウントアンドスイープ処理を実行することとしてもよい。
【０１３８】
また、カウントアンドスイープ処理はアプリケーションプログラムとは別のスレッドとして、アプリケーションプログラムに対して少ない時間配分で動作するように制御する方法の他に、アプリケーションプログラムが実行されないようにして、即ちアプリケーションプログラムの実行を一時的に中断して、カウントアンドスイープ処理を最初から最後まで行うという方法を用いてもよい。
（５）実施の形態１〜３では、セルのデータ領域にデータ型の情報とデータを格納することとしたが、これに限定されることはなく、データ領域の内容は、そのデータ領域に格納されているデータがセルへのポインタであるか否かの判断ができるようなものであれば足りる。例えば、データ領域にはデータ型を含ませず単にデータのみを格納することとして、そのデータの値を、予め定めたセルの所在するアドレス範囲に関するルール等に基づいて解析することにより、そのデータがセルへのポインタか否かを判断するようにしてもよい。
（６）実施の形態１における図８のステップＳ５１２、及び実施の形態２における図１７のステップＳ７１２では、リファレンスカウンタＢをリファレンスカウンタＡにコピーすることとしたが、必ずしも全てコピー必要はなく、リファレンスカウンタＡがＭＡＸ値になっている場合にのみそのリファレンスカウンタＡを、リファレンスカウンタＢの値と同じ値にすることとしてもよい。
（７）実施の形態２では、作業用スタックを、セル内に作業用領域を設けてポインタチェーンを張ることにより実現したが、セルに使用するのとは別のメモリ領域に連続したスタック領域を設けて、セルへのポインタを積んだり取り出したり、つまりＰＵＳＨしたりＰＯＰしたりするようにしてもよい。
（８）実施の形態１及び２で示したガベージコレクション装置におけるカウントアンドスイープ処理は、セルが確保されて初めて参照されてから、どこからも参照されなくなるまでの平均的な期間として設計上予測される期間より短い周期で、繰り返し実行を開始されるようにガベージコレクション装置を構築してもよい。このようにすることで、平均的な生存期間を有するセルについては、セルが確保された後に一旦リファレンスカウンタがオーバフローしても、セルが不要になるまでの間に、カウントアンドスイープ処理により再度リファレンスカウンタが有効値に戻ることとなり、カウントアンドスイープ処理が特に効果的に機能するようになる。なお、セルが確保された初めて参照されてから、どこからも参照されなくなるまでの期間については、アプリケーションプログラムの実行中にガベージコレクション装置の内部又は外部の機構により、測定し算定して、この算定した期間に応じてガベージコレクション装置は、カウントアンドスイープ処理の実行開始タイミングを決定することとしてもよい。
（９）実施の形態１〜３で示したルートポインタは、変更されないことを想定しているが、変更可能とするためには、例えば、ルートポインタを保持する領域を１つのセルとして構成し、カウントアンドスイープ開始の際には、このセルの作業フラグを黒色に設定する方式か、又は、実施の形態１等で示したポインタ変更処理中で、変更後のルートポインタが指し示すセルが白色であった場合にはそのセルを灰色に変更するような処理を行う方式を採用するとよい。
（１０）実施の形態１〜３で示したガベージコレクション装置及び制御機構の処理手順、（図５〜８、図１６、図１７、図２４〜２６に示した手順等）を、コンピュータ又は情報家電機器に実行させるためのコンピュータプログラムを、記録媒体に記録し又は各種通信路等を介して、流通させ頒布することもできる。このような記録媒体には、ＩＣカード、光ディスク、フレキシブルディスク、ＲＯＭ等がある。流通、頒布されたコンピュータプログラムは、コンピュータ又は情報家電機器にインストール等されることにより利用に供され、そのコンピュータ又は情報家電機器は当該コンピュータプログラムを実行して、実施の形態１〜３で示したようなガベージコレクションを行うことができるようになる。
【０１３９】
【発明の効果】
＜5．実施の形態１に係るガベージコレクション装置の効果の検証＞
以下、実施の形態１で示したカウントアンドスイープ処理によるガベージコレクション（以下、「新ガベージコレクション」という。）の効果を検証すべく行ったシミュレーション実験の内容及び結果について簡単に説明する。
【０１４０】
このシミュレーション実験は、新ガベージコレクションと、上述した従来のカウンタ制限リファレンスカウント方式を一部変形した方式によるガベージコレクション（以下、「旧ガベージコレクション」という。）とを対比して行った。
ここで、旧ガベージコレクションは、カウンタ制限リファレンスカウント方式から、リファレンスカウンタがオーバフローした場合における処理、つまりそのセルを特定領域にコピーする等の処理を省き、オーバフローしたリファレンスカウンタについてはカウントアップ及びカウントダウンの対象から外すこととし、更にマークアンドスイープ方式によるガベージコレクション処理を追加したものである。
【０１４１】
＜5-1．実験内容＞
アプリケーションプログラムが一定時間毎に単一サイズのオブジェクト（セル）を生成する状況下で、オブジェクトにより占有されたメモリ量が一定量になる毎にマークアンドスイープ処理或いはカウントアンドスイープ処理によるガベージコレクションを実行し、そのガベージコレクションの実行頻度等を調べたものである。
【０１４２】
ここで、時間の単位としてステップを用い、アプリケーションプログラムは１００ステップ間において１０オブジェクトを生成するものとする。また、１つのオブジェクトの生存期間における被参照数は、図３０に示すように時間経過とともに変化するものとする。
また、全メモリ量は、オブジェクト３００個分のサイズとし、ガベージコレクションの実行タイミングは、オブジェクトにより占有されたメモリ量が全メモリ量の９割に達した時であることとする。
【０１４３】
また、旧ガベージコレクションにおけるセルのヘッダ部は有効セルフラグ領域（１ビット）、セル長領域（２５ビット）、リファレンスカウンタ領域（４ビット）及び作業フラグ（２ビット）の計３２ビットで構成され、新ガベージコレクションにおけるセルのヘッダ部は有効セルフラグ領域（１ビット）、セル長領域（２１ビット）、リファレンスカウンタＡ領域（４ビット）、リファレンスカウンタＢ領域（４ビット）及び作業フラグ（２ビット）の計３２ビットで構成されるものとする。
【０１４４】
＜5-2．実験結果＞
図３１は、シミュレーション実験による未解放のメモリ量（メモリを占有しているオブジェクト数）の時間的変化を示す図である。
同図から明らかなように、新ガベージコレクションの実行頻度は旧ガベージコレクションの実行頻度より小さい。
【０１４５】
この実験によれば、３万ステップ経過迄におけるガベージコレクション実行回数は、旧ガベージコレクションでは４６回であるのに対し、新ガベージコレクションでは１１回と少ないものとなった。なお、このときにおけるマークアンドスイープ処理とカウントアンドスイープ処理とのそれぞれの作業量を、各アルゴリズムに由来するメモリアクセス回数に基づき推定して検証すると、新ガベージコレクションは旧ガベージコレクションの約４割の作業量であると算定された。
【０１４６】
従って、旧ガベージコレクションと比較すれば、新ガベージコレクションは、アプリケーションプログラムの実行性能にあまり悪影響を与えることなく、効率的に不要なセルの回収を行うことを可能にする方式であると言える。
＜6．発明の効果＞
以上説明したことから明らかなように、本発明に係るガベージコレクション装置は、アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、各メモリセル内に設けた被参照カウンタを用いてリファレンスカウント方式によりガベージコレクションを行うリファレンスカウント手段と、アプリケーションプログラムの実行とは独立して１以上のメモリセルについて、当該メモリセルが現実に参照されている数を調査する独立カウント手段と、前記独立カウント手段による調査結果である数を、対応するメモリセルの被参照カウンタに設定する設定手段とを備えることを特徴とする。
【０１４７】
これにより、たとえ被参照カウンタがオーバフローするようなことがあったとしても、セルが参照されている数が実際上カウントされ被参照カウンタにあらためて設定されることにより被参照カウンタは正しい値に修正され得るため、その後にはリファレンスカウント方式のガベージコレクションによってポインタの変更に伴いセルがどこからも参照されなくなった時点で即座にそのセルが解放されるようになる。図２９で示したようにセルの被参照数がピーク値になった後、時間経過とともに安定値に落ち着く場合等、セルの被参照数が時間経過につれて大きく変動するような場合においては、被参照カウンタを安定値は表せるがピーク値は表せない程度の小さなビット数で構成することとしても、本発明によればリファレンスカウント方式によるガベージコレクションが可能になる。
【０１４８】
ここで、前記各メモリセル内に設けられた被参照カウンタは、当該メモリセルの被参照数を表すための、１ワード未満の所定ビット数で構成され、前記リファレンスカウント手段は、アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、当該メモリセルの被参照カウンタが前記所定ビット数で表せる最大値より小さい値であれば、当該被参照カウンタを当該変更に応じて被参照数を表すように増加又は減少させて、被参照カウンタの値が０になれば当該メモリセルを解放し、前記独立カウント手段は、少なくとも被参照カウンタが前記最大値である各メモリセルについて前記調査を行うこととしてもよい。
【０１４９】
これにより、リファレンスカウント方式において、セルの被参照カウンタがオーバフローした場合つまり被参照カウンタが既に最大値になっている場合にはカウンタの増減を行わないようにしておくためポインタ変更時にどこからも参照されなくなったセルの解放は行われないが、独立カウント手段及び設定手段により被参照カウンタが現実にセルの被参照数を示すようにあらためて設定され得るため、設定された後にはセルはポインタ変更時にどこからも参照されなくなっていれば即座に解放されるようになる。なお、セルの解放により、セルに割り当てていたメモリ領域を新たにセルの生成のために用いることが可能になる。
【０１５０】
また、前記メモリセル内には、独立カウント手段による調査に用いるための前記所定ビット数の調査用カウンタを設けてあり、前記独立カウント手段は、調査対象のメモリセルの調査用カウンタを０にする初期設定処理の後に、所定のルートポインタから直接又はポインタチェーンを介して指されている各メモリセルについての調査用カウンタを、前記所定ビット数で表せる最大値を超えない範囲で、現実に指されている数を示すように増加するカウント処理を行うことにより前記調査を行い、前記設定手段は、メモリセル毎に、当該メモリセルの調査用カウンタの値を被参照カウンタに設定することとしてもよい。
【０１５１】
これにより、現実にセルが参照されている数をカウントする処理を簡単に実現できる。ここで、被参照カウンタは実施の形態において示したリファレンスカウンタＡに相当し、調査用カウンタはリファレンスカウンタＢに相当する。
また、前記メモリセル内には、独立カウント手段による調査状態が第１段階、第２段階及び第３段階のいずれであるかを示すための作業フラグを設けてあり、前記独立カウント手段は、全てのメモリセルの作業フラグに第１段階を示す値を設定し、続いて前記ルートポインタに指されているメモリセルの作業フラグに第２段階を示す値を設定し、第２段階を示す作業フラグを含むメモリセルがある限り当該メモリセルに順次着目して以下に示すカウントアップ処理を実行することにより前記カウント処理を行い、前記カウントアップ処理は、着目したメモリセルの作業フラグに第３段階を示す値を設定し、当該メモリセルが他の１以上のメモリセルへのポインタを含むときに当該他の全てのメモリセルについての前記調査用カウンタを前記最大値を超えない限りにおいて１増加するとともに、当該他のメモリセルのうち作業フラグが第１段階を示すものについては作業フラグに第２段階を示す値を設定する処理であり、前記リファレンスカウント手段は、アプリケーションプログラムの実行により、第３段階を示す作業フラグを含むメモリセルに含まれるポインタが変更された時に、変更前のポインタが指していたメモリセルの調査用カウンタを１減少するとともに、変更後のポインタが指すメモリセルの調査用カウンタを前記最大値を超えない限りにおいて１増加し、前記独立カウント手段は、前記調査をアプリケーションプログラムの実行と並行して行い、前記カウントアップ処理の実行中はアプリケーションプログラムの実行を抑止することとしてもよい。
【０１５２】
これにより、セルが現実に参照されている数の調査を開始してから終了するまでの間に、アプリケーションプログラムを動作させることができるようになる。また、前記メモリセル内には、独立カウント手段による調査状態が第１段階及び第２段階のいずれであるかを示すための作業フラグを設けてあり、前記独立カウント手段は、メモリセルのアドレスをスタックに格納するアルゴリズムを用いて、全てのメモリセルの作業フラグに第１段階を示す値を設定し、続いて前記ルートポインタに指されているメモリセルのアドレスをスタックに積み、スタックにメモリセルのアドレスが積まれている限り以下に示すカウントアップ処理を実行することにより前記カウント処理を行い、前記カウントアップ処理は、スタックから取り出したアドレスの示すメモリセルの作業フラグに第２段階を示す値を設定し、当該メモリセルが他の１以上のメモリセルへのポインタを含むときに当該他の全てのメモリセルについての前記調査用カウンタを、前記最大値を超えない限り１増加するとともに、当該他のメモリセルのうち作業フラグが第１段階を示すものについてはそのアドレスをスタックに積む処理であり、前記リファレンスカウント手段は、アプリケーションプログラムの実行により、第２段階を示す作業フラグを含むメモリセルに含まれるポインタが変更された時に、変更前のポインタが指していたメモリセルの調査用カウンタを１減少するとともに、変更後のポインタが指すメモリセルの調査用カウンタを、前記最大値を超えない限りにおいて１増加し、前記独立カウント手段は、前記調査をアプリケーションプログラムの実行と並行して行い、前記カウントアップ処理の実行中はアプリケーションプログラムの実行を抑止することとしてもよい。
【０１５３】
これにより、セルが現実に参照されている数の調査を高速に行うことが可能になり、この調査とアプリケーションプログラムの実行を並行して行うことができるようになる。
また、前記ガベージコレクション装置はさらに、前記独立カウント手段による調査結果である数が０となっているメモリセルを解放する解放手段を備え、前記設定手段は、前記調査結果である数が１以上である場合に限り、前記設定を行うこととしてもよい。
【０１５４】
これにより、セルが現実に参照されている数の調査を行った結果として、被参照数が０であったセルを解放することが可能になる。セルへのポインタのチェーンがループしている場合にはセルをリファレンスカウント方式のみでは解放できないが、このガベージコレクション装置によれば、ルートポインタから辿ることのできない不要なセルを解放することが可能になる。
【０１５５】
また、前記独立カウント手段は、アプリケーションプログラムの実行により確保されて参照される各メモリセルが、参照されてから全く参照されなくなるまでの平均的な時間と予測される時間より短い時間毎に、前記調査を行い、前記設定手段は、前記独立カウント手段により調査が行われる度に前記設定を行うこととしてもよい。
【０１５６】
これにより、半数以上のセルについて、確保された後に一旦は被参照カウンタのオーバフローによりリファレンスカウント方式の活用が不可能になってもそのセルが不要になる迄の期間内に、リファレンスカウント方式によるガベージコレクションが活用できるようになり、そのセルが不要になると即座にセルの解放が行えるようになるので、ガベージコレクション装置の実用性が高まる。
【０１５７】
また、本発明に係るガベージコレクション装置は、各メモリセル内に当該メモリセルの被参照数を表すための、１ワード未満の所定ビット数の被参照カウンタを設けておき、アプリケーションプログラムの実行によってメモリセルへの参照状態が変更された時に、当該メモリセルの被参照カウンタが前記所定ビット数で表せる最大値より小さい値であれば、当該被参照カウンタを当該変更に応じて被参照数を表すように増加又は減少させて、被参照カウンタの値が０になれば当該メモリセルを解放するリファレンスカウント方式により、ガベージコレクションを行うリファレンスカウント手段と、アプリケーションプログラムの実行とは独立して各メモリセルについて、当該メモリセルが現実に参照されている数を調査する独立カウント手段であって、調査対象のメモリセルの被参照カウンタを０にする初期設定処理の後に、所定のルートポインタから直接又はポインタチェーンを介して指されている各メモリセルについての被参照カウンタを、前記所定ビット数で表せる最大値を超えない範囲で、現実に指されている数を示すように増加するカウント処理を行う独立カウント手段とを備え、前記リファレンスカウント手段は、前記独立カウント手段により前記調査が行われている最中においては前記メモリセルの解放を行わないようにすることを特徴とする。
【０１５８】
これにより、リファレンスカウント方式において、セルの被参照カウンタがオーバフローした場合つまり被参照カウンタが既に最大値になっている場合にはカウンタの増減を行わないようにしておくためポインタ変更時にどこからも参照されなくなったセルの解放は行われないが、独立カウント手段により被参照カウンタが現実にセルの被参照数を示すようにあらためて設定され得るため、設定された後にはセルはポインタ変更時にどこからも参照されなくなっていれば即座に解放されるようになる。また、独立カウント手段による現実のセルの被参照数のカウントに被参照カウンタを用いるため、このカウント専用のカウンタを設ける必要がなくなる。
【０１５９】
また、前記所定ビット数は、当該所定ビットで表せる最大値がメモリセルの被参照数のピーク値と予測される値より小さくなるように定めたビット数であることとしてもよい。
これにより、リファレンスカウント用のカウンタの領域を小さなものにすることができるため、セル内にワード単位でセルの管理用の情報を設けることとした場合において、そのカウンタの領域を小さくした分だけ、例えばセル長等のセルの管理用の情報を従来より大きなサイズでセル内に持たせることが可能になり、これにより例えば、アプリケーションプログラムに対して確保を許容するセルサイズの拡大等を図ることが可能になる。
【図面の簡単な説明】
【図１】本発明の実施の形態１に係るガベージコレクション装置１００の構成図である。
【図２】セルのデータ構造を示す図である。
【図３】メモリ３００の一部の領域にセルが割り当てられている様子を示す図である。
【図４】ある時点におけるセルの内容とセル間の関係を例示した図である。
【図５】セル確保部２０１が行うセル生成処理を示すフローチャートである。
【図６】ガベージコレクション装置１００の行うポインタ変更対応処理を示すフローチャートである。
【図７】ガベージコレクション装置１００の行うセル参照解除処理を示すフローチャートである。
【図８】ガベージコレクション装置１００の行うカウントアンドスイープ処理を示すフローチャートである。
【図９】カウントアンドスイープ処理におけるステップＳ５０２の終了直後のセルの内容とセル間の関係を例示した図である。
【図１０】カウントアンドスイープ処理における１回目のステップＳ５０８の実行の終了直後のセルの内容とセル間の関係を例示した図である。
【図１１】カウントアンドスイープ処理における２回目のステップＳ５０８の実行の終了直後のセルの内容とセル間の関係を例示した図である。
【図１２】カウントアンドスイープ処理においてＳ５０４のｎｏの分岐に進んだ直後のセルの内容とセル間の関係を例示した図である。
【図１３】カウントアンドスイープ処理の終了時点のセルの内容とセル間の関係を例示した図である。
【図１４】変形ガベージコレクション装置が取り扱うセルのデータ構造を示す図である。
【図１５】実施の形態２におけるセルの作業用先頭セルアドレス３０からのポインタチェーンを例示する図である。
【図１６】変形制御機構におけるセル確保部２０１が行うセル生成処理を示すフローチャートである。
【図１７】変形ガベージコレクション装置の行うカウントアンドスイープ処理を示すフローチャートである。
【図１８】カウントアンドスイープ処理におけるステップＳ７０１の終了直後のセルの内容とセル間の関係を例示した図である。
【図１９】カウントアンドスイープ処理におけるステップＳ７０２の実行の終了直後のセルの内容とセル間の関係を例示した図である。
【図２０】カウントアンドスイープ処理におけるステップＳ７０６の繰り返し処理が終わった直後のセルの内容とセル間の関係を例示した図である。
【図２１】カウントアンドスイープ処理において再びステップＳ７０６が終わった直後のセルの内容とセル間の関係を例示した図である。
【図２２】カウントアンドスイープ処理においてステップＳ７０３のｎｏの分岐に進んだ直後のセルの内容とセル間の関係を例示した図である。
【図２３】第２変形ガベージコレクション装置が取り扱うセルのデータ構造を示す図である。
【図２４】第２変形ガベージコレクション装置の行うポインタ変更対応処理を示すフローチャートである。
【図２５】第２変形ガベージコレクション装置の行うセル参照解除処理を示すフローチャートである。
【図２６】第２変形ガベージコレクション装置の行うカウントアンドスイープ処理を示すフローチャートである。
【図２７】従来のマークアンドスイープ方式を説明するための図である。
【図２８】従来のリファレンスカウント方式を説明するための図である。
【図２９】Ｊａｖａにおける典型的なセルへの参照数の時間的変化を示すグラフである。
【図３０】シミュレーション実験における前提となるセルへの参照数の時間的変化を示すグラフである。
【図３１】シミュレーション実験による未解放のメモリ量（メモリを占有しているオブジェクト数）の時間的変化を示す図である。
【符号の説明】
１００    ガベージコレクション装置
１１０    カウンタ変更部
１１１    カウンタ最大値判定部
１１２    カウンタ増加部
１１３    カウンタ減少部
１２０    カウンタゼロ判定部
１３０    セル解放部
１４０    再カウント部
１４１    再カウント結果ゼロ判定部
１４２    カウンタ再設定部
２００    制御機構
２０１    セル確保部
２０２    ポインタ設定部
２１０    カウントアンドスイープ指示部
３００    メモリ
１１００、２１００、３１００    セル
１１０１、２１０１、３１０１    有効セルフラグ領域
１１０２、２１０２、３１０２    セル長領域
１１０３、２１０３              リファレンスカウンタＡ領域
１１０４、２１０４              リファレンスカウンタＢ領域
１１０５、２１０５、３１０４    作業フラグ領域
１１０６、２１０７、３１０５    データ領域
２１０６    作業用領域
３１０３    リファレンスカウンタ領域
【図１】
0004041347.tif 000002
【図２】
0004041347.tif 000003
【図３】
0004041347.tif 000004
【図４】
0004041347.tif 000005
【図５】
0004041347.tif 000006
【図６】
0004041347.tif 000007
【図７】
0004041347.tif 000008
【図８】
0004041347.tif 000009
【図９】
0004041347.tif 000010
【図１０】
0004041347.tif 000011
【図１１】
0004041347.tif 000012
【図１２】
0004041347.tif 000013
【図１３】
0004041347.tif 000014
【図１４】
0004041347.tif 000015
【図１５】
0004041347.tif 000016
【図１６】
0004041347.tif 000017
【図１７】
0004041347.tif 000018
【図１８】
0004041347.tif 000019
【図１９】
0004041347.tif 000020
【図２０】
0004041347.tif 000021
【図２１】
0004041347.tif 000022
【図２２】
0004041347.tif 000023
【図２３】
0004041347.tif 000024
【図２４】
0004041347.tif 000025
【図２５】
0004041347.tif 000026
【図２６】
0004041347.tif 000027
【図２７】
0004041347.tif 000028
【図２８】
0004041347.tif 000029
【図２９】
0004041347.tif 000030
【図３０】
0004041347.tif 000031
【図３１】
0004041347.tif 000032