IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ インターナショナル・ビジネス・マシーンズ・コーポレーションの特許一覧

特許7304119ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置
<>
  • 特許-ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 図1
  • 特許-ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 図2
  • 特許-ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 図3
  • 特許-ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 図4
  • 特許-ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 図5
  • 特許-ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 図6
  • 特許-ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 図7
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-06-28
(45)【発行日】2023-07-06
(54)【発明の名称】ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置
(51)【国際特許分類】
   G06F 12/02 20060101AFI20230629BHJP
【FI】
G06F12/02 530A
【請求項の数】 10
(21)【出願番号】P 2020564524
(86)(22)【出願日】2019-06-18
(65)【公表番号】
(43)【公表日】2021-11-11
(86)【国際出願番号】 IB2019055073
(87)【国際公開番号】W WO2020003050
(87)【国際公開日】2020-01-02
【審査請求日】2021-10-28
(31)【優先権主張番号】16/017,107
(32)【優先日】2018-06-25
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】390009531
【氏名又は名称】インターナショナル・ビジネス・マシーンズ・コーポレーション
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MACHINES CORPORATION
【住所又は居所原語表記】New Orchard Road, Armonk, New York 10504, United States of America
(74)【代理人】
【識別番号】100112690
【弁理士】
【氏名又は名称】太佐 種一
(72)【発明者】
【氏名】ニルセン、ケルビン、ドン
【審査官】打出 義尚
(56)【参考文献】
【文献】国際公開第2005/001695(WO,A1)
【文献】米国特許出願公開第2010/0114998(US,A1)
【文献】米国特許第06625808(US,B1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 12/02
(57)【特許請求の範囲】
【請求項1】
ポーズレスなガベージ・コレクションのための方法であって、
ガベージ・コレクタによって、ガベージ・コレクションのために、プロセスを実行しているプロセス・スレッドを選択するステップと、
ガベージ・コレクタ・スレッドまたは現在実行中の前記プロセス・スレッドによって、第1のメソッドに関連付けられた第1のポーズレス活性化フレームをスキャンさせるステップと、
前記プロセス・スレッドが現在実行中のプロセスからの第2のメソッドに関連付けられた第2のポーズレス活性化フレームを、制御が戻る際に、続けてスキャンするように前記プロセス・スレッドに命令するステップと、
前記ガベージ・コレクタによって、ガベージ・コレクタ・スレッドを使用して、前記プロセスからの第3のメソッドに関連付けられた第3のポーズレス活性化フレームをスキャンするステップと
を含み、
ポーズレス活性化フレームをスキャンするステップが、スキャンされている前記ポーズレス活性化フレームに対応するメソッドからの1つまたは複数のライブ・ポインタを検査し、上書きするステップを含む、方法。
【請求項2】
前記第2のメソッドは、前記第1のメソッドを起動する、請求項1に記載の方法。
【請求項3】
前記第2のポーズレス活性化フレームは、複数のポーズレス活性化フレームである、請求項1に記載の方法。
【請求項4】
前記第3のポーズレス活性化フレームは、複数のポーズレス活性化フレームである、請求項1に記載の方法。
【請求項5】
前記プロセス・スレッドは、前記ガベージ・コレクタ・スレッドが前記第3のポーズレス活性化フレームをスキャンするのと実質的に同時に前記第2のポーズレス活性化フレームをスキャンする、請求項1に記載の方法。
【請求項6】
メソッドのための前記ポーズレス活性化フレームは、前記メソッドによって起動された第4のメソッドに関連付けられた記号情報を表すオブジェクトへのオブジェクト・ポインタを含む、請求項1に記載の方法。
【請求項7】
メソッドのための前記ポーズレス活性化フレームは、メソッドを起動した前記メソッドへの復帰アドレスを示すポインタを含む、請求項1に記載の方法。
【請求項8】
メソッドのための前記ポーズレス活性化フレームは、前記メソッドにおける各ライブ・ポインタの値を保存するポインタ変数プリエンプション保存領域を含む、請求項1に記載の方法。
【請求項9】
請求項1ないし8のいずれかに記載の方法のステップの全てを実行するように適合された手段を含む、システム。
【請求項10】
コンピュータ・プログラムであって、前記コンピュータ・プログラムがコンピュータ・システム上で実行されると、請求項1ないし8のいずれかに記載の方法のステップの全てを実行するための命令を含む、コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本出願は、一般に、コンピュータ・メモリ管理の分野に関し、詳細には、高性能でタイム・クリティカルなアプリケーションのためのガベージ・コレクション・プロセスに関する。
【背景技術】
【0002】
コンピュータに関し、ガベージ・コレクションは、メイン・メモリ・ストレージの未使用エリアを識別するプロセスを指す。オブジェクト指向コンピューティング言語によれば、プログラムを実行するコンピュータは、オブジェクトのそれぞれにメモリをアロケートする。メモリは、アプリケーション要件に応じたサイズのブロック内のヒープにアロケートされ、またヒープから解放される。最終的にオブジェクトがプログラムによって参照されなくなった場合、作成されたオブジェクトにアロケートされたメモリは、ガベージ・コレクション・プロセスを通じて回収される。ガベージ・コレクション・プロセスは、メモリからオブジェクトをクリアし、これにより、一度アロケートされたメモリが、使用のために再び利用可能になる。より具体的には、ガベージ・コレクション・プロセスは、使用中のオブジェクトをマークすることによってメモリのどのブロックを解放できるかを自動的に決定すること、および、マークのないオブジェクトのメモリを回収することを含むことができる。このようなガベージ・コレクション・プロセスは、マーク・フェーズ中にメモリの有用な部分がライブ(live;有効)とマークされ、次に、スイープ・フェーズにおいて、マークのない全てのオブジェクトが、アロケートされたメモリから削除されることから、マーク・アンド・スイープと呼ばれることが多い。ガベージ・コレクションのプロセスは、メモリを解放するが、その予測不可能なプロセッサ時間の消費がアプリケーションの実行に影響を及ぼすようなアプリケーションにおいて問題となることがある。
【発明の概要】
【0003】
本発明は、請求項1に記載の方法、ならびに、対応するシステムおよびコンピュータ・プログラムを提供する。
【0004】
本文書の全体を通して説明される例は、以下の図面および説明を参照すると、より良く理解されるであろう。図中の構成要素は、必ずしも縮尺通りではない。さらに、図において、同様の参照番号は、異なる図の全体にわたって対応する部分を示す。
【図面の簡単な説明】
【0005】
図1】実例のマルチタスク・コンピュータ・システムを示す図である。
図2】プログラム・スタック、および、プログラム・スタックに記憶された典型的な活性化フレームのブロック図である。
図3】1つまたは複数の例によるポーズレスなガベージ・コレクションのためのポーズレス活性化フレームを示す図である。
図4】ポーズレスなガベージ・コレクションのためのスレッド・スタックのバックグラウンド・スキャンを行うための実例の方法のフローチャートである。
図5】アプリケーション・スレッドおよびガベージ・コレクション・スレッドによるスレッド・スタックのスキャンを協調させるための実例の方法のフローチャートである。
図6】バンガード・メソッドから戻ったときに呼出元の活性化フレームをスキャンし、新規なバンガード・メソッドを識別するための実例の方法のフローチャートである。
図7】プロセス・スレッドによってガベージ・コレクションのために行われるプログラム・スタック・スキャンの実例のシナリオの視覚的表現を示す図である。
【発明を実施するための形態】
【0006】
本発明の様々な実施形態が、関連する図面を参照しながら本明細書で説明される。本発明の代替実施形態は、本発明の範囲から逸脱することなく考案されることが可能である。様々な接続および位置関係(例えば、上(over)、下(below)、隣(adjacent)、等)が、以下の説明および図面における要素間に示される。これらの接続または位置関係あるいはその両方は、別途指定されない限り、直接または間接であることが可能であり、本発明は、この点において限定することを意図するものではない。したがって、エンティティの連結は、直接または間接の連結を指すことができ、エンティティ間の位置関係は、直接または間接の位置関係であることが可能である。さらに、本明細書で説明される様々なタスクおよび処理ステップは、本明細書で詳細に説明されない追加のステップまたは機能を有したより包括的な手順または処理に組み込まれることが可能である。
【0007】
以下の定義および省略形は、特許請求の範囲および本明細書の解釈のために使用されるためのものである。本明細書で使用されるように、用語「備える(comprises)」、「備えている(comprising)」、「含む(includes)」、「含んでいる(including)」、「有する(has)」、「有している(having)」、「包含する(contains)」、もしくは「包含している(containing)」、またはこれらの他の任意の変形形態は、非排他的な内包物を網羅することを意図する。例えば、要素のリストを含む構造、混合体、処理、方法、物品、または装置は、それらの要素のみに必ずしも限定されるわけではなく、明確にリスト化されていない、またはこのような構造、混合、処理、方法、物品、もしくは装置に固有の、他の要素を含むことができる。
【0008】
追加として、用語「例示的(exemplary)」は、「例、事例、または例証として提供すること(serving as an example, instance or illustration)」を意味するものとして本明細書で使用される。「例示的」として本明細書で説明されるいずれかの実施形態または設計は、他の実施形態または設計に対して好ましいまたは有利であると必ずしも解釈されない。用語「少なくとも1つ(at least one)」および「1つまたは複数(one or more)」は、1つ以上、すなわち1つ、2つ、3つ、4つ、等の任意の整数を含むものとみなされてもよい。用語「複数(a plurality)」は、2つ以上、すなわち2つ、3つ、4つ、5つ、等の任意の整数を含むものとみなされてもよい。用語「接続(connection)」は、間接「接続」および直接「接続」の両方を含むことができる。
【0009】
用語「約(about)」、「実質的に(substantially)」、「およそ(approximately)」、およびこれらの変形形態は、本出願時に利用可能な機器に基づく特定の量の測定値に関連付けられた誤差の度合いを含むことを意図するものである。例えば、「約」は、所与の値の±8%または5%または2%の範囲を含むことができる。
【0010】
簡潔さのために、本発明の態様を行うことおよび使用することに関連した従来の技法は、本明細書で詳細に説明されることもあれば、説明されないこともある。具体的には、本明細書で説明される様々な技術的特徴を実現するためのコンピューティング・システムおよび特定のコンピュータ・プログラムの様々な態様がよく知られている。したがって、簡潔さのために、多くの従来の実装形態の詳細は、本明細書で簡単に言及されるだけであり、または、よく知られたシステムまたは処理あるいはその両方の詳細を示すことなく全面的に省略される。
【0011】
図1を参照すると、CPU102、ユーザ・インターフェース106、ならびに、ストレージのためのランダム・アクセス・メモリ(RAM)および不揮発性メモリを含むメモリ108を有する典型的なマルチタスク・コンピュータ・システム100が示される。メモリ108は、管理されたランタイム環境110および1つまたは複数のプロセス112を記憶し、これらのそれぞれは、1つまたは複数のスレッドを含むことができる。システムにおける各アクティブ・プロセスは、コンピュータのメモリの一部を割り当てられ、これらは、プロセスによって実行されるアプリケーション・レベル・コード112を記憶するための空間、動的メモリ・アロケーションのために使用されるヒープ116、プロセスを実行している各スレッドの状態を表すための空間、および、各スレッドのプログラム・スタック114を記憶するための空間を含む。管理されたランタイム環境110は、実行中の複数のタスクのうちのどれにCPU時間を割くべきかを決めることを担うスケジューリング・スーパーバイザ148をさらに含む。典型的には、スケジューリング・スーパーバイザ148は、アプリケーション・プロセス・スレッドを実行することと、ガベージ・コレクション・スレッドを実行することとの間のトレードオフを比較検討しなければならない。さらに、管理されたランタイム環境110の中で、別々に開発された複数のアプリケーションが同時に動作することができる。
【0012】
各スレッドのプログラム・スタック114は、メモリ108の連続ページ内になくてもよく、連続していない場合、スタック・ストレージのページ、または場合によっては、それより大きい連続したチャンクは、既知の技法を使用して互いにリンクされる。プロセス112の中に複数のスレッドがあり、各スレッドは、それ独自のプログラム・スタック114を有するということに留意されたい。
【0013】
CPU102は、命令デコーダおよび実行ロジック122に命令を提供するための命令キャッシュ120を含む。CPU102は、プログラム・スタック114の一部を高速キャッシュ・メモリに記憶するためのスタック・キャッシュ124、および、データ値やオブジェクト参照128などを記憶するためのレジスタのセット126も含む。プログラム・スタック114は、スタック・キャッシュ124内の一部を含み、様々なデータ構造およびパラメータを一時的に記憶するために使用され、これらは、メソッドまたは他のプロシージャが起動されるたびにプログラム・スタック114上にプッシュされる活性化フレーム130(またはレコード)を含む。
【0014】
一定のガベージ・コレクション・フェーズの開始時に、ガベージ・コレクタは、ポインタのルート・セット132をスキャンする。図1は、ルート・セット132を単一ブロックとして描写するが、ルート・セット132は、マシン・レジスタおよび一定のグローバル・メモリ・ロケーションを含み、ルート・セットは、ルート・セットのスキャンを担うコンピュータ実行可能命令の一部としてガベージ・コレクタにおいてエンコードされることが可能であるということに留意されたい。ルート・セットは、有限数のマシン・レジスタおよびメモリ・ロケーションを表し、これらの集積は、プロセス112によって現在使用中の全てのオブジェクトへの間接アクセスを提供する。ポーズレスなガベージ・コレクション・システム(pause-less garbage collection system)において、ルート・セット132内の変数の数は非常に少なく、典型的には100未満である。ルート・セットは、個々のスレッド・スタックの内容も、全てのスレッド記述(thread description)の内容も含まない。むしろ、ルート・セットは、典型的には、全てのスレッド記述を追跡するデータ構造への参照を含む。各スレッド記述は、結果として、関連付けられたスレッド・スタックを追跡する。
【0015】
図1は、CPU102およびメモリに記憶された項目の簡素化された表現を描写するだけであるということが理解されよう。また、図1のメモリ108に示されるものと同じタイプの項目を含む独自のアドレス空間をそれぞれが有する複数のプロセスが、コンピュータ・システムで同時に実行していてもよいということが理解されよう。
【0016】
用語「オブジェクト」は、プログラムまたはプロセスによって作成された任意のデータ構造を意味するものと本明細書で定義される。用語「参照」および「オブジェクト参照」は、オブジェクトへのポインタを含むデータ構造を説明するために相互交換可能に使用される。用語「ポインタ」または「オブジェクト・ポインタ」は、時に、「参照」および「オブジェクト参照」と相互交換可能に使用されるが、オブジェクト参照は、ポインタの他に情報を含み得る。オブジェクト参照は、直接的または間接的であってもよい。直接オブジェクト参照は、オブジェクト・ヘッダを直接的に指すが、間接オブジェクト参照は、オブジェクト・ハンドルを指す。本明細書で使用されるように、用語「オブジェクト参照」は、両方のタイプを指す。
【0017】
ヒープ116に関連付けられたプロセス112が、配列または他のプログラム・「オブジェクト」を記憶するための空間を必要とするとき、メモリ・アロケータ・ルーチン140が、呼び出される/起動される。メモリ・アロケータ140は、ヒープ116内の未使用メモリのブロックをプロセス112にアロケートすることによって応答する。さらにメモリを要求すると、追加のメモリ・ブロックがアロケートされる。プロセス112がより多くのメモリを求め続けると、最終的にはヒープ116内の空間全てが使用されることになり、プロセス112は、メモリの不足のために停止する可能性がある。したがって、空間は、プログラムの明示的なアクションまたはその他のメカニズムのいずれかによって補充されなければならない。
【0018】
典型的には、プロセス112は、そのオブジェクトにアロケートされたメモリ空間の大部分を「放棄する」。典型的には、プロセス112は、アロケートされたメモリ・ブロックにプログラム・オブジェクトへの参照を記憶し、これらオブジェクトを処理し終えた後、再びそれらのオブジェクトにアクセスする必要がなくなるので一定のオブジェクトへの全ての参照を上書きする。参照(時にはポインタと呼ばれる)がないオブジェクトは、「アクセス不能オブジェクト」または「ガベージ」と称されることがあり、そのオブジェクトが占めるメモリ空間は、そのオブジェクトをかつて使用したプロセス112にとって「アクセス不能」である。
【0019】
この技術的問題は、プロセス112によってもはや使用されていないヒープ116内のメモリ空間のブロックを復旧させることによって対処される。ガベージ・コレクションは、ヒープ116内の未使用メモリを復旧させる自動的な方法を指すために使用される用語である。ガベージ・コレクタ142は、ヒープを使用するプロセス112がメモリを使い果たすことがないように、ヒープ116内のメモリの未使用部分または放棄部分を復旧させるために使用される。プログラミング言語の管理されたランタイム環境は、ガベージ・コレクタ142を含む。ガベージ・コレクタ142は、所定の期間の期限切れ、または、利用可能なヒープのある一定量の使用など、所定のイベントの発生時に未使用メモリを集めて、復旧させる。
【0020】
ガベージ・コレクタ142は、ストップ・アンド・コピー・ガベージ・コレクション技法などの種々のガベージ・コレクション方法の任意のものを使用することができる。この方式では、ヒープ116は、2分され、これらは半空間(semi-space)とも呼ばれ、プログラムは、一時に1つの半空間だけを使用する。ストップ・アンド・コピー・ガベージ・コレクタは、未使用メモリを回収し、(典型的には、from空間として識別される)古い半空間内の全ての「アクセス可能オブジェクト」を、(典型的には、to空間として知られる)他方の半空間内のメモリの連続ブロックにコピーし、アクセス可能オブジェクトへの全ての参照を、これらのオブジェクトの新しいコピーを指すように変更することによって、プロセス112によって使用されるプログラム・アクセス可能メモリを圧縮する。アクセス可能オブジェクトは、タスクの「ルート」または「ルート・セット」によって直接的または間接的に参照された任意のオブジェクト(すなわち、メモリのブロック)である。典型的には、ガベージ・コレクションに対するプロセス112のルート・セット132は、一定のマシン・レジスタ126および一定のグローバル変数など、既知のロケーションに記憶されたオブジェクト参照のセットであり、これらは、プロセス112によって使用されるオブジェクトを指す。それらのオブジェクトの多くは、次いで、プロセス112によって使用される他のオブジェクトへの参照を包含するであろう。ルート・セットから生じるオブジェクト参照のチェーンまたは有向グラフは、ヒープ116内のアクセス可能オブジェクトの全てを間接的に指す。
【0021】
全てのアクセス可能オブジェクトをヒープ116内のメモリの新しい連続ブロックにコピーし、次に、古いコピーの代わりに、オブジェクトの新しいコピーを使用することによって、ストップ・アンド・コピー・ガベージ・コレクタ142は、ヒープ116内の全ての未使用メモリ・ブロックを消去する。これは、タスクによって使用されるメモリ・ストレージも、アクセス可能オブジェクトの間に「ホール」がなくなるように「圧縮する」。圧縮は、タスクへのアロケーションのために利用可能なメモリの全てを連続ブロック内に入れることから、望ましい特性であり、これにより、アロケートされていない非常に多くの小さいメモリ・ブロックを追跡する必要がなくなる。圧縮は、仮想メモリの性能も改善する。
【0022】
ストップ・アンド・コピー・ガベージ・コレクションが本明細書で説明されるが、本明細書で説明される技術的解決策は、インクリメンタル・ガベージ・コレクション、または、使用中のオブジェクトを識別するために各スレッド・スタックの内容をスキャンしなければならない任意のガベージ・コレクション・システムなど、他の任意の技法をガベージ・コレクタ142が使用したとしても適用可能であり、スレッド活性化レコード内から作成されたオブジェクト参照の場所を素早くかつ効率的に突き止めることが必要な任意のトレース・ガベージ・コレクション・システムに適用可能であるということに留意されたい。ストップ・アンド・コピー・ガベージ・コレクションは、この技法が、コピー中にアプリケーションを停止させる間、(数百msから数十秒までの範囲の)非常に長いポーズを導入するので、ポーズレスなガベージ・コレクションには適していないということに留意されたい。インクリメンタル・マーク・アンド・スイープおよびインクリメンタル・コピー技法は、ポーズレスなガベージ・コレクションに、より適している。
【0023】
JAVA(登録商標)バイトコード・プログラムを実行するようにセットアップされたコンピュータ・システムの態様が図1にさらに示される。具体的には、このようなシステムの管理されたランタイム環境110は、指定されたJava(登録商標)バイトコード・プログラムが、一定の所定の整合性基準を満たすか否かを検証するためのバイトコード・プログラム検証器144を含む。管理されたランタイム環境110は、クラス・ローダ146をさらに含み、クラス・ローダ146は、オブジェクト・クラスをヒープにロードし、バイトコード・プログラム検証器144を利用して、各ロード済みオブジェクト・クラスに関連付けられたメソッドの整合性を検証する。1つまたは複数の例では、管理されたランタイム環境110は、Java(登録商標)バイトコード・プログラムを実行するためのバイトコード・プログラム・インタープリタ(図示せず)をさらに含む。命令デコーダおよび実行ロジック122が、Java(登録商標)バイトコード命令を実行するように設計される場合、バイトコード・プログラム・インタープリタは必要ではない。
【0024】
製造自動化の制御、電力管理、自律走行車両、テレコミュニケーション・インフラストラクチャ、および兵器システムを含む幅広い分野で、タイム・クリティカルなJava(登録商標)ソフトウェアが成功裏に展開されてきた。これらの成功裏に展開されたアプリケーションは、Java(登録商標)で実現されたリアル・タイム・アプリケーションが、Cで実現された同じアプリケーションよりも多くのCPUおよびメモリのリソースを必要としてきたとしても、Java(登録商標)の高度の恩恵が利用可能になり得ること、および、タイム・クリティカルな開発者によって貴重なものになることを実証する。Java(登録商標)は、大量(家庭用電化製品)にデプロイされない、大きく複雑でタイム・クリティカルなアプリケーションに最も適している。これらのアプリケーションに伴う、ソフトウェアの開発および保守と関連付けられたコストおよびリスクは、典型的には、ソフトウェアが展開されるコンピューティング・ハードウェアの総コストよりもはるかに大きい。これらは、CまたはC++に基づく旧式のアプローチと比較して、Java(登録商標)開発者が、新しい機能の実装の際に2倍の生産性、既存の機能の再使用、保守、および転用の際に10倍以上の生産性を発揮することが多いと認められる種類のアプリケーションである。
【0025】
タイム・クリティカルなJava(登録商標)技術の採用についての2つの技術的な障害は、(1)アプリケーション・スレッド112とガベージ・コレクション142との活動の間のきめの細かい協調のオーバヘッドに起因して、タイム・クリティカルなJava(登録商標)仮想マシンが、従来のJava(登録商標)仮想マシンよりもずっと遅く動作するということ、および、(2)従来のJava(登録商標)スレッド112のレスポンス・レイテンシが、リアル・タイムJava(登録商標)仮想マシンの最もレスポンスのよいものであっても、およそ200μsであるというものであった。これは、Cで書かれた類似スレッドの典型的なレスポンス・レイテンシよりもざっと20倍遅い。本明細書で説明される技術的解決策は、このような技術的課題に対処し、従来のJava(登録商標)に匹敵するスループット、および、Cで書かれたアプリケーションに匹敵するレスポンス・レイテンシを可能にする。したがって、本明細書で説明される技術的解決策は、Java(登録商標)プログラムの実行についてのコンピューティング技術に根ざす技術的課題に対処し、高性能でタイム・クリティカルなJava(登録商標)プログラムのためのポーズレスなガベージ・コレクションを容易にすることによってJava(登録商標)プログラムの実行を改善する。本明細書で説明される例はJava(登録商標)プログラムを使用するが、本明細書で説明される技術的解決策は、特にコンピュータ・プログラミング言語がメモリ管理のためにガベージ・コレクションを使用する場合、他の任意のコンピュータ・プログラミング言語、または、その組合せを使用して書かれたコンピュータ・プログラムに適用できるということに留意されたい。
【0026】
本明細書で説明されるポーズレスなガベージ・コレクション・システムのガベージ・コレクションの総労力(total garbage collection effort)は、プロセス112によって実行されるアプリケーション・コードの実行にインターリーブされる小さな増分(increment)の作業に分割される。信頼できる動作を保証するために、ガベージ・コレクションおよびアプリケーションの労力の増分ごとに、図5に示すように、測定できる前方向のプログレスをもたらす。さらに、Java(登録商標)オブジェクトがアプリケーションとガベージ・コレクション・スレッドとの間で共有されるので、ポーズレスなガベージ・コレクションは、データの一貫性を保証するためのプロトコルを使用する。ガベージ・コレクタ142がメモリをデフラグするためにオブジェクトをリロケートするたびに、プロセス112は、メモリ108内のオブジェクトの新しいロケーションを即座に認識するようになる。同様に、アプリケーション・スレッド、すなわちプロセス112が、既存のオブジェクトのポインタ・フィールドを上書きするたびに、または、現在実行中のメソッドの活性化フレーム内に包含されたポインタを上書きするたびに、ガベージ・コレクタ142は、オブジェクト接続性グラフ(object connectivity graph)のこの変化を、このことが「ガベージ」、すなわち、プロセス112によってもはや使用されていないメモリに対するガベージ・コレクタ142の認識を変化させる可能性があるとして、即座に認識する。
【0027】
Java(登録商標)アプリケーション開発者は、特殊な構文を使用して、スレッド間で共有されているオブジェクトをマークする。これは、コンパイラが非共有オブジェクトへのアクセスを最適化できるようにする。非共有オブジェクトの内容は、マシン・レジスタ126にキャッシュされることが可能であり、非共有オブジェクトへのアクセスには、キャッシュの一貫性を強制するメモリ・バリアは必要ない。Java(登録商標)コンパイラは、プライベート(非共有)オブジェクトのみを扱っているスレッドのための非常に効率的なコードを生成する。このような構文は、ガベージ・コレクタ142に可視になるオブジェクトを区別しない。一貫性を保証するコードを発行することがコンパイラの責任、および機会である。
【0028】
図2は、プログラム・スタック、および、プログラム・スタック上に記憶される典型的な活性化フレームのブロック図である。プログラム・スタック114は、両方のメソッド活性化フレーム(スタック・フレーム/活性化レコードとも呼ばれる。)を記憶する。中間計算評価データ(intermediate computational evaluation data)が、活性化フレーム内に記憶される。新しいメソッドまたはプロシージャが呼び出されるたびに、新しいスタック・フレームまたは活性化フレーム130が、スタック114上にプッシュされる。
【0029】
図2に描写されるように、実例の活性化フレーム130は、数ある要素の中でも、復帰アドレス・プログラム・カウンタ値を含む。活性化フレーム130は、前のフレーム・スタック・ポインタ値(すなわち、もしあれば、先行するスタック・フレームの始まりを指す)をさらに含む。活性化フレーム130は、呼び出されたプロシージャまたはメソッドに関連付けられたオペランド・パラメータ160,162をさらに含む。活性化フレーム130は、呼び出されたプロシージャまたはメソッドに関連付けられたローカル変数164,166をさらに含む。
【0030】
まださらに、プログラム・スタック114の使用を管理するために、いくつかのレジスタが使用される。例えば、スタック114のベースを指すベース・フレーム・ポインタ170、スタックの最上部(すなわち、スタックの未使用部分の開始)を指すトップ・オブ・スタック・ポインタ172、および、現行の活性化フレーム130の終わりを指す現行フレーム・ポインタ174を記憶するために、レジスタが使用される。
【0031】
1つまたは複数の例では、管理されたランタイム環境110は、プロセス112によって起動された各メソッドのための活性化フレーム130を、関連付けられたスレッド・スタック114に記憶するための命令を含む。従来の用語を使用して言い直すと、メソッドが起動されるか、または、プロシージャが呼び出されるたびに、活性化フレーム130がプログラム・スタック114上にプッシュされる。プロシージャが終了するたびに、データ・プロセッサは、現行の活性化フレーム130中の復帰アドレスPCにそのプログラム・カウンタPCをセットし、現行の活性化フレーム130は、プログラム・スタック114からポップされ、前回の活性化フレームが、新しい現行フレーム174になる。
【0032】
起動されているメソッドに依存して、活性化フレーム130内のパラメータ160、162およびローカル変数164、166のうちの1つまたは複数は、オブジェクト参照であってもよい。典型的には、活性化フレーム130内に、各定義されたメソッドのための固定数のパラメータ、および、固定数のローカル変数があり、活性化フレーム130内のパラメータおよび変数のそれぞれのための固定された所定のデータ型がある。典型的なデータ型は、長整数、短整数(16ビット符号付き整数)、単精度浮動小数点、倍精度浮動小数点、バイト、キャラクタ、および、(時に、オブジェクト・ハンドルと呼ばれる)オブジェクト参照を含む。
【0033】
ポーズレス活性化フレームにおいて、プロセス112と、ガベージ・コレクタ142を実行するスレッドとの間で共有されるローカル・ポインタ値を保持するために、各メソッドの活性化フレームの最上位アドレスから固定オフセットに、所定の空間が予約される。メソッドが実行している時間の大部分の間、ポインタ変数は、マシン・レジスタに保持される。実行スレッドをプリエンプションする前に、全てのライブ・ポインタ変数が、PointerVariablePreemptionSaveArea230に保存される。プリエンプションに次いで、ポインタ・レジスタの内容が、PointerVariablePreemptionSaveAreaから、保存された値を読み込むことによって、リストアされる。これらのポインタ値を記憶することおよびフェッチすることは、これらの命令が、アプリケーション・バイナリ・インターフェース(ABI:application binary interface)の既存命令に置き換わり、各関数呼び出しを取り巻く不揮発性レジスタを保存し、リストアするのでほぼフリーである。プリエンプション・セーフ・ポイントは、(典型的には、およそ1μsの実時間に相当する)一時に何百もの命令が協調オーバヘッドを必要とせずに実行されることが可能になるように構成される。PointerVariablePreemptionSaveAreaの維持は、これを維持するために行われる動作が、既に行われている動作と同等であるので、フリーでなかったとしても、実質的に低コストであり、本明細書で説明される技術的解決策を実現しても、さらなる実質的な計算コストを追加しない。
【0034】
ほとんどのポインタ・パラメータは、マシン・レジスタに渡され、ほとんどのローカル・ポインタ変数は、マシン・レジスタ内に同様に保持される。ポインタ・パラメータがメモリに渡される場合、コンパイラは、メソッドがプリエンプション要求に応じる前に、PointerVariablePreemptionSaveAreaのスロットにポインタ・パラメータの値をコピーするコードを生成する。ポインタ・ローカル変数がメモリ内で表現されなければならない場合、ローカル変数を表現するためにコンパイラによって予約されたスロットは、常にPointerVariablePreemptionSaveArea内から取得される。
【0035】
図3は、1つまたは複数の例によるポーズレスなガベージ・コレクションのためのポーズレス活性化フレームを描写する。ポーズレス活性化フレーム200は、Java(登録商標)メソッドを実行するように描写される。しかしながら、ポーズレス活性化フレーム200は、ガベージ・コレクションを使用する他の任意のコンピュータ・プログラミング言語に適用されることが可能であるということに留意されたい。ポーズレス活性化フレーム200は、図2を参照しながら説明された典型的な要素だけでなく、現在のポーズレス活性化フレーム200に関連付けられた現在のメソッドによって起動される次のメソッドへのオブジェクト参照210を含む。さらに、1つまたは複数の例では、ポーズレス活性化フレーム200は、現在の活性化フレーム200に関連付けられたメソッドが起動されたコンテキストを表す真の復帰アドレス・フィールド(TrueLRSave)220を含む。さらに、1つまたは複数の例では、現在のポーズレス活性化フレーム200は、ポインタ変数プリエンプション保存領域230への参照を含む。真の復帰アドレス220、およびプリエンプション保存領域230への参照は、関連付けられたメソッドがプリエンプション・ポイントを有していない場合、現在のポーズレス活性化フレーム200に記憶されなくてもよい。
【0036】
ポインタ変数プリエンプション保存領域230は、現在のポーズレス活性化フレーム200に関連付けられた第1のメソッドからのライブ・ポインタの全てが記憶されるメモリ・ロケーションの集合体である。1つまたは複数の例では、プリエンプション保存領域230は、ライブ・ポインタを記憶するための専用ロケーションを含む。第1のメソッド内の1つまたは複数のライブ・ポインタは、コード生成時にコンパイラ(図示せず)によって決定されることが可能である。
【0037】
図3は、プログラム・スタック114内の第2のポーズレス活性化フレーム205をさらに描写する。第2のポーズレス活性化フレーム205は、現在のポーズレス活性化フレーム200に関連付けられたメソッド(第1のメソッド)を起動した呼出元(第2の)メソッドに関連付けられる。第2のポーズレス活性化フレーム205は、フィールド210、220、および230も含む。
【0038】
第2のメソッドが、第1のメソッドを起動する用意ができているとき、まさに起動されようとしている第1のメソッドに関連付けられた記号情報を提供するMethodImplementationオブジェクトへの参照で、第2のメソッドの活性化フレーム205のInvokedMethodImplementationフィールド210を上書きする。この記号情報は、(リスキーな動作を要求するコードが信頼され得るものであることをコール・チェーンが確認した場合だけ、リスキーな動作を実行できるようにする)一定のセキュリティ管理機能をサポートするため、および、記号的なデバッグを容易にするため、すべてのスローされた例外に埋め込まれるスタック・トレース情報を提供するために使用される。ポーズレスなガベージ・コレクション環境において、MethodImplementationオブジェクト210は、各プリエンプション・ポイントにおけるPointerVariablePreemptionSaveArea220の状態も記述する。典型的なメソッドのプロローグおよびエピローグは、活性化フレームのTrueLRSaveまたはPointerVariablePreemptionSaveAreaフィールド220および230にアクセスしない。
【0039】
コード・ジェネレータまたはコンパイラ(図示せず)は、各メソッド起動がガベージ・コレクタ142によるプリエンプションをもたらすことができることを仮定する。したがって、各起動は、プリエンプション・ポイントとして扱われ、テーブル1におけるロジックによって記述されたアクションが伴う。
【0040】
【表1】
【0041】
各ポインタ変数が揮発性レジスタ126内に保持されると仮定すると、ライブ・ポインタを保存およびリストアするこの労力は、全ての呼出元が保存した(揮発性)レジスタ126に対してCコードなどの他のプログラミング言語によって既存のABIにおいて行われた本質的と同じ労力ある。
【0042】
このメソッド起動プロトコルの伝統的手法に起因して、不揮発性(呼出先が保存した)レジスタ126は、典型的には、ポインタ変数を表現するためにアロケートされない。これは、これらのコード生成の伝統的手法が、すべてのメソッド起動にわたって機能を停止したものとして各ポインタ変数を認識させるからである。本明細書で説明されるポーズレス活性化フレームを使用しない言語では、メソッド起動から戻ったときに特定のポインタ変数にリストアされた値は、起動前に保存されたものと全く同じ値である。しかしながら、ポーズレス活性化フレーム装置では、ポインタ変数にリストアされた値は、ポインタ変数プリエンプション保存領域に保存されたものと異なり得る。ガベージ・コレクタ142がメモリ断片化を減らすために参照されたオブジェクトをリロケートする場合、リストアされた値は、プリエンプション保存領域230に本来保存されていた値と異なり得る。さらに、ライブであるとみなされるポインタ変数のセット、および、ポインタ変数プリエンプション保存領域内に各ライブ・ポインタ変数を保存するための専用のスロットは、関数内の各プリエンプション・ポイントとは異なり得る。
【0043】
第1のメソッドが、他のメソッドのそのメソッド起動によって表されたよりも多くのプリエンプション・ポイントを必要とする場合、コード・ジェネレータは、明示的なプリエンプション・チェックをメソッドの本体に挿入する。明示的なプリエンプション・チェックを実現するコードは、テーブル2に示される。このスレッドがプリエンプションされる間に、ガベージ・コレクタ142がこのスレッドのスタックをスキャンし始める場合、ガベージ・コレクタ142は、プリエンプションされたメソッドについて、ポインタ変数プリエンプション保存領域230をスキャンし(434)、その後、このスレッドが実行を再開することが許可される(438)。プリエンプションされたメソッドは、バンガード・メソッドとして知られる。バンガード・メソッドのため、および、バンガード・メソッドから直接的または間接的に起動された任意のメソッドのためのポーズレス活性化フレームは、スキャンされる必要がない。バンガード・メソッドから制御が戻ると、アプリケーション・スレッドは、バンガード・メソッドの呼出元を実装するコードのいずれかを実行する前に、囲んでいる活性化フレームのポインタ変数プリエンプション保存領域を自動的にスキャンし、バンガード・メソッドの呼出元は、新たに識別されたバンガード・メソッドになる。
【0044】
【表2】
【0045】
プロセス112の現行のスレッドが、その次の明示的なプリエンプション・ポイントに達するまでコンテキスト・スイッチを遅延させると、レスポンス・レイテンシが増加するが、プリエンプション・ポイント間で実行するコードの効率を向上させることができる。ポーズレス活性化フレーム200を維持することは、ガベージ・コレクタ142が、典型的にはアプリケーションの実行時間の90%超のアイドルである間、非常に小さい実行オーバヘッドをプロセス112の実行スレッドに課す。実行時間中にポーズレス活性化フレーム200を維持することは、各スレッドのプログラム・スタック114を漸増的にスキャンしやすくすることによって、プロセス112のレスポンス・レイテンシを改善する。
【0046】
一般性を失うことなく、各アプリケーション・スレッドが、アプリケーション・スレッドのスタックのスキャン専用の単一のガベージ・コレクション・スレッドとペアになると仮定する。ペアになったスレッドは、単一のハードウェア・スレッド・コアへのアクセスを共有し、その結果、2つのスレッドのうちの1つだけが任意の特定の時間に実行することを許可されるようになる。2つのスレッド間のコンテキスト・スイッチは、アプリケーション・スレッドのためのコンパイラによって、および、ガベージ・コレクション・スレッドのための管理されたランタイム環境の開発者によって、予め決定された、指定されたプリエンプション・セーフ実行ポイントでのみ発生する。ガベージ・コレクタ142、および、プロセス112のアプリケーション・スレッドが、同時に同一スタックをスキャンしていないことを保証すると、同一活性化フレームの共有スロットに競合アクセスしないようにするロック・プロトコルを不要にする。アプリケーション・スレッドとガベージ・コレクション・スレッドとの間の代替の多対多のマッピングが、スレッド同期ロックの使用によって、または、関連付けられたガベージ・コレクション・スレッドが動いているのと同時にアプリケーション・スレッドが動くようにスケジューリングすることを慎重に避けるインテリジェント統合スレッド・スケジューラによって、実現され得る。
【0047】
図4は、タイム・クリティカルなアプリケーションのワークロードのバックグラウンドで同時に動いているガベージ・コレクション活動として、スレッド・スタックのポーズレスなスキャンを実行するための実例の方法のフローチャートを描写する。この方法の複数のインスタンス、プロセス112における各アクティブ・スレッドについて1つのインスタンスが、同時に動作することができる。方法は、プロセス112の一部として実行している、関連付けられたアプリケーション・スレッドと並行して作業するガベージ・コレクタ142のスレッドを含む。ガベージ・コレクタ142のスレッドは、ガベージ・コレクタ142がスキャンする意図を伝えたシステム100において実行中の1つのプロセス・スレッドのスタック114をスキャンする。典型的には、ガベージ・コレクタ142は、スレッド・スタック114を各スタックの最下位(より上位のメモリ・アドレス)から開始してスキャンし、その最上位に向けて作業する。スレッド・スタック114は、バックグラウンド活動としてスキャンされる。
【0048】
ガベージ・コレクタ142は、ガベージ・コレクションの前のフェーズが完了したことが理由で、または、メモリ・アロケーション・プールのサイズが特定の閾値より小さく縮小したことが理由で、または、ある一定のガベージ・コレクション・フェーズを始めるように以前にスケジューリングされた時間に到達したことが理由で、または、他の任意の所定の条件が理由で、スレッド・スタックをスキャンするべきときであると決定する。スタックがスキャンされる必要があるスレッドのそれぞれについて、ガベージ・コレクタ142は、図4で説明されたメソッドを実行する。各スレッド・スタック上の一番下の活性化フレームは、明示的なプリエンプション・ポイントを有しておらず、その活性化フレームのInvokedMethodImplementationフィールドの値以外にポインタを維持していない、単純なブートストラップ・メソッドに関連付けられると仮定される。
【0049】
スタックをスキャンするプロセス・スレッドをガベージ・コレクタが選択した時、ガベージ・コレクタは、アプリケーション・スレッドがプリエンプションされた状態であることを保証する。スレッドが最も最近プリエンプションされたときに動作していたプロセス・スレッド・メソッドが、バンガード・メソッドとして識別される。スキャンされることになる対応するプログラム・スタック114のためにプロセス・スレッドが選択されると、ガベージ・コレクタ142は、スキャンされる必要があるポーズレス活性化フレームの範囲を識別するために、関連付けられたスレッド記述子のscan_baseおよびscan_topフィールドをセットし(432)、バンガード・メソッドのポインタ変数プリエンプション保存領域230をスキャンし(434)、また、特殊なトランポリン関数のアドレスでバンガード・メソッドの復帰アドレスを上書きすることによって、独自のスタック・フレームのスキャンを支援することをプロセス112のプロセス・スレッドに通知する(436)。このセットアップ作業430の終わりに、ガベージ・コレクタ142は、必要であれば、アプリケーション・スレッドが実行し続けることを許可することに応じる。このセットアップ作業430を行うのに必要な時間は非常に短く、典型的には、1μsよりも短い。したがって、アプリケーション・スレッドのタイムリな実行へのガベージ・コレクタ142の干渉は、ポーズレスであるとみなされる。
【0050】
図5は、アプリケーション・プロセスとバックグラウンド・ガベージ・コレクションとの活動の間の交互に行われる労力の増分をスケジューリングするための実例の方法のフローチャートを描写する。プロセス112の実行中、ガベージ・コレクションは、ほとんどの時間、アイドルである。管理されたランタイム環境110の一部であるスレッド・スーパーバイザ148は、ガベージ・コレクタ142およびプロセス・スレッドによって実行されることになる作業の増分のスケジューリングを担う。ガベージ・コレクションがアイドルである場合(460)、または、アプリケーション・スレッドが、ガベージ・コレクタよりも緊急性高く動作する必要がある場合(462)、CPU時間の増分は、プロセス・スレッドの実行に割かれる(464)。ガベージ・コレクタの必要性がプロセス・スレッドよりも緊急性が高い場合(462)、CPU時間の増分は、ガベージ・コレクション活動に割かれる(468)。非常に高い優先度のプロセス112のスレッドが、新しいオブジェクトをアロケートできるようにヒープが補充されるのを待機している珍しいケースでは、ガベージ・コレクション活動は、待機中のプロセス・スレッドの高いスケジューリング優先度を継承する。最も一般的なシナリオは、ガベージ・コレクションが低い優先度で実行され、高い優先度のタイム・クリティカルなプロセス・スレッドが新しい作業を待っている時間中、ガベージ・コレクションをプロアクティブに実行することによって、メモリ不足条件が避けられる。プロセス・スレッドとガベージ・コレクション・スレッドの両方は、プリエンプション要求(466、470)に頻繁に応じ、その結果、新たに実行する準備ができた高い優先度のタスクが、その作業をタイムリに完了させるためにCPU102に迅速にアクセスすることができるようになる。
【0051】
リソースが許されれば、バックグラウンドのガベージ・コレクション・スレッドは、バックグラウンド活動としてスレッド・スタックをスキャンし続け、より高い優先度のプロセス112のスレッドがフォアグラウンドで動作することを可能にする。scan_baseがscan_topよりも大きい値を有すること(440)によって示されたように、スキャンされる必要があるポーズレス活性化フレームをスレッドが有している間に反復するループにおいて、ガベージ・コレクション・スレッドは、scan_baseポインタのすぐ下で見つかったポーズレス活性化フレームに属するPointerVariablePreemptionSaveAreaフィールドの内容をスキャンする(452)。この活性化フレームをスキャンした後、ガベージ・コレクタは、scan_base変数の値を調節し、スキャンされる必要がまだあるポーズレス活性化フレームの新しい範囲を反映する(454)。1つの活性化フレームをスキャンした後、このスレッド上に、スキャンされることになる活性化フレームがこれ以上ない場合(455)、ガベージ・コレクタは、バンガード・メソッドが戻るときのトランポリン・サブルーチンではなく、バンガード・メソッドの本来の呼出元に制御が戻ることになるように、スレッドの現行のバンガード・メソッドの呼出元のためのLRSaveフィールドを上書きする(456)。ガベージ・コレクタ142は、プリエンプション要求に頻繁に応じ、その結果、作業をタイムリに完了させるために、動作する準備ができているより高い優先度のプロセス・スレッドがCPU102に素早くアクセスできるようにする(458)。
【0052】
制御がバンガード・メソッドから戻るとき、特殊なハンドリングが行われる。バンガード・メソッドを元々起動したメソッドに、直接戻るのではなく、制御は、特殊なトランポリン・サブルーチンに代わりに戻り、これは、図6に示されたフローチャートによって表される。トランポリン・サブルーチンは、呼出元の活性化フレームがバックグラウンドのガベージ・コレクション・スレッドによって既にスキャンされたかどうかをチェックする(480)。呼出元のフレームがまだスキャンされていない場合、トランポリン・サブルーチンは、活性化フレーム482をスキャンし、スレッド記述子のscan_top変数の値を調節し、新たにスキャンされた活性化フレームを、新たに選択されたバンガード・メソッドに属するものとしてを識別する。
【0053】
新たに選択されたバンガード・メソッドの活性化フレームをトランポリン・サブルーチンがスキャンする場合、トランポリン・サブルーチンは、新たに選択されたバンガード・メソッドの呼出元の活性化フレームもスキャンされる必要があるかどうかをさらにチェックする(486)。必要がある場合、トランポリン・サブルーチンは、呼出元のポーズレス活性化フレームのLRSaveおよびTrueLRSaveフィールドを上書きすること(488)によって、新たに選択されたバンガード・メソッドから制御が戻るときに、その活性化フレームがスキャンされるように構成する。
【0054】
トランポリン・サブルーチンによって行われる最終的なアクションは、新たな現行の活性化フレームのTrueLRSaveフィールド内に保持されたアドレスに分岐することによって、以前に実行していたメソッドの呼出元に制御を戻すことになる。
【0055】
プログラム・スタック114がスキャンを始めた後にプロセス・スレッドによって起動されたメソッドの活性化フレームは、スキャンされない。図7は、プロセス・スレッドによってガベージ・コレクションのために行われるプログラム・スタック・スキャンの実例のシナリオの視覚的表現を示す。プログラム・スタック114は、ガベージ・コレクタ142によってスキャンされたポーズレス活性化フレーム510を含む。ポーズレス活性化フレーム510は、さらなるメソッドを呼び出したメソッドに関連付けられ、これらの実行から戻るために、呼び出されたメソッド上で待っている。さらに呼び出されたメソッドは、ポーズレス活性化フレーム200に関連付けられたバンガード・メソッドを含み、バンガード・メソッドは、呼出元のポーズレス活性化フレーム205に関連付けられた呼出元メソッドによって呼び出される。さらに、プログラム・スタック114は、バンガード・メソッドによって、および、バンガード・メソッドの後で、呼び出されたメソッドに対応するポーズレス活性化フレーム530を含む。メソッドが呼び出される順序は、対応するポーズレス活性化フレームがプログラム・スタック114上にプッシュされる順序によって表される。
【0056】
並行して、ガベージ・コレクタ142は、450において、ガベージ・コレクタ142がスキャンする意図を伝えたプロセス・スレッドからの1つまたは複数のメソッドのポーズレス活性化フレーム510をスキャンする。例えば、スキャンは、プロセス・スレッドの実行と同時にバックグラウンド活動として行われる。
【0057】
したがって、ガベージ・コレクタ142は、プロセス・スレッドを使用してインクリメンタル・スタック・スキャンを行い、ここで、プロセス・スレッドは、ガベージ・コレクタ142がスタック114内の他のポーズレス活性化フレームをスキャンするのと実質的に同時に、1つまたは複数のポーズレス活性化フレームをスキャンする。本明細書で説明されるように、スタック114は、複数のポーズレス活性化フレームを含み、各フレームは、コンピュータ・システム100によって実行されたコンピュータ・プログラムからのそれぞれのメソッド起動に対応する。言い換えれば、プロセス112における各メソッド起動は、プロセス112を実行しているスレッドのプログラミング・スタック114内に対応するポーズレス活性化フレーム200を作成する。各プロセス・スレッドは、1つまたは複数の例において、それ独自のプログラミング・スタック114を有する。メソッド、例えばメソッド-3(図7)が、別のメソッド、例えばメソッド-4(図5)を呼び出すと、メソッド-3は、メソッド-4から制御が戻るまで動かない。しかしながら、メソッド-3の活性化フレームは、「ライブ」ポインタをまだ包含している可能性がある。したがって、ガベージ・コレクタ142は、メソッド-4のポーズレス活性化フレーム200(バンガード活性化フレーム)、および、メソッド-3のポーズレス活性化フレーム205(呼出元活性化フレーム)をスキャンしなければならない。スキャンは、ライブ・ポインタを識別するために行われ、ライブ・ポインタがガベージ・コレクションによって処理されることが可能になる。メソッド-4は、次に、メソッド-5などの他のメソッドを起動すること/呼び出すことができ、メソッド-5は、次に、メソッド-6を呼び出す。それに応じて、ガベージ・コレクタ142は、ライブ・オブジェクトを連続した位置にリロケートし、ライブ・オブジェクトの間で見つかった未使用のオブジェクトが単一の大きいフリー・セグメントに合体させられることが可能になる。これは、その後のメモリ・アロケーション動作をより一層効率的なものにする。さらに、上述のシナリオにおいて、メソッド-6を呼び出すメソッド-5をメソッド-4が呼び出すと、メソッド-6が現在のメソッドであることから、メソッド-4はもはや「現在の」メソッドではないということに留意されたい。メソッド-4は、スタック・スキャン中の「最前部の」メソッドであるので、まだバンガード・メソッドである。バンガード・メソッドから呼び出された他のメソッドは、スキャンされる必要がない。バンガード・メソッドのフレームはスキャンされたが、バンガード・メソッドは、まだスキャンに含まれている。
【0058】
本明細書で説明されるように、メソッド-5およびメソッド-6に対応するポーズレス活性化フレーム530は、この場合、メソッド-4の起動であったプリエンプション・ポイントの後で開始されるので、スキャンされることはない。この例において、ガベージ・コレクタ142は、スタック114の最下位からスキャンを開始し、メソッド-1のためのポーズレス活性化フレームの後、メソッド-2のためのポーズレス活性化フレームが続く(510)。同時に、プロセス・スレッドは、バンガード・メソッドから制御が戻るときに、バンガード・メソッドの呼出元であるメソッドに属する、以前スキャンされていない活性化フレームをスキャンすることを担う。ガベージ・コレクタ142がメソッド-3のための活性化フレームをスキャンする前にバンガード・メソッドが戻る場合、メソッド-3のためのポーズレス活性化フレーム205は、バンガード・メソッドが、その呼出元の活性化フレームのLRSaveフィールド220に示されたアドレスに戻るときに、制御が流れるトランポリン・サブルーチン(図6)によってスキャンされる(482)。代替として、ガベージ・コレクタは、バンガード・メソッドからプロセス・スレッドが戻る前に、メソッド-3のための活性化フレームをスキャンすることができる(452)。プロセス・スレッドがバンガード・メソッドから戻る時間までに、ガベージ・コレクタ142がメソッド-3のためのポーズレス活性化フレーム205を既にスキャンしていた場合、プロセス・スレッドは、再びスキャンを行わない。この状況が発見されると、ポーズレス活性化フレームの同時スキャンは、完了しているとみなされる。
【0059】
ガベージ・コレクタ142によってポーズレス活性化フレームをスキャンすることは、スキャンされる各活性化フレームについて、現行のライブ・ポインタを見つけることを含む。図4を再び参照すると、ガベージ・コレクタ142は、434において、呼出元の活性化フレーム205からInvokedMethodImplementationフィールド210の値をフェッチすることによって、活性化フレームのPointerVariablePreemptionSaveAreaの現行の状態を記述したMethodImplementationオブジェクトを見つけることによって、ポーズレス活性化フレーム200のライブ・ポインタを見つける。ポーズレス活性化フレーム205におけるInvokedMethodImplementationフィールド210は、メソッド-3によって最も最近起動されたメソッドを記述したMethodImplementationオブジェクトのアドレスを記憶する。さらに、バンガード・メソッドのポーズレス活性化フレーム200のLRSaveフィールド220の値は、434において、PointerVariablePreemptionSaveArea230内のどのスロットが、この特定のプリエンプション・ポイントに対するライブ・ポインタを保持するかを判定するために、MethodImplementationオブジェクト内に記憶された情報と組み合わせて使用される。
【0060】
455において、ガベージ・コレクタ142のスキャンの労力(450)は、プロセス・スレッド自身のスキャンの労力と最終的に交わる。ガベージ・コレクタ142は、スレッド・スタックの全てのポーズレス活性化フレームがスキャンされたことを識別すると、455および456において、そのポーズレス活性化フレームのLRSave240フィールドを、そのTrueLRSaveフィールド220の現行の内容で上書きする。この時点で、ガベージ・コレクタ142は、プロセス・スレッドのスタック114が完全にスキャンされたものとみなす。さもなければ、ガベージ・コレクタ142は、プログラミング・スタック114内の他のポーズレス活性化フレーム205をスキャンし続ける。一般に、ガベージ・コレクタ142は、全てのプロセス・スレッドのスタック114が完全にスキャンされるまで、ガベージ・コレクタ142の現行の動作フェーズを完了させることができない。
【0061】
本明細書で説明される技術的解決策は、Java(登録商標)のようなコンピュータ・プログラミング言語でのポーズレスなガベージ・コレクションを容易にする。ポーズレスなガベージ・コレクションは、ポーズレス活性化フレームによって容易にされる。ポーズレス活性化フレームは、MethodImplementationオブジェクト・ポインタを含む、プロセス・スレッドとガベージ・コレクション・スレッドとの間で共有されるローカル・ポインタ値を保持するために、最上位に固定空間を含む。プロセス・スレッドは、コンパイラによって確立されたプリエンプション・セーフ・ポイントにおけるローカル・ポインタ値を記憶し、フェッチする。各メソッド起動(method invocation)は、プリエンプション・ポイントとして扱われる。プロセス・スレッドは、特定のプロセス・スレッドのバンガード・メソッドから戻るときに、呼出元の活性化フレームをスキャンすることによってガベージ・コレクションを支援する。MethodImplementationオブジェクト・ポインタは、例外に組み込まれることが可能なスタック・トレース情報を提供する。MethodImplementationオブジェクトは、各プリエンプション・ポイントにおける「ポインタ変数プリエンプション保存領域」の状態を記述する。
【0062】
したがって、本明細書で説明される技術的解決策は、インクリメンタル・スタック・スキャンに基づくポーズレスなガベージ・コレクションを使用して、高性能でタイム・クリティカルなアプリケーションを実現するための、ガベージ・コレクション・コンピュータ・プログラミング言語への改善を容易にする。本明細書で説明される技術的解決策は、本明細書で説明されるようなポーズレス活性化フレームを使用してポーズレスなガベージ・コレクションを行うことによって、従来のスレッドの実質的に10%以内でタイム・クリティカルなアプリケーション・スレッドのパフォーマンスを容易にし、10μsという短いプリエンプション・レイテンシを達成することができる。
【0063】
本技術的解決策は、統合の任意の可能な技術的に詳細なレベルにおけるシステム、方法、またはコンピュータ・プログラム製品、あるいはその組合せであってもよい。コンピュータ・プログラム製品は、本技術的解決策の態様をプロセッサに行わせるためのコンピュータ可読プログラム命令を有するコンピュータ可読記憶媒体(または複数の媒体)を含むことができる。
【0064】
コンピュータ可読記憶媒体は、命令実行デバイスによる使用のための命令を保持し、記憶することができる有形デバイスであることが可能である。コンピュータ可読記憶媒体は、例えば、電子ストレージ・デバイス、磁気ストレージ・デバイス、光ストレージ・デバイス、電磁気ストレージ・デバイス、半導体ストレージ・デバイス、または前述の任意の適切な組合せであってよいがこれらに限定されない。コンピュータ可読記憶媒体のより具体的な例の非網羅的なリストは、ポータブル・コンピュータ・ディスケット、ハードディスク、ランダム・アクセス・メモリ(RAM)、リード・オンリ・メモリ(ROM)、消去可能プログラマブル・リード・オンリ・メモリ(EPROMまたはフラッシュ・メモリ)、スタティック・ランダム・アクセス・メモリ(SRAM)、ポータブル・コンパクト・ディスク・リード・オンリ・メモリ(CD-ROM)、デジタル多用途ディスク(DVD)、メモリ・スティック、フロッピー(登録商標)・ディスク、命令が記録されたパンチ・カードまたは溝内隆起構造などの機械的にエンコードされたデバイス、および前述の任意の適切な組合せを含む。コンピュータ可読記憶媒体は、本明細書で使用されるように、電波もしくは他の自由に伝搬する電磁波、導波路もしくは他の伝送媒体を通じて伝搬する電磁波(例えば、光ファイバ・ケーブルを通過する光パルス)、またはワイヤを通じて伝送される電気信号などの、本質的に一過性の信号であると解釈されるべきではない。
【0065】
本明細書で説明されるコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体からそれぞれのコンピューティング・デバイス/処理デバイスに、あるいは、例えば、インターネット、ローカル・エリア・ネットワーク、広域ネットワーク、もしくはワイヤレス・ネットワーク、またはその組合せといった、ネットワークを介して外部コンピュータまたは外部ストレージ・デバイスにダウンロードされることが可能である。ネットワークは、銅伝送ケーブル、光伝送ファイバ、ワイヤレス伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイ・コンピュータ、またはエッジ・サーバ、あるいはその組合せを含むことができる。各コンピューティング・デバイス/処理デバイス内のネットワーク・アダプタ・カードまたはネットワーク・インターフェースは、ネットワークからコンピュータ可読プログラム命令を受け取り、それぞれのコンピューティング・デバイス/処理デバイス内のコンピュータ可読記憶媒体に記憶させるためにコンピュータ可読プログラム命令を転送する。
【0066】
本技術的解決策の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、インストラクション・セット・アーキテクチャ(ISA)命令、機械語命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、集積回路機器のための構成データ、または、Smalltalk(登録商標)、C++、もしくは同様のものなどのオブジェクト指向プログラミング言語、および、「C」プログラミング言語もしくは類似のプログラミング言語などの手続き型プログラミング言語を含む1つもしくは複数のプログラミング言語の任意の組合せで書かれたソース・コードもしくはオブジェクト・コードのいずれかであってもよい。コンピュータ可読プログラム命令は、スタンド・アロンのソフトウェア・パッケージとして、全面的にユーザのコンピュータ上で、部分的にユーザのコンピュータ上で実行することができ、部分的にユーザのコンピュータ上かつ部分的にリモート・コンピュータ上で、または全面的にリモート・コンピュータもしくはサーバ上で実行することができる。後者のシナリオにおいて、リモート・コンピュータは、ローカル・エリア・ネットワーク(LAN)、もしくは広域ネットワーク(WAN)を含む任意のタイプのネットワークを通じてユーザのコンピュータに接続されてもよく、または、接続は、(例えば、インターネット・サービス・プロバイダを使用してインターネットを通じて)外部コンピュータに対して行われてもよい。いくつかの実施形態において、例えば、プログラマブル・ロジック回路機器、フィールド・プログラマブル・ゲート・アレイ(FPGA)、またはプログラマブル・ロジック・アレイ(PLA)を含む電子回路機器は、本技術的解決策の態様を行うために、コンピュータ可読プログラム命令の状態情報を利用して電子回路機器を個別化することによって、コンピュータ可読プログラム命令を実行することができる。
【0067】
本技術的解決策の態様は、技術的解決策の実施形態による方法、装置(システム)、およびコンピュータ・プログラム製品のフローチャートまたはブロック図あるいはその両方を参照しながら本明細書で説明される。フローチャートまたはブロック図あるいはその両方の各ブロック、ならびに、フローチャートまたはブロック図あるいはその両方におけるブロックの組合せは、コンピュータ可読プログラム命令によって実装されることが可能であるということが理解されよう。
【0068】
これらのコンピュータ可読プログラム命令は、コンピュータまたは他のプログラム可能データ処理装置のプロセッサを介して実行する命令が、フローチャートまたはブロック図あるいはその両方の1つまたは複数のブロックに指定された機能/動作を実装するための手段を作り出すべく、汎用コンピュータ、専用コンピュータ、または他のプログラム可能データ処理装置のプロセッサに提供されてマシンを生産するものであってよい。これらのコンピュータ可読プログラム命令は、命令が記憶されたコンピュータ可読記憶媒体が、フローチャートまたはブロック図あるいはその両方の1つまたは複数のブロックに指定された機能/動作の態様を実装する命令を含む製品を備えるべく、コンピュータ可読記憶媒体にさらに記憶され、コンピュータ、プログラム可能データ処理装置、または他のデバイス、あるいはその組合せに特定の手法で機能するように指図できるものであってもよい。
【0069】
コンピュータ可読プログラム命令は、コンピュータ、他のプログラム可能装置、または他のデバイス上で実行する命令が、フローチャートまたはブロック図あるいはその両方の1つまたは複数のブロックに指定された機能およびアクションを実装するべく、コンピュータ実装処理を生み出すために、コンピュータ、他のプログラム可能データ処理装置、または他のデバイスにさらにロードされ、コンピュータ、他のプログラマブル装置、または他のデバイスで一連の動作ステップを実行させるものであってもよい。
【0070】
図中のフローチャートおよびブロック図は、本技術的解決策の様々な実施形態によるシステム、方法、およびコンピュータ・プログラム製品の可能な実装形態のアーキテクチャ、機能、および動作を示す。この点に関して、フローチャートまたはブロック図の中の各ブロックは、指定された1つまたは複数の論理機能を実装するための1つまたは複数の実行可能命令を含む命令のモジュール、セグメント、または一部を表すことができる。いくつかの代替実装形態において、ブロックに記された機能は、図に記された順序とは異なる順序で発生してもよい。例えば、連続して示された2つのブロックは、実際には、実質的に並行に実行されてもよく、または、ブロックは、時には、含まれる機能に応じて逆の順序で実行されてもよい。ブロック図またはフローチャートあるいはその両方の各ブロック、および、ブロック図またはフローチャートあるいはその両方におけるブロックの組合せは、指定された機能もしくは動作を行う、または、特殊用途のハードウェアとコンピュータ命令の組合せを行う特殊用途のハードウェア・ベースのシステムによって実装されることが可能であるということにも留意されたい。
【0071】
第2のアクションは、第2のアクションが第1のアクションから直接的に生じるか、間接的に生じるかに関係のなく、第1のアクション「に応答して(in response to)」のものであると言うことができる。第2のアクションは、第1のアクションよりもかなり後で発生してもよく、まだ第1のアクションに応答してもよい。同様に、第2のアクションは、介在するアクションが第1のアクションと第2のアクションとの間に起こったとしても、また、介在するアクションのうちの1つまたは複数が、直接的に第2のアクションを行わせたとしても、第1のアクションに応答してのものであると言うことができる。例えば、第2のアクションは、第1のアクションがフラグをセットし、フラグがセットされるたびに、第3のアクションが後で第2のアクションを開始する場合、第1のアクションに応答してのものであってもよい。
【0072】
使用目的を明らかにし、これによって公衆に通知するために、句「<A>、<B>、...および<N>のうちの少なくとも1つ(at least one of <A>, <B>, ...and <N>)」または「<A>、<B>、...<N>のうちの少なくとも1つ、またはこれらの組合せ(at least one of <A>, <B>, ... <N>, or combinations thereof)」または「<A>、<B>、...および/または<N>(<A>,<B>, ... and/or <N>)」は、最も広い意味で解釈されるべきであり、明確に反対の主張が示されない限り、上文または下文において示された他の任意の定義に取って代わり、A、B、...およびNを含むグループから選択された1つまたは複数の要素を意味する。言い換えれば、これらの句は、要素A、B、...またはNのうちの1つまたは複数の任意の組合せを意味し、任意の1つの要素を単独で含むか、または、挙げられていない追加要素を組み合わせてさらに含むことができる他の要素のうちの1つまたは複数と1つの要素を組み合わせて含む。
【0073】
命令を実行する本明細書で例示された任意のモジュール、ユニット、構成要素、サーバ、コンピュータ、端末、またはデバイスは、例えば、磁気ディスク、光ディスク、もしくはテープといった、記憶媒体、コンピュータ記憶媒体、もしくはデータ・ストレージ・デバイス(取外し可能もしくは取外し不能またはその両方)などのコンピュータ可読媒体を含んでもよい、あるいはそうでなければ、コンピュータ可読媒体にアクセスできてもよいということも正しく認識されよう。コンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラム・モジュール、または他のデータなどの情報の記憶のための任意の方法または技術で実現される揮発性および不揮発性の、取外し可能および取外し不能な媒体を含んでもよい。このようなコンピュータ記憶媒体は、デバイスの一部、または、デバイスにアクセス可能もしくは接続可能なものであってもよい。本明細書で説明される任意のアプリケーションまたはモジュールは、このようなコンピュータ可読媒体によって記憶、またはそうでなければ保持され得るコンピュータ可読命令/実行可能命令を使用して実現されてもよい。
図1
図2
図3
図4
図5
図6
図7