(57)【特許請求の範囲】
【請求項１】
コンピュータシステムにおいて、コンピュータメモリにおけるデータオブジェクトをマーキングする方法であって、各オブジェクトは、ポインターによって識別され、前記メモリは、スタックおよびヒープを含んでおり、前記ヒープは、複数の古いオブジェクトおよび複数の新オブジェクトを有しており、前記メモリは、新オブジェクトへのポインターを含む複数の古いオブジェクトに対するポインターのリストを含んでおり、前記スタックは、確実にポインターでないか、または多分、ポインターであるとして識別されるスタックエントリを有しており、
各スタックエントリが確実にポインターでないか、または多分、ポインターであるか、を識別し、
多分、ポインターであるとして識別されるスタックエントリによって多分指示される各新オブジェクトに対して、その新オブジェクトをアクセス可能で且つロックされたものとしてマーキングし、該マークされたオブジェクトによりアクセス可能な各新オブジェクトをアクセス可能なものとしてマーキングし、
前記ポインターのリストにおけるポインターによって指示される各古いオブジェクトに対して、その古いオブジェクトに含まれたポインターによって指示される各新オブジェクトをアクセス可能なものとしてマーキングし且つ前記マークされたオブジェクトによりアクセス可能な各新オブジェクトをアクセス可能なものとしてマーキングし、ヒープ圧縮中に、前記ロックされたオブジェクトが移動せず、ロックされていないアクセス可能なオブジェクトが、ヒープの自由空間を統合するように移動する、
各段階を含むことを特徴とする方法。
【請求項２】
マークされたオブジェクトによりアクセス可能な各新オブジェクトをアクセス可能なものとしてマーキングする段階は、そのマークされたオブジェクトから古いオブジェクトによってのみアクセス可能な新オブジェクトをマーキングしない請求項１記載の方法。
【請求項３】
コンピュータシステムにおけるガーベージコレクション方法であって、前記コンピュータシステムは、スタックおよびヒープを有しており、前記ヒープは、複数の新オブジェクトおよび複数の古いオブジェクトを有しており、前記スタックは、スタックエントリを有しており、各オブジェクトは、ポインターによって識別され、
古いオブジェクトが新オブジェクトを指示するようにセットされているポインターを含むとき、その古いオブジェクトを想起し、
ガーベージコレクション中、
各スタックエントリを確実にポインターでないとして、または多分、ポインターであるとして識別し、
多分、ポインターであるとして識別されたスタックポインターによって多分指示された各新オブジェクトをアクセス可能で且つロックされたものとしてマーキングし、想起されたオブジェクトによって指示される各新オブジェクトをアクセス可能なものとしてマーキングし、
前にマークされたオブジェクトによってアクセス可能な各新オブジェクトをアクセス可能なものとしてマーキングし、
アクセス可能で且つロックされていない新オブジェクトを移動させ、アクセス可能で且つロックされたオブジェクトを移動させないことにより、マークされていない新オブジェクトに対して使用されるメモリをアクセス可能なものとして再生利用する段階を含むことを特徴とする方法。
【請求項４】
コンピュータシステムにおけるメモリコンパクション方法であって、前記コンピュータシステムは、メモリを有しており、該メモリは、複数のメモリ場所を有しており、複数のオブジェクトを記憶し、各オブジェクトは、そのオブジェクトを備えるメモリ場所の数を指示するサイズを有しており、各オブジェクトは、アクセス可能であるか、またはアクセス不可能なものであり、各アクセス可能なオブジェクトは、ロックされるか、またはロックされないかであり、前記オブジェクトは、最初のオブジェクトから最後のオブジェクトまで順序付けられており、アクセス可能であってロックされない各オブジェクトは、そのオブジェクトを指示する基準ポインターを有しており、
前記メモリにおいて最初のオブジェクトを指示するメモリポインターを初期化し、
前記メモリにおける各オブジェクトに対して、最初のオブジェクトから始めて最後のオブジェクトまで順番に、そのオブジェクトを選択していき、
前記選択されたオブジェクトがアクセス可能でありロックされていないときに、
前記選択されたオブジェクトのサイズが、前記選択されたオブジェクトがロックされたオブジェクトをオーバライトせずに、前記メモリポインターによって指示されるメモリ場所で始まるメモリ場所へコピーされるようなものであるときは、前記選択されたオブジェクトを、前記メモリポインターによって指示されるメモリ場所で始まるメモリ場所へコピーし、
前記選択されたオブジェクトのサイズが、ロックされたオブジェクトをオーバライトせずにメモリポインターによって指示されたメモリ場所で始まるメモリ場所にコピーされないようなものであるときは、前記選択されたオブジェクトを、ロックされたオブジェクトの後に、前記メモリ場所で始まるメモリ場所へコピーし、
基準ポインターがそのコピーされたオブジェクトを指示するように、その基準ポインターをその選択されたオブジェクトへ更新し、
そのコピーされたオブジェクトの後のメモリ場所を指示するようにメモリポインターを進める、
段階を含むことを特徴とする方法。
【請求項５】
前記選択されたオブジェクトのサイズが、その選択されたオブジェクトがコピーされ得ないようなものであるときに、前記メモリポインターによって指示されるメモリポインターによって指示されるメモリで始まるダミーオブジェクトを、そのダミーオブジェクトのサイズがロックされるオブジェクトをオーバーライトしないように、記憶させ、前記メモリポインターを、前記ロックされるオブジェクトの後の場所を指示するように進める段階を含む請求項４記載の方法。
【請求項６】
コンピュータシステムにおけるメモリコンパクション方法であって、前記コンピュータシステムは、複数のメモリ場所および複数のオブジェクトを有したメモリを有しており、各オブジェクトは、１つまたはそれ以上のメモリ場所を備えており、各オブジェクトは、最初のオブジェクトから最後のオブジェクトまで順序付けられており、各オブジェクトは、アクセス可能であるか、またはアクセス不可能なものであり、各アクセス可能なオブジェクトは、ロックされるか、またはロックされないものであり、アクセス可能でありロックされない各オブジェクトは、そのオブジェクトを指示する基準ポインターを有しており、
複数のアクセス可能なオブジェクトを移動させる段階であって、当該段階は、ロックされないアクセス可能なオブジェクトを移動させ、ロックされるアクセス可能なオブジェクトは移動せず、アクセス可能であってロックされないオブジェクトの順序が移動後も維持されるように移動し、
各移動されたオブジェクトの基準ポインターを、その移動された場所を指示するように調整する
段階を含むことを特徴とする方法。
【請求項７】
前記移動させる段階は、アクセス可能でありロックされないオブジェクトを、既に移動されたアクセス可能でありロックされないオブジェクトまたはアクセス不可能なオブジェクトによって前に占められていたメモリ場所へ移動させることを含む請求項６記載の方法。
【請求項８】
コンピュータシステムにおけるガーベージコレクター装置であって、コンピュータメモリに配置され複数のスタックエントリを有するスタックと、
コンピュータメモリに配置され複数の新および古いオブジェクトを有するヒープと、
各新オブジェクトに対するポインターを含む古いオブジェクトを識別する想起リストと、
各スタックエントリを、多分新オブジェクトに対するポインターであるか、またはそのポインターでないとして識別するようなプロセススタックポインター処理手段と、
多分、ポインターであるとして識別されるスタックエントリによって指示される各新オブジェクトをアクセス可能で且つロックされるとしてマークする多分ポインター処理手段と、
想起リストにおいて識別される古いオブジェクトによって指示される新オブジェクトをアクセス可能なものとしてマークする想起リスト処理手段と、
アクセス可能なものとしてマークされる新オブジェクトによってアクセス可能な新オブジェクトをアクセス可能なものとしてマークするチェック埋込みポインター処理手段と、
ロックされないアクセス可能なオブジェクトを移動させ、ロックされるアクセス可能なオブジェクトは移動せず、アクセス可能なものとしてマークされない各オブジェクトを、アクセス可能オブジェクトを移動することにより、再生利用するリクラメイション手段とを備え、
たことを特徴とするガーベージコレクター装置。
【請求項９】
スタックエントリを有するスタックと、新および古いオブジェクトを有するヒープとを有するコンピュータシステムにおけるガーベージコレクションを行なう方法であって、
各スタックエントリがオブジェクトに対するポインターであるかどうかをコンサーバティブに決定し、
どの古いオブジェクトが新オブジェクトに対するポインターを含むかを想起し、
ポインターであるとしてコンサーバティブに決定されたスタックエントリによってアクセス可能でない新オブジェクトおよび想起される古いオブジェクトによってアクセス可能でない新オブジェクトを再生利用し、
アクセス可能であるが、ポインターであるとコンサーバティブに判断されたスタックエントリを介して指示されない新オブジェクトを移動することによりヒープを結合し、
オブジェクトは、データメンバーを含み、前記データメンバーが新オブジェクトに対するポインターを含むかどうかを明確に決定する段階を含み、ヒープのオブジェクトは、互いに対する相対的な位置を有しており、新オブジェクトの移動は、移動されるオブジェクトの互いに対する相対的な順序位置を維持することを含む
ことを特徴とする方法。
【請求項１０】
スタックおよびヒープを有するコンピュータシステムのためのガーベージコレクター装置であって、前記スタックは、エントリを有し、前記ヒープは、新および古いオブジェクトを有しており、
各スタックエントリが新オブジェクトを指示するかどうかをコンサーバティブに決定する手段と、
新オブジェクトに対するポインターを含む古いオブジェクトを追跡する手段と、
ポインターであるとしてコンサーバティブに決定されたスタックエントリによってアクセス可能でない新オブジェクトおよび新オブジェクトに対するポインターを含む古いオブジェクトによってアクセス可能でない新オブジェクトを再生利用する手段と、
アクセス可能であるが、ポインターであるとコンサーバティブに判断されたスタックエントリを介して指示されない新オブジェクトを移動することによりヒープを結合する手段と、
オブジェクトは、データメンバーを含み、該データメンバーが新オブジェクトに対するポインターを含むかどうかを明確に決定する手段とを備え、ヒープのオブジェクトは、互いに対する相対的位置を有しており、前記新オブジェクトを再生利用する手段は、移動されるオブジェクトの相対的な順序位置を維持する
ことを特徴とするガーベージコレクター装置。
【請求項１１】
コンピュータシステムにおけるガーベージコレクションの方法であって、コンピュータシステムがヒープを有しており、前記ヒープが複数のオブジェクトを有しており、コンピュータシステムは、オブジェクトを確実に参照する複数のデータ値と、オブジェクトを多分参照する複数のデータ値とを有し、
データ値によって多分参照される各オブジェクトを、アクセス可能であってロックされる、としてマーキングし、
データ値によって確実に参照される各オブジェクトを、アクセス可能である、としてマーキングし、
アクセス可能な以前マーキングされたオブジェクトを介してアクセス可能である各オブジェクトをマーキングし、
ヒープを圧縮し、アクセス可能でないヒープの部分を統合するように、ロックされるオブジェクトは移動されず、アクセス可能であってロックされないオブジェクトは移動される、
ことを特徴とする方法。
【請求項１２】
コンピュータシステムがスタックを含み、オブジェクトを多分参照するデータ値が前記スタック内に包含される、ことを特徴とする請求項１１に記載の方法。
【請求項１３】
前記圧縮ステップが、アクセス可能であってロックされないオブジェクトを移動させるステップを含み、移動されたオブジェクトの相対的な順序位置が維持される、ことを特徴とする請求項１１に記載の方法。
【請求項１４】
請求項１１に記載の方法が、古い若しくは新しい何れかの各オブジェクトを指定するステップを有し、
データ値によって確実に参照される各オブジェクトを、アクセス可能である、としてマーキングするステップが、古いオブジェクトからアクセス可能であるそれらの新しいオブジェクトだけをマーキングするステップを有し、
圧縮ステップが新しいオブジェクトだけを移動させるステップを有する、
ことを特徴とする請求項１１に記載の方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、メモリ・ガーベージコレクション用コンピュータシステム及び方法、特にポインターをスタックする従来のアプローチ及び目的を改善する世代アプローチを用いるガーベージコレクション用のシステム及び方法に関する。
【０００２】
【発明の背景】
コンピュータシステムはコンピュータメモリをダイナミックに管理することができる。ダイナミックメモリ管理をメモリのブロックが特別な目的のために一時的に割り当てられ、且つその目的のために最早必要でない時に割当解除される処理に関連している。割当解除されたブロックは他の目的のために再割当に利用できる。メモリをダイナミックに管理する処理はメモリマネジャーと呼ばれている。メモリマネジャーが管理するメモリはヒープと呼ばれている。プログラムがデータを格納するためにメモリブロックを必要とするとプログラムはメモリマネジャーに要求する。メモリマネジャーはその要求を満たすためにヒープにあるメモリブロックを割り当て、プログラムに対してメモリブロックにポインタを送る。プログラムはポインタを介してメモリブロックにアクセスすることが可能である。
【０００３】
ある言語、例えばＣ＋＋で記述されているプログラムの場合、複数のメモリブロック（一つのメモリブロックはしばしばオブジェクトと呼ばれる）は自動的に或いはダイナミックに割り当てられることができる。自動的なオブジェクトは手続きが入り口に入ると自動的に割り当てられ、また手続きが出口を出ると自動的に割当解除になる。逆に言えば、ダイナミックオブジェクトは明白な呼び出しによってメモリマネジャーに割り当てられ、また明白な呼び出しによってメモリマネジャーに、或いはガーベージコレクションとして知られる技術により自動的に割当解除される。典型的には、自動的なオブジェクトはスタックに格納され、またダイナミックオブジェクトはヒープに格納される。
【０００４】
プログラムはポインターを介してダイナミックオブジェクトにアクセスすることだけができる。ポインターはオブジェクトのアドレスを有するメモリ位置である。もしプログラムがポインターをオーバーライトすると、それに対応するオブジェクトはプログラムにアクセスできなくなる。オブジェクトは幾らかのポインターによって指定される。全てのポインターがオーバーライトしたり、あるいは他のアクセスできないオブジェクトの部分であるたときだけ、オブジェクトはアクセスできなくなる。アクセスできないオブジェクトはプログラムがデータを検索できないか、データを書き込むことができない。ガーベージコレクションはプログラムによって最早アクセスできないオブジェクトを検出し、再生するダイナミックメモリ管理の処理であり、また割当解除およびそれに続く再割当のためのものである。
【０００５】
オブジェクトがアクセス可能であるか否かを決定するための２つの基本的技術がある。レファレンスカウンティング技術は、オブジェクトが新しいポインターはオブジェクトに指定するためにセットされるあらゆる時にオブジェクトのポインターカウントを増加することによって、またオブジェクトに対して指定するポインタがオーバーライトするあらゆる時にポインタカウントを減少することによりアクセス可能であるかどうかを追跡する。レファレンスカウンティング技術は高価につく。ある実行において、ポインターカウントを増加、減少する全てのポインター割当のために余分な５０バイトのコードを必要とする。また、ある状態においてはアクセスすることができないオブジェクトを識別することは困難である。例えば、もしオブジェクトＡがオブジェクトＢに対するポインターを含んでおり、オブジェクトＢがオブジェクトＡに対するポインターを含んでおり、またオブジェクトＡに対するポインターカウントが１で、オブジェクトＢに対するポインターカウントが１であるなら、たとえこれらのポインターカウントが０でなくても、オブジェクトＡとＢは実際上アクセスができない。
【０００６】
どのオブジェクトがアクセス可能かを決定する他のガーベージコレクション技術は、オブジェクトに対するポインタを追跡しない。むしろ、さらにヒープメモリが割当てに必要な場合には、ガーベージコレクタがプログラムにおける全てのポインタをチェックすることによっておよびポインタがアクセス可能であるとして指示する各オブジェクトをマーキングすることによってアクセス可能なオブジェクトを識別する。このマーキングが完全であれば、アクセス可能なものとしてマークされていないすべてのオブジェクトはアクセス不能であって再割当てが可能なものである。
【０００７】
代表的には、ガーベージコレクタがメモリ（スタック及びヒープ）の全てのポインタをチェックする。しかし、あるメモリロケーションがポインタまたは他の値を含むかどうかを識別するのは極めて難しい。たとえば、以下のＣ＋＋デクラレーションはオブジェクトＡがあるときはオブジェクトに対するポインタであり他の時間ではインテジャ値であることを示すものである。
0003628032.tif 000002
プログラムがこのオブジェクトに対して各割当てとともにインジケータを設定しないかぎり、ガーベージコレクタにはオブジェクトＡがポインタまたはインテジャを含んでいるかがわからない。この形式のトラッキングは極めて高価である。この形式のトラッキングがないばあいには、オブジェクトＡがオブジェクトに対するポインタとして同じビットパターンをたまたま含むインテジャ値を含む場合には、ガーベージコレクタはそれが本当にインテジャかポインタであるかを知ることが出来ない。ときによってはポインタであり、ときによってはポインタでないメモリロケーションは、”メイビポインタ（ｍａｙ−ｂｅ−ｐｏｉｎｔｅｒ）”として参照する。
【０００８】
ガーベージコレクションへの”コンサーバティブ（ｃｏｎｓｅｒｖａｔｉｖｅ）”アプローチはメイビポインタの各割当てを追跡しない。むしろ、オブジェクトＡはポインタであると仮定して、それがオブジェクトにたいしてアクセス可能であるとして取り扱う。このアプローチに関し、ガーベージコレクタはそれが本当にアクセス不能の場合には、アクセス可能としてオブジェクトをマークする。
【０００９】
コンサーバティブガーベージコレクタはメモリを縮小する場合に問題がある。メモリを縮小する場合、すべてのアクセス可能なオブジェクトは通常では自由空間（再割当てされたオブジェクト）を有するヒープ（割当てられたオブジェクト）の一端に移動させられ、他端をうめる。ガーベージコレクタがオブジェクトに移動すると、ガーベージコレクタはそのオブジェクトに対する全てのポインタをアップデートして新たなロケーションを与えなければならない。しかし、コンサーバティブガーベージコレクタは、メイビポインタの値を変えることはできない。もしメイビポインタが本当に非ポインタ値を含んでいる場合には、ガーベージコレクタはプログラムにエラーを持ち込むことになるからである。このため、この結果、コンサーバティブガーベージコレクタは通常は、メモリを縮小しない。
【００１０】
ガーベージコレクションは時間がかかるので、あるガーベージコレクタはジェネレイショナルコレクションといわれる技術を用いる。ジェネレイショナルガーベージコレクタはヒープにあるオブジェクトを新しいオブジェクト（最近クリエイトされたもの）と古いオブジェクト（最近クリエイトされたものでないもの）との２つのカテゴリーに分割する。この技術は最近クリエイトされたオブジェクトは一般に早くアクセス不能になり、一方、古いオブジェクトは通常は、しばらくはアクセス可能な状態に止まるという仮定を用いる。したがって、ジェネレイショナルガーベージコレクタは新しいオブジェクトを再割当てし古いオブジェクトは行わない。ジェネレイショナルガーベージコレクタは、ガーベージコレクションの完了を犠牲にして、（いくつかの古いオブジェクトはアクセス不能の可能性がある）早いガーベージコレクタプロセスを選択する。
【００１１】
図１及び図２はコンサーバティブアプローチを用いるガーベージコレクション前後のサンプルスタック及びヒープを示す。図１は、ガーベージコレクションの前のスタック１１０とヒープ１２０を示す。スタック１１０は４、２３、１２、６４及び１６の値を有する５０のスタック入力１１１〜１１５を含む。ヒープ１２０はロケーション０、４、８、１２、１６、２０、２４及び２８に８個のオブジェクト１２１〜１２８を含む。スタックエントリ１１１はポインタとしてのみ定義される。スタックエントリ１１２〜１１４はポインタあるいはインテジャである。そして、スタックエントリ１１５はインテジャである。スタックエントリ１１１はオブジェクト１２２に対するポインタ１１８を含む。スタックエントリ１１２は現状ではポインタを含んでいない。その値２３は、任意のオブジェクトのアドレスに対応しないからである。スタックエントリ１１３はポインタ１１６（点線でしめす）を含む可能性がある。ロケーション１２にオブジェクトがあるからである。スタックエントリ１１４は現状ではポインタを含んでいない。その値６４はフリースペースにおけるオブジェクトに対するものであるからである。スタックエントリ１１５は、その値１６がオブジェクトのロケーションに対応していてもポインタではない。ヒープ１２０のオブジェクト１２２はオブジェクト１２３に対するポインタまたはインテジャでるフィールド１１７を含む。オブジェクト１２１、１２５、１２６、１２７及び１２８はアクセス不能である。これらのオブジェクトに対するポインタがないからである。オブジェクト１２２はポインタ１１８がそれを示すからアクセス可能である。オブジェクト１２３及び１２４は、スタックエントリ１１３とフィールド１１９がこのオブジェクトをしめすためアクセス可能である。
【００１２】
図２は、コンサーバティブアプローチを用いてガーベージコレクションを行った後のスタック１１０及びヒープ１２０を示している。この例では、コンサーバティブガーベージコレクタは、メモリロケーションがポインタを含んでいるか、含んでいないか、あるいは、メイビーポインタ（ｍａｙ−ｂｅ−ｐｏｉｎｔｅｒ）を含んでいるか否かを知悉している。ただし、このガーベージコレクタはメイビーポインタがポインタを現在含んでいるか否かは追跡しない。ヒープ１２０はアクセス可能なオブジェクト１２２と、アクセス可能になり得るオブジェクト１２３，１２４とを含んでいる。アクセス不可能なオブジェクト１２１、１２４乃至１２８は自由スペース１３０，１３１に再クレーム（割り当て解除）されている。オブジェクト１２２は移動し、それに対応するポインタであるスタックエントリ１１１は新しいロケーションをポイントするように変更されている。オブジェクト１２３，１２４は、ガーベージコレクションプロセスがスタックエントリ１１３またはフィールド１１９が整数であるか、ポインタであるかを確定することができないので、移動していない。
【００１３】
図３及び図４は、発生的アプローチを用いてガーベージコレクションを行った前後におけるサンプルスタック及びヒープを示している。図３は発生アプローチを用いてガーベージコレクションを行う前のスタック２１０及びヒープ２２０を示す。スタック２１０はポインタである三つのスタックエントリ２１１，２１３，２１４を有している。ヒープ２２０は８個のオブジェクト２１１乃至２１８と自由スペース２２９とを有している。ポインタ２４０はガーベージコレクタによって維持され、新しいオブジェクトのスタートにポイントする。スタックエントリ２１１はオブジェクト２１１にポイントし、スタックエントリ２１３はオブジェクト２２７にポイントし、スタックエントリ２１４はオブジェクト２２３にポイントする。オブジェクト２２３はオブジェクト２２４へのポインタ２４２を含み、オブジェクト２２７はオブジェクト２２８へのポインタ２４４を含んでいる。オブジェクト２２１乃至２２５は古いオブジェクトであり、オブジェクト２２６乃至２２８は新しいオブジェクトである。オブジェクト２２２，２２３，２２４，２２７，２２８はアクセス可能であり、オブジェクト２２１，２２５，２２６はアクセス不可能である。
【００１４】
図４は発生的アプローチを用いてガーベージコレクションを行った後のスタック２１０及びヒープ２２０を示す。発生的アプローチが用いられたので、アクセス不可能な古いオブジェクト２２１，２２５はリクレーム（割り当て解除）されていない。新しく、かつ、アクセス不可能なオブジェクト２２６だけがリクレームされている。スタックエントリ２１３は更新され、オブジェクト２２７の新しいロケーションをリフレクトし、ポインタ２４４は更新され、オブジェクト２２８の新しいロケーションをリフレクトした。ポインタ２４０は更新され、新しいオブジェクトのスタートにポイントされた。
【００１５】
【発明の概要】
本発明の目的は、コンピュータメモリ用のガーベージコレクションプロセスを改良することである。
本発明の他の目的は、コンサーバティブガーベージコレクション技術とジェネレイショナルガーベージコレクション技術との利点を組み合わせたガーベージコレクションプロセスを提供することである。
【００１６】
本発明のさらに他の目的は、コンピュータメモリ中のアクセス不可能なオブジェクトを特定するための方法を提供することである。
これらの目的及び他の目的（これらは本発明を以下に詳述するにつれて明らかになる）は、コンピュータメモリ中のアクセス不可能なオブジェクトを特定するための方法及びシステムによって達成される。好適な実施例においては、メモリはスタック及びヒープを有しており、ヒープは古いオブジェクト及び新しいオブジェクトを有しており、オブジェクトはポインタにより特定され、スタックはポインタになり得るスタックエントリを有している。好適な実施例においては、古いオブジェクトが新しいオブジェクトにポイントされるように設定されているポインタを有している場合には、その古いオブジェクトは想起リストに加えられる。ガーベージコレクションの間においては、各スタックエントリはメイビーポインタであると想定される。スタックエントリによりポイントされた新しい各オブジェクトはアクセス可能とマーク付けされ、想起リスト中の古いオブジェクトによりポイントされる新しい各オブジェクトはアクセス可能とマーク付けされ、既にマーク付けされたオブジェクトを介してアクセス可能な新しい各オブジェクトはアクセス可能とマーク付けされる。このプロセスが完了した時点で、アクセス可能とマーク付けされなかった全ての新しいオブジェクトはアクセス不可能である。
【００１７】
【実施例】
本発明は、従来の又一般的なガーベージ・コレクションの技術を組み合わせた改良されたガーベージ・コレクションの技術を提供する。好適な実施例においては、ガーベージ・コレクタは、従来からオブジェクトに対して各スタック・エントリ・ポイントを推定し、さらに的確な方法を用いてグローバル変数がポインタであるか否かさらにヒープ内のオブジェクトの中のフィールドがポインタであるか否かを判定している。さらに、ガーベージ・コレクタが新オブジェクトのみを回収するものであることが好ましい。
【００１８】
プログラムが作動中に、新オブジェクトに対してポインタを含む古いオブジェクトのリストが保持される。ポインタを含むオブジェクトが古くてポイントされたオブジェクトが新規な場合には、古いオブジェクトリは想起リストに追加される。好適な実施例においては、コンパイラがコードを生成し、このコードがこのチェック及び各ポインタ・アサイメント・ステートメントの想起リストへの追加を実行する。このコンパイラは、オブジェクトの各クラスのための仮想記憶機能を生成する。これらの仮想記憶機能の一つにより、オブジェクト内に含まれるポインタのリストを返却し、他のものにより、オブジェクトのサイズを返却する。コンパイラは、コードを生成し、このコードにより、オブジェクト内のメイビー・ポインタが今回ポインタを含んでいるか否かを正確に探知する。
【００１９】
好適な実施例においては、メモリ・マネージャーが、新スペースと古いスペースとにヒープを論理的に分割する。メモリ・マネージャーは、新スペースから新オブジェクトを割り当てる。好適な実施例においては、ガーベージ・コレクタは、インテル８０３８６などの別個のアーキテクチャーを有するプロセッサで実行される。
【００２０】
アクセス可能な新なオブジェクトは、スタックエントリ若しくは想起リストの古いオブジェクトを介して接近可能である。このようにして、スタックエントリ及び想起リストのオブジェクトを処理することにより、ガーベージ・コレクタは、新オブジェクトがアクセス可能であるか若しくはアクセス可能でありそうなのかを判定することができる。好適な実施例においては、ガーベージ・コレクタは、各スタック・エントリを従来から取り扱っており、即ち、各スタック・エントリは、メイビー・ポインタであると推定される。ガーベージ・コレクタは、ロックされ且つアクセス可能であるとしてスタック・エントリによりポイントされる可能性のある、さらに、ロックされたオブジェクトから接近できる新規な各オブジェクトをアクセス可能であるとしてポイントされる可能性のある、新オブジェクトの各々をマークする。その後、ガーベージ・コレクタは、その古いオブジェクトを介してアクセス可能である各新オブジェクトを訪問することにより且つそれをアクセス可能なものとしてマークすることにより、想起リスト内の各オブジェクトを処理する。マークが完了後、ガーベージ．コレクタは、新セグメント内にそのメモリをコンパクト化する。
【００２１】
図５は、より好ましい実施例におけるガーベージコレクタ手続きの概略流れ図である。ステップ３０１で、ガーベージコレクタは、ルーチン、“プロセススタックポインタ”をインボウクし、スタックエントリを通じてアクセスすることができるような全ての新オブジェクトに対してコンサーバティブに（ｃｏｎｓｅｒｖａｔｉｖｅｌｙ）マーク付けを行なう。ステップ３０２で、ガーベージコレクタは、ルーチン、“プロセス想起リスト”をインボウクし、想起リスト内の古いオブジェクトを通じてアクセスすることができるような全ての新オブジェクトにマーク付けを行なう。ステップ３０３で、ガーベージコレクタは、ヒープの新セグメントを圧縮する。
【００２２】
図６は、より好ましい実施例におけるルーチン、“プロセススタックポインタ”の流れ図である。ステップ４０１〜４０４で、ガーベージコレクタは各スタックエントリを処理し、それが新オブジェクトに対するポインタであるのか、或いは、それは明らかに新オブジェクトに対するポインタではないのかを、判断する。もしそれが新オブジェクトに対するポインタであれば、ガーベージコレクタは、その後の処理のために、そのスタックエントリをメイビー・ポインタ（ｍａｙ−ｂｅ−ｐｏｉｎｔｅｒｓ）のリストに付加する。ステップ４０１で、ガーベージコレクタは、その最初のもので始まる次のスタックエントリを選択する。ステップ４０２で、全てのスタックエントリがすでに選択されていれば、ガーベージコレクタはステップ４０５に続き、さもなければ、ガーベージコレクタはステップ４０３に続く。ステップ４０３で、選択されたスタックエントリが新オブジェクトに対するポインタであれば、ガーベージコレクタは、ステップ４０４で、選択されたスタックエントリを“メイビーポインタリスト”に付加し、次のスタックエントリを選択するためにステップ４０１にループし、さもなければ、ガーベージコレクタはステップ４０１にループする。より好ましい実施例において、新オブジェクトは単一セグメントの割当てスペースである。故に、新オブジェクトに対するポインタは、新セグメントのそれと等価なセグメントセクレタを有する。スタックエントリは、そのセレクタ部分が新セグメントを指示しており、オフセット部分が新セグメントの限界範囲内である場合には、新オブジェクトに対するポインタであってもよい。ステップ４０５で、ガーベージコレクタは、ルーチン、“プロセスメイビーポインタリスト”をインボウクし、メイビーポインタリストのスタックエントリによって指示され得るオブジェクトに保守的にマーク付けを行なう。ガーベージコレクタはその後戻る。
【００２３】
図７は、より好ましい実施例におけるルーチン、“プロセスメイビーポインタリスト”の流れ図である。このルーチンは、ロック済、及びアクセス可能として指示され得るような全ての新オブジェクトにマーク付けを行なうことによって、“メイビーポインタリスト”のエントリを処理する。このルーチンも、これらのオブジェクトを通じてアクセス可能であるような新オブジェクトに対して、アクセス可能のマーク付けを行なう。ステップ５０１で、ガーベージコレクタは“メイビーポインタリスト”の分類を行なう。ステップ５０２で、ガーベージコレクタは、最初の新オブジェクトで始まるヒープ内の次の新オブジェクトを選択する。ステップ５０３で、全ての新オブジェクトが既に選択されている場合は、ガーベージコレクタは戻り、さもなければ、ガーベージコレクタはステップ５０４に続く。ステップ５０４で、“メイビーポインタリスト”が、選択されたオブジェクトを指示するスタックエントリ、若しくは、選択されたオブジェクトに埋込みされたオブジェクトを含み、それがポインタである場合には、ガーベージコレクタはステップ５０５に続き、さもなければ、ガーベージコレクタはステップ５０２をループして次の新オブジェクトを選択する。ステップ５０５で、ガーベージコレクタは、選択されたオブジェクトに対してロック済のマーク付けを行なう。選択されたオブジェクトは、アクセス可能として既にマーク付けがなされているものでもよい。なぜなら、この選択されたオブジェクトは、既にアクセス可能のマーク付けがなされた新オブジェクトを通じてアクセスすることができるからである。それにもかかわらず、それはロック済としてマーク付けがなされているために、ヒープコンパクション  （ｈｅａｐ  ｃｏｍｐａｃｔｉｏｎ）の間に移動されることはないであろう。ステップ５０６で、選択されたオブジェクトに既にアクセス可能のマーク付けがなされている場合には、埋込みされたポインタは既に処理されており、どの新オブジェクトがそれらを通じてアクセスできるのかを判断し、ガーベージコレクタはステップ５０２にループして次の新オブジェクトを選択し、さもなければ、ガーベージコレクタはステップ５０７に続く。
【００２４】
ステップ５０７では、ガーベージコレクタが選択されたオブジェクトをアクセス可能であると標示する。ステップ５０８では、ガーベージコレクタがルーチンチェック埋込みポインターを呼出してそこに選択したオブジェクトを通過させ、その後ステップ５０２へループして次の新しいオブジェクトを選択する。このルーチンは、以下に詳述するように、通過したオブジェクト（古いオブジェクトを通して通過したオブジェクトからアクセスさせ得るだけの新しいオブジェクトを除く）からアクセス可能であるすべての新しいオブジェクト（すでにアクセス可能であると標示したものではない）を、アクセス可能であると標示する。
【００２５】
図９は、好ましい実施例のルーチンプロセス想起リストのフローダイヤグラムである。このルーチンは想起リストの各古いオブジェクトを処理してそれを通してアクセス可能な各新しいオブジェクトをアクセス可能だあると標示する。ステップ６０１では、ガーベージコレクタは最初から始まる想起リストの新しいオブジェクトを選択する。ステップ６０２において、想起リストのオブジェクトがすべて既に選択されている場合には、ガーベージコレクタが戻り、その代わりそのガーベージコレクタは６０３に留まる。ステップ６０３において、ガーベージコレクタはルーチンチェック埋込みポインターを呼び出してそこに選択したオブジェクトを通過させ、その後ステップ６０１へループして次の新しいオブジェクトを選択する。
図１０は、好ましい実施例のルーチンチェック埋込みポインターのフローダイヤグラムである。このルーチンは、オブジェクトを通過させ、通過したオブジェクト（古いオブジェクトを通して通過したオブジェクトからアクセスされ得るだけの新しいオブジェクトを除く）に埋め込まれたポインタを通してアクセス可能である各新しいオブジェクト（すでにアクセス可能であると標示されたオブジェクトではない）をアクセス可能であると設定する。このルーチンは、再帰的に呼び出されて通過したオブジェクトに含まれるポインタにより指示された各新しいオブジェクトを処理する。当業者はこのルーチンを非再帰的に構成できることを認識するであろう。このルーチンが古いオブジェクトを指示するポインタに遭遇した場合、そのルーチンは古いオブジェクトのポインタを処理しない。というのは、古いオブジェクトが新しいオブジェクトへのポインタを含む場合には、古いオブジェクトは想起リストの上にあり、ガーベージコレクタはそれをそのように処理する。ステップ７０１では、ガーベージコレクタが最初から始まる通過したオブジェクトの新しいポインタを選択する。好ましい実施例では、バーチャルファンクションが各オブジェクトのクラスについて定められる。このオブジェクトは、呼び出された場合、オブジェクトに含まれるポインタを与える。ステップ７０２では、通過したオブジェクトに対する埋め込まれたポインタがすべて処理されてしまった場合には、ガーベージコレクタを戻し、その代わりそのガーベージコレクタはステップ７０３に留まる。ステップ７０３において、選択されたポインタにより指示されたオブジェクトが新しいもので既にアクセス可能であると標示されたものでない場合には、ガーベージコレクタがステップ７０４に留まり、その代わりそのガーベージコレクタはステップ７０１にループして新しい埋め込みポインタを選択する。選択されたポインタが０ならば、そのポインタは新しいオブジェクトを指示しない。そのオブジェクトが既にアクセス可能であると標示されたものである場合には、そこからアクセス可能なすべての新しいオブジェクト（古いオブジェクトを通して通過したオブジェクトからアクセスされ得るだけの新しいオブジェクトを除く）がアクセス可能であると標示される。ステップ７０４では、ガーベージコレクタが選択されたポインタにより指示されたオブジェクトを選択する。ステップ７０５では、ガーベージコレクタが選択されたオブジェクトをアクセス可能であると標示する。ステップ７０６では、ガーベージコレクタがルーチンチェック埋込みポインターを再帰的に呼び出して選択したオブジェクトを通過させ、その後ステップ７０１へループして次の新しい埋め込みポインタを選択する。
【００２６】
本発明の好ましいコンパクションアルゴリズムによって、マークされ、かつ、ヒープの一方の端にロックされないオブジェクトの各々が移動される。この移動されたオブジェクトは、お互いに相対的な位置を保持する。この相対的に位置の保持によって、基準位置が向上するようになる。オブジェクトは、一般的に略同時に作られた基準オブジェクトに向かう。このように、相対的に位置の保持によって、ロックされたオブジェクトを除いて、オブジェクトが、同じ時間的な近接において作られたオブジェクトの近くに空間的に存在するということが確実になる。移動しないオブジェクトはロックされるので、同じ時間的な近接において作られたオブジェクトから空間的に分離される場合がある。改善された基準位置は、仮想メモリを有するコンピュータ・システムにおいてページ・フォールト（ｐａｇｅ  ｆａｕｌｔ）を減少させるときに特に重要である。
【００２７】
オブジェクトが移動されたとき、そのオブジェクトは、ロックされたオブジェクトの近くに記憶される。ロックされたオブジェクトと移動したオブジェクトとの間の空間が次の移動されるオブジェクトを保持するのに十分大きくない場合、ダミーオブジェクトが作られ、その空間に移動される。ダミーオブジェクトは、その空間を満たすのに十分大きく、関連する仮想機能テーブルを有する。ポインタはダミー・オブジェクトを参照しないので、そのダミーオブジェクトは、次のガーベージ・コレクションの間にリクームされる。
【００２８】
オブジェクトの移動が完全なとき、リストは自由空間の隣接する区分領域から成る。この自由空間は、マークされ、かつ、ロックされたオブジェクトを除き、接触している。新たなオブジェクトの割り当ては、この自由空間から生じる。
図１１は、全てのアクセス可能なオブジェクトがマークされたのちのサンプルとなる新たな空間を示す。マークされ、かつ、ロックされないオブジェクトは、Ｍ０  、Ｍ１  、Ｍ２  、Ｍ３  、Ｍ４  、及びＭ５  である。マークされ、かつ、ロックされたオブジェクトは、ＭＬ０  、ＭＬ１  、ＭＬ２  、及びＭＬ３  である。マークされないオブジェクトは、Ｕ０  、Ｕ１  、Ｕ２  、Ｕ３  、Ｕ４  、Ｕ５  、Ｕ６  、及びＵ７  である。各オブジェクトの右下コーナーの数字はオブジェクトの大きさを示す。図１２はコンパクション後のヒープのサンプルとなる新たな空間を示す。Ｄ０  のマークのオブジェクトは、ダミーオブジェクトである。自由空間はＦ０  、Ｆ１  、及びＦ２  で示され、これらは一緒にリンクされている。ポインタＴＯＳは、コンパクションが完全になった後、空間の先端を示す。コンパクション・プロセスの間、大きさ５を有するオブジェクトＭ２  は大きさ２を有する空間に適合しないと決定された。その結果、大きさ２を有するダミー・オブジェクトＤ０  が作られ、大きさ２を有する空間に挿入された。大きさ２を有するオブジェクトＭ４  はその空間に適合するけれども、移動されなかった。その理由は、そうすることは、マークされ、かつ、ロックされないオブジェクトの相対的な順序を変えるからである。
【００２９】
図１３は、本発明の好ましい実施例におけるコンパクションルーチンのフローチャートである。このルーチンは、新スペースにおいて第１のオブジェクトを指すように、トップオブスペース（ＴＯＳ）ポインタを初期化する。このＴＯＳポインタは、オブジェクトが移動されうる次のロケーションを指す。ステップ９０１において、コンパクタは、第１オブジェクトから開始する新スペースの次のオブジェクトを選択する。ステップ９０２においては、全てのオブジェクトが既に選択されていた場合、コンパクタはステップ９１１に続き、そうでない場合には、コンパクタはステップ９０３に続く。ステップ９０３において、選択されたオブジェクトがマークされていて且つロックされていない場合、選択されたオブジェクトは移動させられるようになり、コンパクタはステップ９０４に続き、そうでない場合には、コンパクタはステップ９０１にループして次のオブジェクトを選択する。ステップ９０４において、ＴＯＳとロックされた次のオブジェクトとの間に十分なスペースがある場合、オブジェクトはＴＯＳに移動されることができ、コンパクタはステップ９０８に続く。そうでない場合には、コンパクタはステップ９０５に続く。ロックされた次のオブジェクトは、ＴＯＳと新スペースのエンドとの間にある最も近いロックオブジェクトを参照する。かかるロックオブジェクトがない場合、そのスペースは、ＴＯＳから新スペースのエンドまでにわたって考慮される。ステップ９０５〜９０７において、コンパクタは、ＴＯＳと次のロックオブジェクトとの間のスペースをダミーオブジェクトで満たす。ＴＯＳが次のオブジェクトを指す場合、ダミーオブジェクトは不要になってステップ９０５〜９０７はスキップする。ダミーオブジェクトは、オブジェクトのサイズを戻す仮想ファンクションと、オブジェクトにポインタがないという指示を戻す仮想ファンクションとを有する。作成された後の次のガーベージコレクション中において、ダミーオブジェクトは、アクセス可能なものとしてマークされず（それを指すオブジェクトがない）、これにより、リクレームされる。ステップ９０５において、コンパクタは、ＴＯＳと次のロックオブジェクトとの間のスペースを満たすのに十分な大きさのダミーオブジェクトを作成する。ステップ９０６において、コンパクタは、ダミーオブジェクトをＴＯＳにストアする。ステップ９０７において、コンパクタは、ＴＯＳを次のロックオブジェクトを通るように進め、ステップ９０４にループさせて、進められたＴＯＳと新しい次のロックオブジェクトの間に十分なスペースがあるかどうかをチェックする。ステップ９０８において、コンパクタは選択されたオブジェクトをＴＯＳに移動する。ステップ９０９において、コンパクタはポインタを移動したオブジェクトに更新する。オブジェクトのマーク処理中において、ガーベージコレクターは、各マークしたオブジェクトを指す全ポインタのリストを作成した。ステップ９１０において、コンパクタは、ＴＯＳを移動したオブジェクトを通るように進め、ステップ９０１にループさせて次のオブジェクトを処理する。ステップ９１１において、コンパクタは、ＴＯＳ上のフリースペースにリンクして、リターンする。
【００３０】
コンパクションルーチンの完了時に、ＴＯＳが新スペースの開始と旧スペースの終了を決める。想起リストは、新スペース内のオブジェクトをもはや指し示めさない古いオブジェクトを除去することにより好適に更新される。この更新は、オブジェクトが移動する時にコンパクションルーチンによって達成できることは当業者が理解できるであろう。図１２に示される様に、新スペースはロックされたオブジェクト、例えばＭＬ２  及びＭＬ３  を含むことができるので、コンパクション後の想起リストは、新スペース内のこれらのロックされたオブジェクトを指し示す古いオブジェクトを含むことができる。別法においては、オブジェクトを含まないものとして新スペースが定義されるまで、想起リストは更新されない。この様な定義が生じると、新スペース内に指し示すためのオブジェクトが存在しないので、古いオブジェクトの全てを、想起リストから除去することができる。例えば、図１２の新たなスペースは、新スペースがオブジェクトＦ２で開始するか、セグメントアーキテクチャーを有するコンピュータで実施される時は、別のセグメントで開始する様に定義することによりオブジェクトを含まない様に定義できる。この様な定義を用ると、旧スペースはフリースペースを含むことができる。新スペースがＴＯＳ以外のロケーションで開始する様に定義される場合、次のコンパクション中に、このコンパクションルーチンは、新スペースを指し示すようにＴＯＳをリセットするのではなく、オブジェクトをＴＯＳによって指し示されたロケーションに移動するのが好ましい。従って、旧スペース内のフリーエリアがコンパクション中に充填される。
【００３１】
本発明は好適な実施例に基づいて説明されたが、本発明をこれらの実施例に限定する様には意図されていない。本発明の概念内にある改良が当業者に明らかであろう。本発明の範囲は特許請求の範囲によって規定されている。
【図面の簡単な説明】
【図１】従来の方法を用いたガーベージコレクション前のサンプルスタックとヒープを示す図である。
【図２】従来の方法を用いたガーベージコレクション後のサンプルスタックとヒープを示す図である。
【図３】一般的な方法を用いたガーベージコレクション前のサンプルスタックとヒープを示す図である。
【図４】一般的な方法を用いたガーベージコレクション後のサンプルスタックとヒープを示す図である。
【図５】本発明の実施例によるガーベージコレクションの手続きの全体フローチャートを示す。
【図６】本発明の実施例によるプロセス・スタック・ポインタのルーチンを示すフローチャートである。
【図７】本発明の実施例によるプロセス・メイビー・ポインタ・リストのルーチンの前半部を示すフローチャートである。
【図８】本発明の実施例によるプロセスメイビーポインタリストのルーチンの後半部を示すフローチャートである。
【図９】本発明の実施例によるプロセス想起リストのルーチンを示すフローチャートである。
【図１０】本発明の実施例によるチェック埋込みポインタのルーチンを示すフローチャートである。
【図１１】接近できるオブジェクトがマークされた後のヒープのサンプル新規スペースを示す図である。
【図１２】コンパクション後のサンプル新規スペースを示す図である。
【図１３】本発明の実施例によるコンパクションのルーチンを示すフローチャートである。
【符号の説明】
１１０  スタック
１１１−１１５  スタック入力
１１６、１１８  ポインター
１２０  ヒープ
１２１−１２８  オブジェクト
【図１】
0003628032.tif 000003
【図２】
0003628032.tif 000004
【図３】
0003628032.tif 000005
【図４】
0003628032.tif 000006
【図５】
0003628032.tif 000007
【図６】
0003628032.tif 000008
【図７】
0003628032.tif 000009
【図８】
0003628032.tif 000010
【図９】
0003628032.tif 000011
【図１０】
0003628032.tif 000012
【図１１】
0003628032.tif 000013
【図１２】
0003628032.tif 000014
【図１３】
0003628032.tif 000015