(57)【要約】  本明細書で説明される１つまたは複数の実施形態によれば、ポーズレスなガベージ・コレクションのための方法は、ガベージ・コレクタによって、ガベージ・コレクションのために、処理を実行しているプロセス・スレッドを選択することを含む。方法は、ガベージ・コレクタ・スレッドによって、または、現在実行中のプロセス・スレッドによって、第１のメソッドに関連付けられた第１の活性化フレームをスキャンさせることをさらに含む。方法は、プロセス・スレッドが現在実行中のプロセスからの、第２のメソッドに関連付けられた第２のポーズレス活性化フレームを続けてスキャンするようにプロセス・スレッドに命令することをさらに含む。方法は、ガベージ・コレクタ・スレッドを使用して、プロセスからの第３のメソッドに関連付けられた第３のポーズレス活性化フレームをスキャンすることをさらに含み、ポーズレス活性化フレームをスキャンすることが、スキャンされているポーズレス活性化フレームに対応するメソッドからの１つまたは複数のライブ・ポインタを検査し、上書きすることを含む。
2021530756.tif 000002
【特許請求の範囲】
【請求項１】
ポーズレスなガベージ・コレクションのための方法であって、
ガベージ・コレクタによって、ガベージ・コレクションのために、プロセスを実行しているプロセス・スレッドを選択するステップと、
ガベージ・コレクタ・スレッドまたは現在実行中の前記プロセス・スレッドによって、第１のメソッドに関連付けられた第１の活性化フレームをスキャンさせるステップと、
前記プロセス・スレッドが現在実行中のプロセスからの第２のメソッドに関連付けられた第２のポーズレス活性化フレームを続けてスキャンするように前記プロセス・スレッドに命令するステップと、
前記ガベージ・コレクタによって、ガベージ・コレクタ・スレッドを使用して、前記プロセスからの第３のメソッドに関連付けられた第３のポーズレス活性化フレームをスキャンするステップと
を含み、
ポーズレス活性化フレームをスキャンするステップが、スキャンされている前記ポーズレス活性化フレームに対応するメソッドからの１つまたは複数のライブ・ポインタを検査し、上書きするステップを含む、方法。
【請求項２】
前記第２のメソッドは、前記第１のメソッドを起動する、請求項１に記載の方法。
【請求項３】
前記第２のポーズレス活性化フレームは、複数のポーズレス活性化フレームである、請求項１に記載の方法。
【請求項４】
前記第３のポーズレス活性化フレームは、複数のポーズレス活性化フレームである、請求項１に記載の方法。
【請求項５】
前記プロセス・スレッドは、前記ガベージ・コレクタ・スレッドが前記第３のポーズレス活性化フレームをスキャンするのと実質的に同時に前記第２のポーズレス活性化フレームをスキャンする、請求項１に記載の方法。
【請求項６】
メソッドのための前記ポーズレス活性化フレームは、前記メソッドによって起動された第４のメソッドに関連付けられた記号情報を表すオブジェクトへのオブジェクト・ポインタを含む、請求項１に記載の方法。
【請求項７】
メソッドのための前記ポーズレス活性化フレームは、メソッドを起動した前記メソッドへの復帰アドレスを示すポインタを含む、請求項１に記載の方法。
【請求項８】
メソッドのための前記ポーズレス活性化フレームは、前記メソッドにおける各ライブ・ポインタの値を保存するポインタ変数プリエンプション保存領域を含む、請求項１に記載の方法。
【請求項９】
請求項１ないし８のいずれかに記載の方法のステップの全てを実行するように適合された手段を含む、システム。
【請求項１０】
コンピュータ・プログラムであって、前記コンピュータ・プログラムがコンピュータ・システム上で実行されると、請求項１ないし８のいずれかに記載の方法のステップの全てを実行するための命令を含む、コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、一般に、コンピュータ・メモリ管理の分野に関し、詳細には、高性能でタイム・クリティカルなアプリケーションのためのガベージ・コレクション・プロセスに関する。
【背景技術】
【０００２】
コンピュータに関し、ガベージ・コレクションは、メイン・メモリ・ストレージの未使用エリアを識別するプロセスを指す。オブジェクト指向コンピューティング言語によれば、プログラムを実行するコンピュータは、オブジェクトのそれぞれにメモリをアロケートする。メモリは、アプリケーション要件に応じたサイズのブロック内のヒープにアロケートされ、またヒープから解放される。最終的にオブジェクトがプログラムによって参照されなくなった場合、作成されたオブジェクトにアロケートされたメモリは、ガベージ・コレクション・プロセスを通じて回収される。ガベージ・コレクション・プロセスは、メモリからオブジェクトをクリアし、これにより、一度アロケートされたメモリが、使用のために再び利用可能になる。より具体的には、ガベージ・コレクション・プロセスは、使用中のオブジェクトをマークすることによってメモリのどのブロックを解放できるかを自動的に決定すること、および、マークのないオブジェクトのメモリを回収することを含むことができる。このようなガベージ・コレクション・プロセスは、マーク・フェーズ中にメモリの有用な部分がライブ（live；有効）とマークされ、次に、スイープ・フェーズにおいて、マークのない全てのオブジェクトが、アロケートされたメモリから削除されることから、マーク・アンド・スイープと呼ばれることが多い。ガベージ・コレクションのプロセスは、メモリを解放するが、その予測不可能なプロセッサ時間の消費がアプリケーションの実行に影響を及ぼすようなアプリケーションにおいて問題となることがある。
【発明の概要】
【０００３】
本発明は、請求項１に記載の方法、ならびに、対応するシステムおよびコンピュータ・プログラムを提供する。
【０００４】
本文書の全体を通して説明される例は、以下の図面および説明を参照すると、より良く理解されるであろう。図中の構成要素は、必ずしも縮尺通りではない。さらに、図において、同様の参照番号は、異なる図の全体にわたって対応する部分を示す。
【図面の簡単な説明】
【０００５】
【図１】実例のマルチタスク・コンピュータ・システムを示す図である。
【図２】プログラム・スタック、および、プログラム・スタックに記憶された典型的な活性化フレームのブロック図である。
【図３】１つまたは複数の例によるポーズレスなガベージ・コレクションのためのポーズレス活性化フレームを示す図である。
【図４】ポーズレスなガベージ・コレクションのためのスレッド・スタックのバックグラウンド・スキャンを行うための実例の方法のフローチャートである。
【図５】アプリケーション・スレッドおよびガベージ・コレクション・スレッドによるスレッド・スタックのスキャンを協調させるための実例の方法のフローチャートである。
【図６】バンガード・メソッドから戻ったときに呼出元の活性化フレームをスキャンし、新規なバンガード・メソッドを識別するための実例の方法のフローチャートである。
【図７】プロセス・スレッドによってガベージ・コレクションのために行われるプログラム・スタック・スキャンの実例のシナリオの視覚的表現を示す図である。
【発明を実施するための形態】
【０００６】
本発明の様々な実施形態が、関連する図面を参照しながら本明細書で説明される。本発明の代替実施形態は、本発明の範囲から逸脱することなく考案されることが可能である。様々な接続および位置関係（例えば、上（over）、下（below）、隣（adjacent）、等）が、以下の説明および図面における要素間に示される。これらの接続または位置関係あるいはその両方は、別途指定されない限り、直接または間接であることが可能であり、本発明は、この点において限定することを意図するものではない。したがって、エンティティの連結は、直接または間接の連結を指すことができ、エンティティ間の位置関係は、直接または間接の位置関係であることが可能である。さらに、本明細書で説明される様々なタスクおよび処理ステップは、本明細書で詳細に説明されない追加のステップまたは機能を有したより包括的な手順または処理に組み込まれることが可能である。
【０００７】
以下の定義および省略形は、特許請求の範囲および本明細書の解釈のために使用されるためのものである。本明細書で使用されるように、用語「備える（comprises）」、「備えている（comprising）」、「含む（includes）」、「含んでいる（including）」、「有する（has）」、「有している（having）」、「包含する（contains）」、もしくは「包含している（containing）」、またはこれらの他の任意の変形形態は、非排他的な内包物を網羅することを意図する。例えば、要素のリストを含む構造、混合体、処理、方法、物品、または装置は、それらの要素のみに必ずしも限定されるわけではなく、明確にリスト化されていない、またはこのような構造、混合、処理、方法、物品、もしくは装置に固有の、他の要素を含むことができる。
【０００８】
追加として、用語「例示的（exemplary）」は、「例、事例、または例証として提供すること（serving as an example, instance or illustration）」を意味するものとして本明細書で使用される。「例示的」として本明細書で説明されるいずれかの実施形態または設計は、他の実施形態または設計に対して好ましいまたは有利であると必ずしも解釈されない。用語「少なくとも１つ（at least one）」および「１つまたは複数（one or more）」は、１つ以上、すなわち１つ、２つ、３つ、４つ、等の任意の整数を含むものとみなされてもよい。用語「複数（a plurality）」は、２つ以上、すなわち２つ、３つ、４つ、５つ、等の任意の整数を含むものとみなされてもよい。用語「接続（connection）」は、間接「接続」および直接「接続」の両方を含むことができる。
【０００９】
用語「約（about）」、「実質的に（substantially）」、「およそ（approximately）」、およびこれらの変形形態は、本出願時に利用可能な機器に基づく特定の量の測定値に関連付けられた誤差の度合いを含むことを意図するものである。例えば、「約」は、所与の値の±８％または５％または２％の範囲を含むことができる。
【００１０】
簡潔さのために、本発明の態様を行うことおよび使用することに関連した従来の技法は、本明細書で詳細に説明されることもあれば、説明されないこともある。具体的には、本明細書で説明される様々な技術的特徴を実現するためのコンピューティング・システムおよび特定のコンピュータ・プログラムの様々な態様がよく知られている。したがって、簡潔さのために、多くの従来の実装形態の詳細は、本明細書で簡単に言及されるだけであり、または、よく知られたシステムまたは処理あるいはその両方の詳細を示すことなく全面的に省略される。
【００１１】
図１を参照すると、ＣＰＵ１０２、ユーザ・インターフェース１０６、ならびに、ストレージのためのランダム・アクセス・メモリ（ＲＡＭ）および不揮発性メモリを含むメモリ１０８を有する典型的なマルチタスク・コンピュータ・システム１００が示される。メモリ１０８は、管理されたランタイム環境１１０および１つまたは複数のプロセス１１２を記憶し、これらのそれぞれは、１つまたは複数のスレッドを含むことができる。システムにおける各アクティブ・プロセスは、コンピュータのメモリの一部を割り当てられ、これらは、プロセスによって実行されるアプリケーション・レベル・コード１１２を記憶するための空間、動的メモリ・アロケーションのために使用されるヒープ１１６、プロセスを実行している各スレッドの状態を表すための空間、および、各スレッドのプログラム・スタック１１４を記憶するための空間を含む。管理されたランタイム環境１１０は、実行中の複数のタスクのうちのどれにＣＰＵ時間を割くべきかを決めることを担うスケジューリング・スーパーバイザ１４８をさらに含む。典型的には、スケジューリング・スーパーバイザ１４８は、アプリケーション・プロセス・スレッドを実行することと、ガベージ・コレクション・スレッドを実行することとの間のトレードオフを比較検討しなければならない。さらに、管理されたランタイム環境１１０の中で、別々に開発された複数のアプリケーションが同時に動作することができる。
【００１２】
各スレッドのプログラム・スタック１１４は、メモリ１０８の連続ページ内になくてもよく、連続していない場合、スタック・ストレージのページ、または場合によっては、それより大きい連続したチャンクは、既知の技法を使用して互いにリンクされる。プロセス１１２の中に複数のスレッドがあり、各スレッドは、それ独自のプログラム・スタック１１４を有するということに留意されたい。
【００１３】
ＣＰＵ１０２は、命令デコーダおよび実行ロジック１２２に命令を提供するための命令キャッシュ１２０を含む。ＣＰＵ１０２は、プログラム・スタック１１４の一部を高速キャッシュ・メモリに記憶するためのスタック・キャッシュ１２４、および、データ値やオブジェクト参照１２８などを記憶するためのレジスタのセット１２６も含む。プログラム・スタック１１４は、スタック・キャッシュ１２４内の一部を含み、様々なデータ構造およびパラメータを一時的に記憶するために使用され、これらは、メソッドまたは他のプロシージャが起動されるたびにプログラム・スタック１１４上にプッシュされる活性化フレーム１３０（またはレコード）を含む。
【００１４】
一定のガベージ・コレクション・フェーズの開始時に、ガベージ・コレクタは、ポインタのルート・セット１３２をスキャンする。図１は、ルート・セット１３２を単一ブロックとして描写するが、ルート・セット１３２は、マシン・レジスタおよび一定のグローバル・メモリ・ロケーションを含み、ルート・セットは、ルート・セットのスキャンを担うコンピュータ実行可能命令の一部としてガベージ・コレクタにおいてエンコードされることが可能であるということに留意されたい。ルート・セットは、有限数のマシン・レジスタおよびメモリ・ロケーションを表し、これらの集積は、プロセス１１２によって現在使用中の全てのオブジェクトへの間接アクセスを提供する。ポーズレスなガベージ・コレクション・システム（pause-less garbage collection system）において、ルート・セット１３２内の変数の数は非常に少なく、典型的には１００未満である。ルート・セットは、個々のスレッド・スタックの内容も、全てのスレッド記述（thread description）の内容も含まない。むしろ、ルート・セットは、典型的には、全てのスレッド記述を追跡するデータ構造への参照を含む。各スレッド記述は、結果として、関連付けられたスレッド・スタックを追跡する。
【００１５】
図１は、ＣＰＵ１０２およびメモリに記憶された項目の簡素化された表現を描写するだけであるということが理解されよう。また、図１のメモリ１０８に示されるものと同じタイプの項目を含む独自のアドレス空間をそれぞれが有する複数のプロセスが、コンピュータ・システムで同時に実行していてもよいということが理解されよう。
【００１６】
用語「オブジェクト」は、プログラムまたはプロセスによって作成された任意のデータ構造を意味するものと本明細書で定義される。用語「参照」および「オブジェクト参照」は、オブジェクトへのポインタを含むデータ構造を説明するために相互交換可能に使用される。用語「ポインタ」または「オブジェクト・ポインタ」は、時に、「参照」および「オブジェクト参照」と相互交換可能に使用されるが、オブジェクト参照は、ポインタの他に情報を含み得る。オブジェクト参照は、直接的または間接的であってもよい。直接オブジェクト参照は、オブジェクト・ヘッダを直接的に指すが、間接オブジェクト参照は、オブジェクト・ハンドルを指す。本明細書で使用されるように、用語「オブジェクト参照」は、両方のタイプを指す。
【００１７】
ヒープ１１６に関連付けられたプロセス１１２が、配列または他のプログラム・「オブジェクト」を記憶するための空間を必要とするとき、メモリ・アロケータ・ルーチン１４０が、呼び出される／起動される。メモリ・アロケータ１４０は、ヒープ１１６内の未使用メモリのブロックをプロセス１１２にアロケートすることによって応答する。さらにメモリを要求すると、追加のメモリ・ブロックがアロケートされる。プロセス１１２がより多くのメモリを求め続けると、最終的にはヒープ１１６内の空間全てが使用されることになり、プロセス１１２は、メモリの不足のために停止する可能性がある。したがって、空間は、プログラムの明示的なアクションまたはその他のメカニズムのいずれかによって補充されなければならない。
【００１８】
典型的には、プロセス１１２は、そのオブジェクトにアロケートされたメモリ空間の大部分を「放棄する」。典型的には、プロセス１１２は、アロケートされたメモリ・ブロックにプログラム・オブジェクトへの参照を記憶し、これらオブジェクトを処理し終えた後、再びそれらのオブジェクトにアクセスする必要がなくなるので一定のオブジェクトへの全ての参照を上書きする。参照（時にはポインタと呼ばれる）がないオブジェクトは、「アクセス不能オブジェクト」または「ガベージ」と称されることがあり、そのオブジェクトが占めるメモリ空間は、そのオブジェクトをかつて使用したプロセス１１２にとって「アクセス不能」である。
【００１９】
この技術的問題は、プロセス１１２によってもはや使用されていないヒープ１１６内のメモリ空間のブロックを復旧させることによって対処される。ガベージ・コレクションは、ヒープ１１６内の未使用メモリを復旧させる自動的な方法を指すために使用される用語である。ガベージ・コレクタ１４２は、ヒープを使用するプロセス１１２がメモリを使い果たすことがないように、ヒープ１１６内のメモリの未使用部分または放棄部分を復旧させるために使用される。プログラミング言語の管理されたランタイム環境は、ガベージ・コレクタ１４２を含む。ガベージ・コレクタ１４２は、所定の期間の期限切れ、または、利用可能なヒープのある一定量の使用など、所定のイベントの発生時に未使用メモリを集めて、復旧させる。
【００２０】
ガベージ・コレクタ１４２は、ストップ・アンド・コピー・ガベージ・コレクション技法などの種々のガベージ・コレクション方法の任意のものを使用することができる。この方式では、ヒープ１１６は、２分され、これらは半空間（semi-space）とも呼ばれ、プログラムは、一時に１つの半空間だけを使用する。ストップ・アンド・コピー・ガベージ・コレクタは、未使用メモリを回収し、（典型的には、ｆｒｏｍ空間として識別される）古い半空間内の全ての「アクセス可能オブジェクト」を、（典型的には、ｔｏ空間として知られる）他方の半空間内のメモリの連続ブロックにコピーし、アクセス可能オブジェクトへの全ての参照を、これらのオブジェクトの新しいコピーを指すように変更することによって、プロセス１１２によって使用されるプログラム・アクセス可能メモリを圧縮する。アクセス可能オブジェクトは、タスクの「ルート」または「ルート・セット」によって直接的または間接的に参照された任意のオブジェクト（すなわち、メモリのブロック）である。典型的には、ガベージ・コレクションに対するプロセス１１２のルート・セット１３２は、一定のマシン・レジスタ１２６および一定のグローバル変数など、既知のロケーションに記憶されたオブジェクト参照のセットであり、これらは、プロセス１１２によって使用されるオブジェクトを指す。それらのオブジェクトの多くは、次いで、プロセス１１２によって使用される他のオブジェクトへの参照を包含するであろう。ルート・セットから生じるオブジェクト参照のチェーンまたは有向グラフは、ヒープ１１６内のアクセス可能オブジェクトの全てを間接的に指す。
【００２１】
全てのアクセス可能オブジェクトをヒープ１１６内のメモリの新しい連続ブロックにコピーし、次に、古いコピーの代わりに、オブジェクトの新しいコピーを使用することによって、ストップ・アンド・コピー・ガベージ・コレクタ１４２は、ヒープ１１６内の全ての未使用メモリ・ブロックを消去する。これは、タスクによって使用されるメモリ・ストレージも、アクセス可能オブジェクトの間に「ホール」がなくなるように「圧縮する」。圧縮は、タスクへのアロケーションのために利用可能なメモリの全てを連続ブロック内に入れることから、望ましい特性であり、これにより、アロケートされていない非常に多くの小さいメモリ・ブロックを追跡する必要がなくなる。圧縮は、仮想メモリの性能も改善する。
【００２２】
ストップ・アンド・コピー・ガベージ・コレクションが本明細書で説明されるが、本明細書で説明される技術的解決策は、インクリメンタル・ガベージ・コレクション、または、使用中のオブジェクトを識別するために各スレッド・スタックの内容をスキャンしなければならない任意のガベージ・コレクション・システムなど、他の任意の技法をガベージ・コレクタ１４２が使用したとしても適用可能であり、スレッド活性化レコード内から作成されたオブジェクト参照の場所を素早くかつ効率的に突き止めることが必要な任意のトレース・ガベージ・コレクション・システムに適用可能であるということに留意されたい。ストップ・アンド・コピー・ガベージ・コレクションは、この技法が、コピー中にアプリケーションを停止させる間、（数百ｍｓから数十秒までの範囲の）非常に長いポーズを導入するので、ポーズレスなガベージ・コレクションには適していないということに留意されたい。インクリメンタル・マーク・アンド・スイープおよびインクリメンタル・コピー技法は、ポーズレスなガベージ・コレクションに、より適している。
【００２３】
ＪＡＶＡ（登録商標）バイトコード・プログラムを実行するようにセットアップされたコンピュータ・システムの態様が図１にさらに示される。具体的には、このようなシステムの管理されたランタイム環境１１０は、指定されたＪａｖａ（登録商標）バイトコード・プログラムが、一定の所定の整合性基準を満たすか否かを検証するためのバイトコード・プログラム検証器１４４を含む。管理されたランタイム環境１１０は、クラス・ローダ１４６をさらに含み、クラス・ローダ１４６は、オブジェクト・クラスをヒープにロードし、バイトコード・プログラム検証器１４４を利用して、各ロード済みオブジェクト・クラスに関連付けられたメソッドの整合性を検証する。１つまたは複数の例では、管理されたランタイム環境１１０は、Ｊａｖａ（登録商標）バイトコード・プログラムを実行するためのバイトコード・プログラム・インタープリタ（図示せず）をさらに含む。命令デコーダおよび実行ロジック１２２が、Ｊａｖａ（登録商標）バイトコード命令を実行するように設計される場合、バイトコード・プログラム・インタープリタは必要ではない。
【００２４】
製造自動化の制御、電力管理、自律走行車両、テレコミュニケーション・インフラストラクチャ、および兵器システムを含む幅広い分野で、タイム・クリティカルなＪａｖａ（登録商標）ソフトウェアが成功裏に展開されてきた。これらの成功裏に展開されたアプリケーションは、Ｊａｖａ（登録商標）で実現されたリアル・タイム・アプリケーションが、Ｃで実現された同じアプリケーションよりも多くのＣＰＵおよびメモリのリソースを必要としてきたとしても、Ｊａｖａ（登録商標）の高度の恩恵が利用可能になり得ること、および、タイム・クリティカルな開発者によって貴重なものになることを実証する。Ｊａｖａ（登録商標）は、大量（家庭用電化製品）にデプロイされない、大きく複雑でタイム・クリティカルなアプリケーションに最も適している。これらのアプリケーションに伴う、ソフトウェアの開発および保守と関連付けられたコストおよびリスクは、典型的には、ソフトウェアが展開されるコンピューティング・ハードウェアの総コストよりもはるかに大きい。これらは、ＣまたはＣ＋＋に基づく旧式のアプローチと比較して、Ｊａｖａ（登録商標）開発者が、新しい機能の実装の際に２倍の生産性、既存の機能の再使用、保守、および転用の際に１０倍以上の生産性を発揮することが多いと認められる種類のアプリケーションである。
【００２５】
タイム・クリティカルなＪａｖａ（登録商標）技術の採用についての２つの技術的な障害は、（１）アプリケーション・スレッド１１２とガベージ・コレクション１４２との活動の間のきめの細かい協調のオーバヘッドに起因して、タイム・クリティカルなＪａｖａ（登録商標）仮想マシンが、従来のＪａｖａ（登録商標）仮想マシンよりもずっと遅く動作するということ、および、（２）従来のＪａｖａ（登録商標）スレッド１１２のレスポンス・レイテンシが、リアル・タイムＪａｖａ（登録商標）仮想マシンの最もレスポンスのよいものであっても、およそ２００μｓであるというものであった。これは、Ｃで書かれた類似スレッドの典型的なレスポンス・レイテンシよりもざっと２０倍遅い。本明細書で説明される技術的解決策は、このような技術的課題に対処し、従来のＪａｖａ（登録商標）に匹敵するスループット、および、Ｃで書かれたアプリケーションに匹敵するレスポンス・レイテンシを可能にする。したがって、本明細書で説明される技術的解決策は、Ｊａｖａ（登録商標）プログラムの実行についてのコンピューティング技術に根ざす技術的課題に対処し、高性能でタイム・クリティカルなＪａｖａ（登録商標）プログラムのためのポーズレスなガベージ・コレクションを容易にすることによってＪａｖａ（登録商標）プログラムの実行を改善する。本明細書で説明される例はＪａｖａ（登録商標）プログラムを使用するが、本明細書で説明される技術的解決策は、特にコンピュータ・プログラミング言語がメモリ管理のためにガベージ・コレクションを使用する場合、他の任意のコンピュータ・プログラミング言語、または、その組合せを使用して書かれたコンピュータ・プログラムに適用できるということに留意されたい。
【００２６】
本明細書で説明されるポーズレスなガベージ・コレクション・システムのガベージ・コレクションの総労力（total garbage collection effort）は、プロセス１１２によって実行されるアプリケーション・コードの実行にインターリーブされる小さな増分（increment）の作業に分割される。信頼できる動作を保証するために、ガベージ・コレクションおよびアプリケーションの労力の増分ごとに、図５に示すように、測定できる前方向のプログレスをもたらす。さらに、Ｊａｖａ（登録商標）オブジェクトがアプリケーションとガベージ・コレクション・スレッドとの間で共有されるので、ポーズレスなガベージ・コレクションは、データの一貫性を保証するためのプロトコルを使用する。ガベージ・コレクタ１４２がメモリをデフラグするためにオブジェクトをリロケートするたびに、プロセス１１２は、メモリ１０８内のオブジェクトの新しいロケーションを即座に認識するようになる。同様に、アプリケーション・スレッド、すなわちプロセス１１２が、既存のオブジェクトのポインタ・フィールドを上書きするたびに、または、現在実行中のメソッドの活性化フレーム内に包含されたポインタを上書きするたびに、ガベージ・コレクタ１４２は、オブジェクト接続性グラフ（object connectivity graph）のこの変化を、このことが「ガベージ」、すなわち、プロセス１１２によってもはや使用されていないメモリに対するガベージ・コレクタ１４２の認識を変化させる可能性があるとして、即座に認識する。
【００２７】
Ｊａｖａ（登録商標）アプリケーション開発者は、特殊な構文を使用して、スレッド間で共有されているオブジェクトをマークする。これは、コンパイラが非共有オブジェクトへのアクセスを最適化できるようにする。非共有オブジェクトの内容は、マシン・レジスタ１２６にキャッシュされることが可能であり、非共有オブジェクトへのアクセスには、キャッシュの一貫性を強制するメモリ・バリアは必要ない。Ｊａｖａ（登録商標）コンパイラは、プライベート（非共有）オブジェクトのみを扱っているスレッドのための非常に効率的なコードを生成する。このような構文は、ガベージ・コレクタ１４２に可視になるオブジェクトを区別しない。一貫性を保証するコードを発行することがコンパイラの責任、および機会である。
【００２８】
図２は、プログラム・スタック、および、プログラム・スタック上に記憶される典型的な活性化フレームのブロック図である。プログラム・スタック１１４は、両方のメソッド活性化フレーム（スタック・フレーム／活性化レコードとも呼ばれる。）を記憶する。中間計算評価データ（intermediate computational evaluation data）が、活性化フレーム内に記憶される。新しいメソッドまたはプロシージャが呼び出されるたびに、新しいスタック・フレームまたは活性化フレーム１３０が、スタック１１４上にプッシュされる。
【００２９】
図２に描写されるように、実例の活性化フレーム１３０は、数ある要素の中でも、復帰アドレス・プログラム・カウンタ値を含む。活性化フレーム１３０は、前のフレーム・スタック・ポインタ値（すなわち、もしあれば、先行するスタック・フレームの始まりを指す）をさらに含む。活性化フレーム１３０は、呼び出されたプロシージャまたはメソッドに関連付けられたオペランド・パラメータ１６０，１６２をさらに含む。活性化フレーム１３０は、呼び出されたプロシージャまたはメソッドに関連付けられたローカル変数１６４，１６６をさらに含む。
【００３０】
まださらに、プログラム・スタック１１４の使用を管理するために、いくつかのレジスタが使用される。例えば、スタック１１４のベースを指すベース・フレーム・ポインタ１７０、スタックの最上部（すなわち、スタックの未使用部分の開始）を指すトップ・オブ・スタック・ポインタ１７２、および、現行の活性化フレーム１３０の終わりを指す現行フレーム・ポインタ１７４を記憶するために、レジスタが使用される。
【００３１】
１つまたは複数の例では、管理されたランタイム環境１１０は、プロセス１１２によって起動された各メソッドのための活性化フレーム１３０を、関連付けられたスレッド・スタック１１４に記憶するための命令を含む。従来の用語を使用して言い直すと、メソッドが起動されるか、または、プロシージャが呼び出されるたびに、活性化フレーム１３０がプログラム・スタック１１４上にプッシュされる。プロシージャが終了するたびに、データ・プロセッサは、現行の活性化フレーム１３０中の復帰アドレスＰＣにそのプログラム・カウンタＰＣをセットし、現行の活性化フレーム１３０は、プログラム・スタック１１４からポップされ、前回の活性化フレームが、新しい現行フレーム１７４になる。
【００３２】
起動されているメソッドに依存して、活性化フレーム１３０内のパラメータ１６０、１６２およびローカル変数１６４、１６６のうちの１つまたは複数は、オブジェクト参照であってもよい。典型的には、活性化フレーム１３０内に、各定義されたメソッドのための固定数のパラメータ、および、固定数のローカル変数があり、活性化フレーム１３０内のパラメータおよび変数のそれぞれのための固定された所定のデータ型がある。典型的なデータ型は、長整数、短整数（１６ビット符号付き整数）、単精度浮動小数点、倍精度浮動小数点、バイト、キャラクタ、および、（時に、オブジェクト・ハンドルと呼ばれる）オブジェクト参照を含む。
【００３３】
ポーズレス活性化フレームにおいて、プロセス１１２と、ガベージ・コレクタ１４２を実行するスレッドとの間で共有されるローカル・ポインタ値を保持するために、各メソッドの活性化フレームの最上位アドレスから固定オフセットに、所定の空間が予約される。メソッドが実行している時間の大部分の間、ポインタ変数は、マシン・レジスタに保持される。実行スレッドをプリエンプションする前に、全てのライブ・ポインタ変数が、PointerVariablePreemptionSaveArea２３０に保存される。プリエンプションに次いで、ポインタ・レジスタの内容が、PointerVariablePreemptionSaveAreaから、保存された値を読み込むことによって、リストアされる。これらのポインタ値を記憶することおよびフェッチすることは、これらの命令が、アプリケーション・バイナリ・インターフェース（ＡＢＩ：application binary interface）の既存命令に置き換わり、各関数呼び出しを取り巻く不揮発性レジスタを保存し、リストアするのでほぼフリーである。プリエンプション・セーフ・ポイントは、（典型的には、およそ１μｓの実時間に相当する）一時に何百もの命令が協調オーバヘッドを必要とせずに実行されることが可能になるように構成される。PointerVariablePreemptionSaveAreaの維持は、これを維持するために行われる動作が、既に行われている動作と同等であるので、フリーでなかったとしても、実質的に低コストであり、本明細書で説明される技術的解決策を実現しても、さらなる実質的な計算コストを追加しない。
【００３４】
ほとんどのポインタ・パラメータは、マシン・レジスタに渡され、ほとんどのローカル・ポインタ変数は、マシン・レジスタ内に同様に保持される。ポインタ・パラメータがメモリに渡される場合、コンパイラは、メソッドがプリエンプション要求に応じる前に、PointerVariablePreemptionSaveAreaのスロットにポインタ・パラメータの値をコピーするコードを生成する。ポインタ・ローカル変数がメモリ内で表現されなければならない場合、ローカル変数を表現するためにコンパイラによって予約されたスロットは、常にPointerVariablePreemptionSaveArea内から取得される。
【００３５】
図３は、１つまたは複数の例によるポーズレスなガベージ・コレクションのためのポーズレス活性化フレームを描写する。ポーズレス活性化フレーム２００は、Ｊａｖａ（登録商標）メソッドを実行するように描写される。しかしながら、ポーズレス活性化フレーム２００は、ガベージ・コレクションを使用する他の任意のコンピュータ・プログラミング言語に適用されることが可能であるということに留意されたい。ポーズレス活性化フレーム２００は、図２を参照しながら説明された典型的な要素だけでなく、現在のポーズレス活性化フレーム２００に関連付けられた現在のメソッドによって起動される次のメソッドへのオブジェクト参照２１０を含む。さらに、１つまたは複数の例では、ポーズレス活性化フレーム２００は、現在の活性化フレーム２００に関連付けられたメソッドが起動されたコンテキストを表す真の復帰アドレス・フィールド（TrueLRSave）２２０を含む。さらに、１つまたは複数の例では、現在のポーズレス活性化フレーム２００は、ポインタ変数プリエンプション保存領域２３０への参照を含む。真の復帰アドレス２２０、およびプリエンプション保存領域２３０への参照は、関連付けられたメソッドがプリエンプション・ポイントを有していない場合、現在のポーズレス活性化フレーム２００に記憶されなくてもよい。
【００３６】
ポインタ変数プリエンプション保存領域２３０は、現在のポーズレス活性化フレーム２００に関連付けられた第１のメソッドからのライブ・ポインタの全てが記憶されるメモリ・ロケーションの集合体である。１つまたは複数の例では、プリエンプション保存領域２３０は、ライブ・ポインタを記憶するための専用ロケーションを含む。第１のメソッド内の１つまたは複数のライブ・ポインタは、コード生成時にコンパイラ（図示せず）によって決定されることが可能である。
【００３７】
図３は、プログラム・スタック１１４内の第２のポーズレス活性化フレーム２０５をさらに描写する。第２のポーズレス活性化フレーム２０５は、現在のポーズレス活性化フレーム２００に関連付けられたメソッド（第１のメソッド）を起動した呼出元（第２の）メソッドに関連付けられる。第２のポーズレス活性化フレーム２０５は、フィールド２１０、２２０、および２３０も含む。
【００３８】
第２のメソッドが、第１のメソッドを起動する用意ができているとき、まさに起動されようとしている第１のメソッドに関連付けられた記号情報を提供するMethodImplementationオブジェクトへの参照で、第２のメソッドの活性化フレーム２０５のInvokedMethodImplementationフィールド２１０を上書きする。この記号情報は、（リスキーな動作を要求するコードが信頼され得るものであることをコール・チェーンが確認した場合だけ、リスキーな動作を実行できるようにする）一定のセキュリティ管理機能をサポートするため、および、記号的なデバッグを容易にするため、すべてのスローされた例外に埋め込まれるスタック・トレース情報を提供するために使用される。ポーズレスなガベージ・コレクション環境において、MethodImplementationオブジェクト２１０は、各プリエンプション・ポイントにおけるPointerVariablePreemptionSaveArea２２０の状態も記述する。典型的なメソッドのプロローグおよびエピローグは、活性化フレームのTrueLRSaveまたはPointerVariablePreemptionSaveAreaフィールド２２０および２３０にアクセスしない。
【００３９】
コード・ジェネレータまたはコンパイラ（図示せず）は、各メソッド起動がガベージ・コレクタ１４２によるプリエンプションをもたらすことができることを仮定する。したがって、各起動は、プリエンプション・ポイントとして扱われ、テーブル１におけるロジックによって記述されたアクションが伴う。
【００４０】
【表１】
2021530756.tif 000003
【００４１】
各ポインタ変数が揮発性レジスタ１２６内に保持されると仮定すると、ライブ・ポインタを保存およびリストアするこの労力は、全ての呼出元が保存した（揮発性）レジスタ１２６に対してＣコードなどの他のプログラミング言語によって既存のＡＢＩにおいて行われた本質的と同じ労力ある。
【００４２】
このメソッド起動プロトコルの伝統的手法に起因して、不揮発性（呼出先が保存した）レジスタ１２６は、典型的には、ポインタ変数を表現するためにアロケートされない。これは、これらのコード生成の伝統的手法が、すべてのメソッド起動にわたって機能を停止したものとして各ポインタ変数を認識させるからである。本明細書で説明されるポーズレス活性化フレームを使用しない言語では、メソッド起動から戻ったときに特定のポインタ変数にリストアされた値は、起動前に保存されたものと全く同じ値である。しかしながら、ポーズレス活性化フレーム装置では、ポインタ変数にリストアされた値は、ポインタ変数プリエンプション保存領域に保存されたものと異なり得る。ガベージ・コレクタ１４２がメモリ断片化を減らすために参照されたオブジェクトをリロケートする場合、リストアされた値は、プリエンプション保存領域２３０に本来保存されていた値と異なり得る。さらに、ライブであるとみなされるポインタ変数のセット、および、ポインタ変数プリエンプション保存領域内に各ライブ・ポインタ変数を保存するための専用のスロットは、関数内の各プリエンプション・ポイントとは異なり得る。
【００４３】
第１のメソッドが、他のメソッドのそのメソッド起動によって表されたよりも多くのプリエンプション・ポイントを必要とする場合、コード・ジェネレータは、明示的なプリエンプション・チェックをメソッドの本体に挿入する。明示的なプリエンプション・チェックを実現するコードは、テーブル２に示される。このスレッドがプリエンプションされる間に、ガベージ・コレクタ１４２がこのスレッドのスタックをスキャンし始める場合、ガベージ・コレクタ１４２は、プリエンプションされたメソッドについて、ポインタ変数プリエンプション保存領域２３０をスキャンし（４３４）、その後、このスレッドが実行を再開することが許可される（４３８）。プリエンプションされたメソッドは、バンガード・メソッドとして知られる。バンガード・メソッドのため、および、バンガード・メソッドから直接的または間接的に起動された任意のメソッドのためのポーズレス活性化フレームは、スキャンされる必要がない。バンガード・メソッドから制御が戻ると、アプリケーション・スレッドは、バンガード・メソッドの呼出元を実装するコードのいずれかを実行する前に、囲んでいる活性化フレームのポインタ変数プリエンプション保存領域を自動的にスキャンし、バンガード・メソッドの呼出元は、新たに識別されたバンガード・メソッドになる。
【００４４】
【表２】
2021530756.tif 000004
【００４５】
プロセス１１２の現行のスレッドが、その次の明示的なプリエンプション・ポイントに達するまでコンテキスト・スイッチを遅延させると、レスポンス・レイテンシが増加するが、プリエンプション・ポイント間で実行するコードの効率を向上させることができる。ポーズレス活性化フレーム２００を維持することは、ガベージ・コレクタ１４２が、典型的にはアプリケーションの実行時間の９０％超のアイドルである間、非常に小さい実行オーバヘッドをプロセス１１２の実行スレッドに課す。実行時間中にポーズレス活性化フレーム２００を維持することは、各スレッドのプログラム・スタック１１４を漸増的にスキャンしやすくすることによって、プロセス１１２のレスポンス・レイテンシを改善する。
【００４６】
一般性を失うことなく、各アプリケーション・スレッドが、アプリケーション・スレッドのスタックのスキャン専用の単一のガベージ・コレクション・スレッドとペアになると仮定する。ペアになったスレッドは、単一のハードウェア・スレッド・コアへのアクセスを共有し、その結果、２つのスレッドのうちの１つだけが任意の特定の時間に実行することを許可されるようになる。２つのスレッド間のコンテキスト・スイッチは、アプリケーション・スレッドのためのコンパイラによって、および、ガベージ・コレクション・スレッドのための管理されたランタイム環境の開発者によって、予め決定された、指定されたプリエンプション・セーフ実行ポイントでのみ発生する。ガベージ・コレクタ１４２、および、プロセス１１２のアプリケーション・スレッドが、同時に同一スタックをスキャンしていないことを保証すると、同一活性化フレームの共有スロットに競合アクセスしないようにするロック・プロトコルを不要にする。アプリケーション・スレッドとガベージ・コレクション・スレッドとの間の代替の多対多のマッピングが、スレッド同期ロックの使用によって、または、関連付けられたガベージ・コレクション・スレッドが動いているのと同時にアプリケーション・スレッドが動くようにスケジューリングすることを慎重に避けるインテリジェント統合スレッド・スケジューラによって、実現され得る。
【００４７】
図４は、タイム・クリティカルなアプリケーションのワークロードのバックグラウンドで同時に動いているガベージ・コレクション活動として、スレッド・スタックのポーズレスなスキャンを実行するための実例の方法のフローチャートを描写する。この方法の複数のインスタンス、プロセス１１２における各アクティブ・スレッドについて１つのインスタンスが、同時に動作することができる。方法は、プロセス１１２の一部として実行している、関連付けられたアプリケーション・スレッドと並行して作業するガベージ・コレクタ１４２のスレッドを含む。ガベージ・コレクタ１４２のスレッドは、ガベージ・コレクタ１４２がスキャンする意図を伝えたシステム１００において実行中の１つのプロセス・スレッドのスタック１１４をスキャンする。典型的には、ガベージ・コレクタ１４２は、スレッド・スタック１１４を各スタックの最下位（より上位のメモリ・アドレス）から開始してスキャンし、その最上位に向けて作業する。スレッド・スタック１１４は、バックグラウンド活動としてスキャンされる。
【００４８】
ガベージ・コレクタ１４２は、ガベージ・コレクションの前のフェーズが完了したことが理由で、または、メモリ・アロケーション・プールのサイズが特定の閾値より小さく縮小したことが理由で、または、ある一定のガベージ・コレクション・フェーズを始めるように以前にスケジューリングされた時間に到達したことが理由で、または、他の任意の所定の条件が理由で、スレッド・スタックをスキャンするべきときであると決定する。スタックがスキャンされる必要があるスレッドのそれぞれについて、ガベージ・コレクタ１４２は、図４で説明されたメソッドを実行する。各スレッド・スタック上の一番下の活性化フレームは、明示的なプリエンプション・ポイントを有しておらず、その活性化フレームのInvokedMethodImplementationフィールドの値以外にポインタを維持していない、単純なブートストラップ・メソッドに関連付けられると仮定される。
【００４９】
スタックをスキャンするプロセス・スレッドをガベージ・コレクタが選択した時、ガベージ・コレクタは、アプリケーション・スレッドがプリエンプションされた状態であることを保証する。スレッドが最も最近プリエンプションされたときに動作していたプロセス・スレッド・メソッドが、バンガード・メソッドとして識別される。スキャンされることになる対応するプログラム・スタック１１４のためにプロセス・スレッドが選択されると、ガベージ・コレクタ１４２は、スキャンされる必要があるポーズレス活性化フレームの範囲を識別するために、関連付けられたスレッド記述子のscan_baseおよびscan_topフィールドをセットし（４３２）、バンガード・メソッドのポインタ変数プリエンプション保存領域２３０をスキャンし（４３４）、また、特殊なトランポリン関数のアドレスでバンガード・メソッドの復帰アドレスを上書きすることによって、独自のスタック・フレームのスキャンを支援することをプロセス１１２のプロセス・スレッドに通知する（４３６）。このセットアップ作業４３０の終わりに、ガベージ・コレクタ１４２は、必要であれば、アプリケーション・スレッドが実行し続けることを許可することに応じる。このセットアップ作業４３０を行うのに必要な時間は非常に短く、典型的には、１μｓよりも短い。したがって、アプリケーション・スレッドのタイムリな実行へのガベージ・コレクタ１４２の干渉は、ポーズレスであるとみなされる。
【００５０】
図５は、アプリケーション・プロセスとバックグラウンド・ガベージ・コレクションとの活動の間の交互に行われる労力の増分をスケジューリングするための実例の方法のフローチャートを描写する。プロセス１１２の実行中、ガベージ・コレクションは、ほとんどの時間、アイドルである。管理されたランタイム環境１１０の一部であるスレッド・スーパーバイザ１４８は、ガベージ・コレクタ１４２およびプロセス・スレッドによって実行されることになる作業の増分のスケジューリングを担う。ガベージ・コレクションがアイドルである場合（４６０）、または、アプリケーション・スレッドが、ガベージ・コレクタよりも緊急性高く動作する必要がある場合（４６２）、ＣＰＵ時間の増分は、プロセス・スレッドの実行に割かれる（４６４）。ガベージ・コレクタの必要性がプロセス・スレッドよりも緊急性が高い場合（４６２）、ＣＰＵ時間の増分は、ガベージ・コレクション活動に割かれる（４６８）。非常に高い優先度のプロセス１１２のスレッドが、新しいオブジェクトをアロケートできるようにヒープが補充されるのを待機している珍しいケースでは、ガベージ・コレクション活動は、待機中のプロセス・スレッドの高いスケジューリング優先度を継承する。最も一般的なシナリオは、ガベージ・コレクションが低い優先度で実行され、高い優先度のタイム・クリティカルなプロセス・スレッドが新しい作業を待っている時間中、ガベージ・コレクションをプロアクティブに実行することによって、メモリ不足条件が避けられる。プロセス・スレッドとガベージ・コレクション・スレッドの両方は、プリエンプション要求（４６６、４７０）に頻繁に応じ、その結果、新たに実行する準備ができた高い優先度のタスクが、その作業をタイムリに完了させるためにＣＰＵ１０２に迅速にアクセスすることができるようになる。
【００５１】
リソースが許されれば、バックグラウンドのガベージ・コレクション・スレッドは、バックグラウンド活動としてスレッド・スタックをスキャンし続け、より高い優先度のプロセス１１２のスレッドがフォアグラウンドで動作することを可能にする。scan_baseがscan_topよりも大きい値を有すること（４４０）によって示されたように、スキャンされる必要があるポーズレス活性化フレームをスレッドが有している間に反復するループにおいて、ガベージ・コレクション・スレッドは、scan_baseポインタのすぐ下で見つかったポーズレス活性化フレームに属するPointerVariablePreemptionSaveAreaフィールドの内容をスキャンする（４５２）。この活性化フレームをスキャンした後、ガベージ・コレクタは、scan_base変数の値を調節し、スキャンされる必要がまだあるポーズレス活性化フレームの新しい範囲を反映する（４５４）。１つの活性化フレームをスキャンした後、このスレッド上に、スキャンされることになる活性化フレームがこれ以上ない場合（４５５）、ガベージ・コレクタは、バンガード・メソッドが戻るときのトランポリン・サブルーチンではなく、バンガード・メソッドの本来の呼出元に制御が戻ることになるように、スレッドの現行のバンガード・メソッドの呼出元のためのLRSaveフィールドを上書きする（４５６）。ガベージ・コレクタ１４２は、プリエンプション要求に頻繁に応じ、その結果、作業をタイムリに完了させるために、動作する準備ができているより高い優先度のプロセス・スレッドがＣＰＵ１０２に素早くアクセスできるようにする（４５８）。
【００５２】
制御がバンガード・メソッドから戻るとき、特殊なハンドリングが行われる。バンガード・メソッドを元々起動したメソッドに、直接戻るのではなく、制御は、特殊なトランポリン・サブルーチンに代わりに戻り、これは、図６に示されたフローチャートによって表される。トランポリン・サブルーチンは、呼出元の活性化フレームがバックグラウンドのガベージ・コレクション・スレッドによって既にスキャンされたかどうかをチェックする（４８０）。呼出元のフレームがまだスキャンされていない場合、トランポリン・サブルーチンは、活性化フレーム４８２をスキャンし、スレッド記述子のscan_top変数の値を調節し、新たにスキャンされた活性化フレームを、新たに選択されたバンガード・メソッドに属するものとしてを識別する。
【００５３】
新たに選択されたバンガード・メソッドの活性化フレームをトランポリン・サブルーチンがスキャンする場合、トランポリン・サブルーチンは、新たに選択されたバンガード・メソッドの呼出元の活性化フレームもスキャンされる必要があるかどうかをさらにチェックする（４８６）。必要がある場合、トランポリン・サブルーチンは、呼出元のポーズレス活性化フレームのLRSaveおよびTrueLRSaveフィールドを上書きすること（４８８）によって、新たに選択されたバンガード・メソッドから制御が戻るときに、その活性化フレームがスキャンされるように構成する。
【００５４】
トランポリン・サブルーチンによって行われる最終的なアクションは、新たな現行の活性化フレームのTrueLRSaveフィールド内に保持されたアドレスに分岐することによって、以前に実行していたメソッドの呼出元に制御を戻すことになる。
【００５５】
プログラム・スタック１１４がスキャンを始めた後にプロセス・スレッドによって起動されたメソッドの活性化フレームは、スキャンされない。図７は、プロセス・スレッドによってガベージ・コレクションのために行われるプログラム・スタック・スキャンの実例のシナリオの視覚的表現を示す。プログラム・スタック１１４は、ガベージ・コレクタ１４２によってスキャンされたポーズレス活性化フレーム５１０を含む。ポーズレス活性化フレーム５１０は、さらなるメソッドを呼び出したメソッドに関連付けられ、これらの実行から戻るために、呼び出されたメソッド上で待っている。さらに呼び出されたメソッドは、ポーズレス活性化フレーム２００に関連付けられたバンガード・メソッドを含み、バンガード・メソッドは、呼出元のポーズレス活性化フレーム２０５に関連付けられた呼出元メソッドによって呼び出される。さらに、プログラム・スタック１１４は、バンガード・メソッドによって、および、バンガード・メソッドの後で、呼び出されたメソッドに対応するポーズレス活性化フレーム５３０を含む。メソッドが呼び出される順序は、対応するポーズレス活性化フレームがプログラム・スタック１１４上にプッシュされる順序によって表される。
【００５６】
並行して、ガベージ・コレクタ１４２は、４５０において、ガベージ・コレクタ１４２がスキャンする意図を伝えたプロセス・スレッドからの１つまたは複数のメソッドのポーズレス活性化フレーム５１０をスキャンする。例えば、スキャンは、プロセス・スレッドの実行と同時にバックグラウンド活動として行われる。
【００５７】
したがって、ガベージ・コレクタ１４２は、プロセス・スレッドを使用してインクリメンタル・スタック・スキャンを行い、ここで、プロセス・スレッドは、ガベージ・コレクタ１４２がスタック１１４内の他のポーズレス活性化フレームをスキャンするのと実質的に同時に、１つまたは複数のポーズレス活性化フレームをスキャンする。本明細書で説明されるように、スタック１１４は、複数のポーズレス活性化フレームを含み、各フレームは、コンピュータ・システム１００によって実行されたコンピュータ・プログラムからのそれぞれのメソッド起動に対応する。言い換えれば、プロセス１１２における各メソッド起動は、プロセス１１２を実行しているスレッドのプログラミング・スタック１１４内に対応するポーズレス活性化フレーム２００を作成する。各プロセス・スレッドは、１つまたは複数の例において、それ独自のプログラミング・スタック１１４を有する。メソッド、例えばメソッド−３（図７）が、別のメソッド、例えばメソッド−４（図５）を呼び出すと、メソッド−３は、メソッド−４から制御が戻るまで動かない。しかしながら、メソッド−３の活性化フレームは、「ライブ」ポインタをまだ包含している可能性がある。したがって、ガベージ・コレクタ１４２は、メソッド−４のポーズレス活性化フレーム２００（バンガード活性化フレーム）、および、メソッド−３のポーズレス活性化フレーム２０５（呼出元活性化フレーム）をスキャンしなければならない。スキャンは、ライブ・ポインタを識別するために行われ、ライブ・ポインタがガベージ・コレクションによって処理されることが可能になる。メソッド−４は、次に、メソッド−５などの他のメソッドを起動すること／呼び出すことができ、メソッド−５は、次に、メソッド−６を呼び出す。それに応じて、ガベージ・コレクタ１４２は、ライブ・オブジェクトを連続した位置にリロケートし、ライブ・オブジェクトの間で見つかった未使用のオブジェクトが単一の大きいフリー・セグメントに合体させられることが可能になる。これは、その後のメモリ・アロケーション動作をより一層効率的なものにする。さらに、上述のシナリオにおいて、メソッド−６を呼び出すメソッド−５をメソッド−４が呼び出すと、メソッド−６が現在のメソッドであることから、メソッド−４はもはや「現在の」メソッドではないということに留意されたい。メソッド−４は、スタック・スキャン中の「最前部の」メソッドであるので、まだバンガード・メソッドである。バンガード・メソッドから呼び出された他のメソッドは、スキャンされる必要がない。バンガード・メソッドのフレームはスキャンされたが、バンガード・メソッドは、まだスキャンに含まれている。
【００５８】
本明細書で説明されるように、メソッド−５およびメソッド−６に対応するポーズレス活性化フレーム５３０は、この場合、メソッド−４の起動であったプリエンプション・ポイントの後で開始されるので、スキャンされることはない。この例において、ガベージ・コレクタ１４２は、スタック１１４の最下位からスキャンを開始し、メソッド−１のためのポーズレス活性化フレームの後、メソッド−２のためのポーズレス活性化フレームが続く（５１０）。同時に、プロセス・スレッドは、バンガード・メソッドから制御が戻るときに、バンガード・メソッドの呼出元であるメソッドに属する、以前スキャンされていない活性化フレームをスキャンすることを担う。ガベージ・コレクタ１４２がメソッド−３のための活性化フレームをスキャンする前にバンガード・メソッドが戻る場合、メソッド−３のためのポーズレス活性化フレーム２０５は、バンガード・メソッドが、その呼出元の活性化フレームのLRSaveフィールド２２０に示されたアドレスに戻るときに、制御が流れるトランポリン・サブルーチン（図６）によってスキャンされる（４８２）。代替として、ガベージ・コレクタは、バンガード・メソッドからプロセス・スレッドが戻る前に、メソッド−３のための活性化フレームをスキャンすることができる（４５２）。プロセス・スレッドがバンガード・メソッドから戻る時間までに、ガベージ・コレクタ１４２がメソッド−３のためのポーズレス活性化フレーム２０５を既にスキャンしていた場合、プロセス・スレッドは、再びスキャンを行わない。この状況が発見されると、ポーズレス活性化フレームの同時スキャンは、完了しているとみなされる。
【００５９】
ガベージ・コレクタ１４２によってポーズレス活性化フレームをスキャンすることは、スキャンされる各活性化フレームについて、現行のライブ・ポインタを見つけることを含む。図４を再び参照すると、ガベージ・コレクタ１４２は、４３４において、呼出元の活性化フレーム２０５からInvokedMethodImplementationフィールド２１０の値をフェッチすることによって、活性化フレームのPointerVariablePreemptionSaveAreaの現行の状態を記述したMethodImplementationオブジェクトを見つけることによって、ポーズレス活性化フレーム２００のライブ・ポインタを見つける。ポーズレス活性化フレーム２０５におけるInvokedMethodImplementationフィールド２１０は、メソッド−３によって最も最近起動されたメソッドを記述したMethodImplementationオブジェクトのアドレスを記憶する。さらに、バンガード・メソッドのポーズレス活性化フレーム２００のLRSaveフィールド２２０の値は、４３４において、PointerVariablePreemptionSaveArea２３０内のどのスロットが、この特定のプリエンプション・ポイントに対するライブ・ポインタを保持するかを判定するために、MethodImplementationオブジェクト内に記憶された情報と組み合わせて使用される。
【００６０】
４５５において、ガベージ・コレクタ１４２のスキャンの労力（４５０）は、プロセス・スレッド自身のスキャンの労力と最終的に交わる。ガベージ・コレクタ１４２は、スレッド・スタックの全てのポーズレス活性化フレームがスキャンされたことを識別すると、４５５および４５６において、そのポーズレス活性化フレームのLRSave２４０フィールドを、そのTrueLRSaveフィールド２２０の現行の内容で上書きする。この時点で、ガベージ・コレクタ１４２は、プロセス・スレッドのスタック１１４が完全にスキャンされたものとみなす。さもなければ、ガベージ・コレクタ１４２は、プログラミング・スタック１１４内の他のポーズレス活性化フレーム２０５をスキャンし続ける。一般に、ガベージ・コレクタ１４２は、全てのプロセス・スレッドのスタック１１４が完全にスキャンされるまで、ガベージ・コレクタ１４２の現行の動作フェーズを完了させることができない。
【００６１】
本明細書で説明される技術的解決策は、Ｊａｖａ（登録商標）のようなコンピュータ・プログラミング言語でのポーズレスなガベージ・コレクションを容易にする。ポーズレスなガベージ・コレクションは、ポーズレス活性化フレームによって容易にされる。ポーズレス活性化フレームは、MethodImplementationオブジェクト・ポインタを含む、プロセス・スレッドとガベージ・コレクション・スレッドとの間で共有されるローカル・ポインタ値を保持するために、最上位に固定空間を含む。プロセス・スレッドは、コンパイラによって確立されたプリエンプション・セーフ・ポイントにおけるローカル・ポインタ値を記憶し、フェッチする。各メソッド起動（method invocation）は、プリエンプション・ポイントとして扱われる。プロセス・スレッドは、特定のプロセス・スレッドのバンガード・メソッドから戻るときに、呼出元の活性化フレームをスキャンすることによってガベージ・コレクションを支援する。MethodImplementationオブジェクト・ポインタは、例外に組み込まれることが可能なスタック・トレース情報を提供する。MethodImplementationオブジェクトは、各プリエンプション・ポイントにおける「ポインタ変数プリエンプション保存領域」の状態を記述する。
【００６２】
したがって、本明細書で説明される技術的解決策は、インクリメンタル・スタック・スキャンに基づくポーズレスなガベージ・コレクションを使用して、高性能でタイム・クリティカルなアプリケーションを実現するための、ガベージ・コレクション・コンピュータ・プログラミング言語への改善を容易にする。本明細書で説明される技術的解決策は、本明細書で説明されるようなポーズレス活性化フレームを使用してポーズレスなガベージ・コレクションを行うことによって、従来のスレッドの実質的に１０％以内でタイム・クリティカルなアプリケーション・スレッドのパフォーマンスを容易にし、１０μｓという短いプリエンプション・レイテンシを達成することができる。
【００６３】
本技術的解決策は、統合の任意の可能な技術的に詳細なレベルにおけるシステム、方法、またはコンピュータ・プログラム製品、あるいはその組合せであってもよい。コンピュータ・プログラム製品は、本技術的解決策の態様をプロセッサに行わせるためのコンピュータ可読プログラム命令を有するコンピュータ可読記憶媒体（または複数の媒体）を含むことができる。
【００６４】
コンピュータ可読記憶媒体は、命令実行デバイスによる使用のための命令を保持し、記憶することができる有形デバイスであることが可能である。コンピュータ可読記憶媒体は、例えば、電子ストレージ・デバイス、磁気ストレージ・デバイス、光ストレージ・デバイス、電磁気ストレージ・デバイス、半導体ストレージ・デバイス、または前述の任意の適切な組合せであってよいがこれらに限定されない。コンピュータ可読記憶媒体のより具体的な例の非網羅的なリストは、ポータブル・コンピュータ・ディスケット、ハードディスク、ランダム・アクセス・メモリ（ＲＡＭ）、リード・オンリ・メモリ（ＲＯＭ）、消去可能プログラマブル・リード・オンリ・メモリ（ＥＰＲＯＭまたはフラッシュ・メモリ）、スタティック・ランダム・アクセス・メモリ（ＳＲＡＭ）、ポータブル・コンパクト・ディスク・リード・オンリ・メモリ（ＣＤ−ＲＯＭ）、デジタル多用途ディスク（ＤＶＤ）、メモリ・スティック、フロッピー（登録商標）・ディスク、命令が記録されたパンチ・カードまたは溝内隆起構造などの機械的にエンコードされたデバイス、および前述の任意の適切な組合せを含む。コンピュータ可読記憶媒体は、本明細書で使用されるように、電波もしくは他の自由に伝搬する電磁波、導波路もしくは他の伝送媒体を通じて伝搬する電磁波（例えば、光ファイバ・ケーブルを通過する光パルス）、またはワイヤを通じて伝送される電気信号などの、本質的に一過性の信号であると解釈されるべきではない。
【００６５】
本明細書で説明されるコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体からそれぞれのコンピューティング・デバイス／処理デバイスに、あるいは、例えば、インターネット、ローカル・エリア・ネットワーク、広域ネットワーク、もしくはワイヤレス・ネットワーク、またはその組合せといった、ネットワークを介して外部コンピュータまたは外部ストレージ・デバイスにダウンロードされることが可能である。ネットワークは、銅伝送ケーブル、光伝送ファイバ、ワイヤレス伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイ・コンピュータ、またはエッジ・サーバ、あるいはその組合せを含むことができる。各コンピューティング・デバイス／処理デバイス内のネットワーク・アダプタ・カードまたはネットワーク・インターフェースは、ネットワークからコンピュータ可読プログラム命令を受け取り、それぞれのコンピューティング・デバイス／処理デバイス内のコンピュータ可読記憶媒体に記憶させるためにコンピュータ可読プログラム命令を転送する。
【００６６】
本技術的解決策の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、インストラクション・セット・アーキテクチャ（ＩＳＡ）命令、機械語命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、集積回路機器のための構成データ、または、Ｓｍａｌｌｔａｌｋ（登録商標）、Ｃ＋＋、もしくは同様のものなどのオブジェクト指向プログラミング言語、および、「Ｃ」プログラミング言語もしくは類似のプログラミング言語などの手続き型プログラミング言語を含む１つもしくは複数のプログラミング言語の任意の組合せで書かれたソース・コードもしくはオブジェクト・コードのいずれかであってもよい。コンピュータ可読プログラム命令は、スタンド・アロンのソフトウェア・パッケージとして、全面的にユーザのコンピュータ上で、部分的にユーザのコンピュータ上で実行することができ、部分的にユーザのコンピュータ上かつ部分的にリモート・コンピュータ上で、または全面的にリモート・コンピュータもしくはサーバ上で実行することができる。後者のシナリオにおいて、リモート・コンピュータは、ローカル・エリア・ネットワーク（ＬＡＮ）、もしくは広域ネットワーク（ＷＡＮ）を含む任意のタイプのネットワークを通じてユーザのコンピュータに接続されてもよく、または、接続は、（例えば、インターネット・サービス・プロバイダを使用してインターネットを通じて）外部コンピュータに対して行われてもよい。いくつかの実施形態において、例えば、プログラマブル・ロジック回路機器、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、またはプログラマブル・ロジック・アレイ（ＰＬＡ）を含む電子回路機器は、本技術的解決策の態様を行うために、コンピュータ可読プログラム命令の状態情報を利用して電子回路機器を個別化することによって、コンピュータ可読プログラム命令を実行することができる。
【００６７】
本技術的解決策の態様は、技術的解決策の実施形態による方法、装置（システム）、およびコンピュータ・プログラム製品のフローチャートまたはブロック図あるいはその両方を参照しながら本明細書で説明される。フローチャートまたはブロック図あるいはその両方の各ブロック、ならびに、フローチャートまたはブロック図あるいはその両方におけるブロックの組合せは、コンピュータ可読プログラム命令によって実装されることが可能であるということが理解されよう。
【００６８】
これらのコンピュータ可読プログラム命令は、コンピュータまたは他のプログラム可能データ処理装置のプロセッサを介して実行する命令が、フローチャートまたはブロック図あるいはその両方の１つまたは複数のブロックに指定された機能／動作を実装するための手段を作り出すべく、汎用コンピュータ、専用コンピュータ、または他のプログラム可能データ処理装置のプロセッサに提供されてマシンを生産するものであってよい。これらのコンピュータ可読プログラム命令は、命令が記憶されたコンピュータ可読記憶媒体が、フローチャートまたはブロック図あるいはその両方の１つまたは複数のブロックに指定された機能／動作の態様を実装する命令を含む製品を備えるべく、コンピュータ可読記憶媒体にさらに記憶され、コンピュータ、プログラム可能データ処理装置、または他のデバイス、あるいはその組合せに特定の手法で機能するように指図できるものであってもよい。
【００６９】
コンピュータ可読プログラム命令は、コンピュータ、他のプログラム可能装置、または他のデバイス上で実行する命令が、フローチャートまたはブロック図あるいはその両方の１つまたは複数のブロックに指定された機能およびアクションを実装するべく、コンピュータ実装処理を生み出すために、コンピュータ、他のプログラム可能データ処理装置、または他のデバイスにさらにロードされ、コンピュータ、他のプログラマブル装置、または他のデバイスで一連の動作ステップを実行させるものであってもよい。
【００７０】
図中のフローチャートおよびブロック図は、本技術的解決策の様々な実施形態によるシステム、方法、およびコンピュータ・プログラム製品の可能な実装形態のアーキテクチャ、機能、および動作を示す。この点に関して、フローチャートまたはブロック図の中の各ブロックは、指定された１つまたは複数の論理機能を実装するための１つまたは複数の実行可能命令を含む命令のモジュール、セグメント、または一部を表すことができる。いくつかの代替実装形態において、ブロックに記された機能は、図に記された順序とは異なる順序で発生してもよい。例えば、連続して示された２つのブロックは、実際には、実質的に並行に実行されてもよく、または、ブロックは、時には、含まれる機能に応じて逆の順序で実行されてもよい。ブロック図またはフローチャートあるいはその両方の各ブロック、および、ブロック図またはフローチャートあるいはその両方におけるブロックの組合せは、指定された機能もしくは動作を行う、または、特殊用途のハードウェアとコンピュータ命令の組合せを行う特殊用途のハードウェア・ベースのシステムによって実装されることが可能であるということにも留意されたい。
【００７１】
第２のアクションは、第２のアクションが第１のアクションから直接的に生じるか、間接的に生じるかに関係のなく、第１のアクション「に応答して（in response to）」のものであると言うことができる。第２のアクションは、第１のアクションよりもかなり後で発生してもよく、まだ第１のアクションに応答してもよい。同様に、第２のアクションは、介在するアクションが第１のアクションと第２のアクションとの間に起こったとしても、また、介在するアクションのうちの１つまたは複数が、直接的に第２のアクションを行わせたとしても、第１のアクションに応答してのものであると言うことができる。例えば、第２のアクションは、第１のアクションがフラグをセットし、フラグがセットされるたびに、第３のアクションが後で第２のアクションを開始する場合、第１のアクションに応答してのものであってもよい。
【００７２】
使用目的を明らかにし、これによって公衆に通知するために、句「＜Ａ＞、＜Ｂ＞、．．．および＜Ｎ＞のうちの少なくとも１つ（at least one of <A>, <B>, ...and <N>）」または「＜Ａ＞、＜Ｂ＞、．．．＜Ｎ＞のうちの少なくとも１つ、またはこれらの組合せ（at least one of <A>, <B>, ... <N>, or combinations thereof）」または「＜Ａ＞、＜Ｂ＞、．．．および／または＜Ｎ＞（<A>,<B>, ... and/or <N>）」は、最も広い意味で解釈されるべきであり、明確に反対の主張が示されない限り、上文または下文において示された他の任意の定義に取って代わり、Ａ、Ｂ、．．．およびＮを含むグループから選択された１つまたは複数の要素を意味する。言い換えれば、これらの句は、要素Ａ、Ｂ、．．．またはＮのうちの１つまたは複数の任意の組合せを意味し、任意の１つの要素を単独で含むか、または、挙げられていない追加要素を組み合わせてさらに含むことができる他の要素のうちの１つまたは複数と１つの要素を組み合わせて含む。
【００７３】
命令を実行する本明細書で例示された任意のモジュール、ユニット、構成要素、サーバ、コンピュータ、端末、またはデバイスは、例えば、磁気ディスク、光ディスク、もしくはテープといった、記憶媒体、コンピュータ記憶媒体、もしくはデータ・ストレージ・デバイス（取外し可能もしくは取外し不能またはその両方）などのコンピュータ可読媒体を含んでもよい、あるいはそうでなければ、コンピュータ可読媒体にアクセスできてもよいということも正しく認識されよう。コンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラム・モジュール、または他のデータなどの情報の記憶のための任意の方法または技術で実現される揮発性および不揮発性の、取外し可能および取外し不能な媒体を含んでもよい。このようなコンピュータ記憶媒体は、デバイスの一部、または、デバイスにアクセス可能もしくは接続可能なものであってもよい。本明細書で説明される任意のアプリケーションまたはモジュールは、このようなコンピュータ可読媒体によって記憶、またはそうでなければ保持され得るコンピュータ可読命令／実行可能命令を使用して実現されてもよい。
【図１】
2021530756.tif 000005
【図２】
2021530756.tif 000006
【図３】
2021530756.tif 000007
【図４】
2021530756.tif 000008
【図５】
2021530756.tif 000009
【図６】
2021530756.tif 000010
【図７】
2021530756.tif 000011
【国際調査報告】
2021530756.tif 000012
2021530756.tif 000013