(57)【特許請求の範囲】
【請求項１】
オブジェクトの記憶特性についての情報を管理する方法であって、コンピュータによって実行される
オブジェクトをメモリに記憶するステップと、
リファレンスのベースアドレス部にメモリ内のオブジェクトの位置を記憶することによって、オブジェクトへのリファレンスを作成するステップと、
リファレンスのタグ部に、オブジェクトの記憶特性についての情報をストアするステップとを含み、
前記オブジェクトの記憶特性についての情報は、
（ａ）  前記オブジェクトの生存期間についての情報、
（ｂ）  前記オブジェクトの中に含まれる、リファレンスのフォーマットについての情報、および
（ｃ）  前記オブジェクトの連続性についての情報
の少なくとも１つを含み、
リファレンスのタグ部はアドレス部のビットより下位の、リファレンスの１つ以上のビットを含む、方法。
【請求項２】
前記オブジェクトをメモリに記憶するステップは、Ｎビットの整列アドレスにオブジェクトを記憶するステップを含む、請求項１に記載の方法。
【請求項３】
タグ部は、リファレンスのＮ個の最下位ビットである、請求項２に記載の方法。
【請求項４】
タグ部に、オブジェクトの生存期間を記憶するために、タグ部に、オブジェクトが少なくとも所定の数のごみ回収イベントだけ生存したかどうかを示す情報を記憶するステップを含む、請求項２に記載の方法。
【請求項５】
オブジェクトは、第２のオブジェクトへの内的リファレンスを含み、さらに
タグ部に、オブジェクト内に含まれる内的リファレンスのフォーマットについての情報を記憶するステップを含む、請求項１に記載の方法。
【請求項６】
タグ部に、オブジェクト内に含まれる内的リファレンスのフォーマットについての情報を記憶するステップは、タグ部に、含まれるリファレンスはマシンポインタとして、または数値リファレンスとして記憶されているかどうかを示す情報を記憶するステップを含む、請求項５に記載の方法。
【請求項７】
タグ部に、オブジェクトが複数のページに記憶されているかどうかを示す情報を記憶するステップを含む、請求項１に記載の方法。
【請求項８】
タグ部に、オブジェクトが複数のページに記憶されているかどうかを示す情報を記憶するステップは、タグ部に、オブジェクトは他のページに連続しない少なくとも１つのページに記憶されているかどうかを示す情報を記憶するステップを含む、請求項７に記載の方法。
【請求項９】
リファレンスのタグ部に、オブジェクトの記憶特性についての情報を記憶するステップは、タグ部に、（ａ）オブジェクトの生存期間およびオブジェクトに含まれるリファレンスは第１のフォーマットで記憶されていることの両方を示す情報、または（ｂ）オブジェクトの連続性およびオブジェクトに含まれるリファレンスは第１のフォーマット以外の第２のフォーマットで記憶されていることの両方を示す情報のどちらかを記憶するステップを含む、請求項１に記載の方法。
【請求項１０】
複数のオブジェクトのメモリを管理する方法であって、コンピュータによって実行される
オブジェクトを第１のメモリ領域に割当てるステップと、
前記複数のオブジェクトのうちの一部のオブジェクトについてのそれぞれが存続している期間を示す生存期間に基づいて、前記複数のオブジェクトのうちの一部のオブジェクトを第１のメモリ領域から第２のメモリ領域に移動させるステップと、
第２のメモリ領域におけるどの第２のオブジェクトが第１のメモリ領域の第１のオブジェクトを参照するかについてのメモリ内のオブジェクトの参照関係を記録するためのデータ構造を記憶するステップとを含み、この記憶するステップは、
メモリポインタをデリファレンスすることなく、第１のオブジェクトへの第１のリファレンス内に含まれる第１の情報および第２のオブジェクトへの第２のリファレンス内に含まれる第２の情報に基づき、第１のオブジェクトが第１のメモリ領域に割当てられているかどうかおよび第２のオブジェクトが第２のメモリ領域に割当てられているかどうかを決定することにより行なわれ、
第１のメモリ領域および第２のメモリ領域のどちらかはそれぞれ複数の不連続ページを含む、方法。
【請求項１１】
メモリポインタをデリファレンスすることなく、第１のオブジェクトへの第１のリファレンスおよび第２のオブジェクトへの第２のリファレンスに基づいて第１のオブジェクトが第１のメモリ領域に割当てられているかどうかおよび第２のオブジェクトが第２のメモリ領域に割当てられているかどうかを決定するステップは、
第１のリファレンスから第１の１つ以上のビットを抽出するステップを含み、前記第１の１つ以上のビットは、第１のオブジェクトのアドレスを記憶するためのビットより下位であり、さらに
第２のリファレンスから第２の１つ以上のビットを抽出するステップを含み、前記第２の１つ以上のビットは、第１のオブジェクトのアドレスを記憶するためのビットより下位であり、さらに
第１の１つ以上のビットおよび第２の１つ以上のビットに基づき、第１のオブジェクトが第１のメモリ領域に割当てられているかどうかおよび第２のオブジェクトが第２のメモリ領域に割当てられているかどうかを決定するステップを含む、請求項１０に記載の方法。
【請求項１２】
第１の１つ以上のビットおよび第２の１つ以上のビットに基づいて第１のオブジェクトが第１のメモリ領域に割当てられているかどうかおよび第２のオブジェクトが第２のメモリ領域に割当てられているかどうかを決定するステップは、所定の不一致について第１の１つ以上のビットおよび第２の１つ以上のビットを比較するステップを含む、請求項１１に記載の方法。
【請求項１３】
第１のリファレンスの第１の１つ以上のビットを抽出するステップは、第１のリファレンスの１つ以上の下位ビットを抽出するステップを含み、さらに
第１のリファレンスの第２の１つ以上のビットを抽出するステップは、第２のリファレンスの１つ以上の下位ビットを抽出するステップを含む、請求項１１に記載の方法。
【発明の詳細な説明】
【０００１】
【関連出願】
本出願は以下の出願に関連している。
【０００２】
Harlan Sextonらによって同日に出願された、「実行時環境内におけるマシンと独立したメモリ管理システム」と題される、米国特許出願第０９／２４８，２９１号（書類番号５０２７７−１７２；ＯＩＤ−１９９７−４８−０２）。ここに引用により援用される。
【０００３】
Harlan Sextonらによって同日に出願された、「実行時環境内における不変リファレンスのアドレス計算」と題される、米国特許出願第０９／２４８，２９４号（書類番号５０２７７−１７９；ＯＩＤ−１９９７−４８−０３）。ここに引用により援用される。
【０００４】
Harlan Sextonらによって同日に出願された、「実行時環境内におけるページングメモリ管理システム」と題される、米国特許出願第０９／２４８，２９７号（書類番号５０２７７−２６１；ＯＩＤ−１９９７−４８−１７）。ここに引用により援用される。
【０００５】
【発明の分野】
本発明はコンピュータシステムに関し、より特定的には実行時環境に対するメモリの管理に関する。
【０００６】
【発明の背景】
ジャバ（登録商標）（JAVA(R)TM）のような言語に対する動的実行時環境において、オブジェクトのメモリ管理は非常に重要である。具体的には、動的実行時環境ではオブジェクトに対するメモリの割当および割当解除を処理しなければならない。オブジェクトとはデータをカプセル化するエンティティであり、JAVA(R)のような環境ではオブジェクトに関連する動作を含む。
【０００７】
オブジェクトを作成する場合、ある量のメモリをオブジェクトに割当てなければならない。オブジェクトが不要になれば、他の目的のために再使用できるようオブジェクトのメモリは割当解除されなければならない。メモリの割当解除はＣプログラミング言語の場合のように手作業で行なうことができるし、「ごみ回収器」を使えば自動的に処理できる。ごみ回収器にはさまざまな種類がある。たとえば、世代別ごみ回収器はオブジェクトをその生存期間によって区別する。なぜなら最近割当てられたオブジェクトは一般に生存期間が短いオブジェクトだからである。世代別ごみ回収器の一実施例において、オブジェクトは「古いスペース」および「新しいスペース」と呼ばれる少なくとも２つのメモリ領域の一方に記憶される。オブジェクトを初めて作成した場合、オブジェクト用のメモリは新しいスペースから割当てられる。オブジェクトがある時間、たとえば新しいスペースでの４つのスキャベンジを経て生存していると、「保有権がある」として古いスペースに移動させられる。
【０００８】
オブジェクトに異なるメモリ領域を使用し、異なる領域はそこに含まれるオブジェクトの生存期間によって区別することにより、世代別ごみ回収器はメモリ領域に対して異なる割当およびゴミ回収方法を用いることができる。たとえば、新しいスペースは頻繁に割当てられかつ捨てられるオブジェクトを多く持つ傾向にあるので、新しいスペース内でのメモリ割当は好ましくは、「辺境コンシング」(frontier consing)（空いている記憶場所の頭にポインタをインクリメントする）およびコピーするごみ回収器によるゴミ回収のような安い技術によって実施される。他方で、古いスペースはより数の少ない、生存期間の長いオブジェクトを保持する傾向にあるので、バディまたは最良優先割当技術によってメモリの割当を行ないかつ割当解除はマーク吐き出しごみ回収器によって行なうのが好ましい。
【０００９】
世代別ごみ回収器の性能は新しいスペースにおけるすべてのオブジェクトに対する「ルートセット」を計算する効率によって多いに影響される。新しいスペースのルートセットは、セットの推移クロージャが新しいスペースにおけるライブオブジェクトすべてを含むようなオブジェクトの組である。具体的には、新しいスペースにおけるオブジェクトを参照する古いスペース内のすべてのオブジェクトを定めることが重要である。ルートセットの計算を簡単にする１つの方法は「覚書表」を維持することであり、これは新しいスペースにおけるどのオブジェクトが古いスペースにおけるオブジェクトによって参照されるかを記録するためにごみ回収器によって用いられるデータ構造である。覚書表は、割当動作によって新しいスペースのオブジェクトへの参照が古いスペースにおけるオブジェクトに置かれる場合に更新される。割当動作が新しいスペースのオブジェクトへの参照を古いスペースのオブジェクトに置くかどうかを定めるために行なわれるチェックは「書込バリア」と呼ばれる。効率的にこのような割当を検出するのが望ましい。
【００１０】
新しいスペースのオブジェクトへの参照が古いスペースのオブジェクトに割当られることを検出する１つのアプローチとして、新しいスペースおよび古いスペースの連続する範囲のメモリ場所をリザーブし、そのリザーブされた範囲についてのオブジェクトの位置をチェックすることである。たとえば、新しいスペースのオブジェクトが常に０１２，０００，０００−０１２，７７７，７７７（８進）の連続する範囲に割当てられ、かつ古いスペースのオブジェクトが常に０２３，４５０，０００−０２３，５１７，７３０の連続する範囲に常に割当てられるのなら、そのリザーブされた範囲内でのオブジェクトの位置を比較することにより、新しいスペースのリファレンスが古いスペースのオブジェクトに記憶されることが識別できる。こうして、０１２，３４５，６７０の位置での一オブジェクトへのリファレンスは新しいスペースにあると判断できる。なぜなら、０１２，３４５，６７０の場所は０１２，０００，０００−０１２，７７７，７７７の範囲内にあるからである。
【００１１】
しかし、多くの実行時環境は広い連続するメモリ領域が割当てられるのを許さない環境で実現されている。このような環境の場合、メモリは複数の一般的セグメントとしてしか得られない。その結果、オブジェクトがどのメモリ領域にあるかを決定することは、オブジェクトの場所をチェックすることでは判断できない。
【００１２】
オブジェクトがどのメモリ領域に属するかを定める１つのアプローチは、どのセグメントがどのメモリ領域に割当てられるかをリストしている副データ構造を横切ることに関わる。しかし、このアプローチは副データ構造に対して多くの高価なポインタのデリファレンスを引起す。別のアプローチとしては、オブジェクトが位置するスペースを記述するヘッダを各オブジェクトの頭に記憶することである。しかし、オブジェクトのヘッダに記憶されている情報のアクセスはオブジェクトへのメモリポインタのデリファレンスを必要とし、これは高価なものとなる。なぜなら、命令パイプラインに穴があったり、キャッシュの不一致があったり、さらにオブジェクトのヘッダがあるページが仮想メモリシステムによってスワップアウトされた場合にはページエラーとなったりするからである。
【００１３】
したがって、オブジェクトの記憶特性、たとえばオブジェクトがどのメモリ領域に割当てられているかを示す特性、を管理する実行時環境でのニーズがある。さらに、好ましくはメモリポインタをデリファレンスすることなく、オブジェクトの記憶特性を効率的に決定するニーズがある。さらに、古いスペースのオブジェクト内に新しいスペースのオブジェクトへのリファレンスを割当ることを検出する効率的な方法も必要である。
【００１４】
【発明の概要】
これらのニーズおよび他のニーズは、マシンポインタのような、オブジェクトへのリファレンスに対する「タグ」と呼ばれる下位ビットの一部内におけるオブジェクトについての記憶特性をコード化することにより対処している。したがって、記憶特性はマシンポインタをデリファレンスすることなくタグの特定ビットを抽出しかつ調べることによって効率的に定めることができる。オブジェクトへのリファレンスのタグにコード化できるオブジェクトの記憶特性は、オブジェクトがどのようにかついつ実行時環境によって管理されるメモリに記憶されるかを示す。たとえば、タグはオブジェクトの生存期間、フォーマットおよび／または連続性についての情報をコード化することができ、したがってタグはオブジェクトが新しいスペースまたは古いスペースに割当てられているかどうかを示すことができる。
【００１５】
したがって、本発明の１つの局面はオブジェクトの記憶特性についての情報を管理するための、コンピュータによって実行される方法、および命令を含むコンピュータによって読取可能な媒体に関する。オブジェクトはたとえばＮビットの整列アドレスにおいてメモリに記憶され、オブジェクトへのリファレンスは、リファレンスのベースアドレス部においてメモリ内のオブジェクトの位置を記憶することによって作成される。この方法は、リファレンスのタグ部において、オブジェクトの記憶特性についての情報を記憶することを含む。リファレンスのタグ部はアドレス部のビットより下位である、リファレンスの１つ以上のビットを含む。一実施例において、オブジェクトの記憶特性についての情報は、オブジェクトへのリファレンスのタグ部をアクセスすることによって引出される。
【００１６】
本発明の別の局面は、複数のオブジェクトのメモリを管理するための、コンピュータによって実行される方法、および命令を含むコンピュータによって読取可能な媒体に関する。この方法はオブジェクトを第１のメモリ領域に割当、生存期間に基づいて、一部のオブジェクトを第１のメモリ領域から第２のメモリ領域に移動させることを含む。第１のメモリ領域および第２のメモリ領域の一方または両方は、複数の不連続セグメントを含む。第２のメモリ領域におけるどの第２のオブジェクトが第１のメモリ領域における第１のオブジェクトを参照するかについての情報のデータ構造は、メモリポインタをデリファレンスすることなく、第１のオブジェクトへの第１のリファレンスおよび第２のオブジェクトへの第２のリファレンスに基づいて、第１のオブジェクトが第１のメモリ領域に割当てられているかどうかおよび第２のオブジェクトが第２のメモリ領域に割当てられているかどうかを決定することによって維持される。一実施例において、第１のオブジェクトが第１のメモリ領域に割当てられ、第２のオブジェクトが第２のメモリ領域に割当てられていることの判断は、第１および第２のオブジェクトへのリファレンスのタグを抽出して、そのタグを比較することによって行なわれる。
【００１７】
本発明の他の目的および利点は、本発明を実施する最良のモードを示す以下の詳細な説明から容易に明らかとなる。本発明では他の実施例および異なる実施例が可能であり、本発明から逸脱することはなくいくつかの詳細はさまざまな自明な点で変形可能である。したがって、図面および記載は例示的なものであり、限定するものではない。
【００１８】
本発明について、限定を目的としてではなく例示を目的として添付の図面において説明している。図面では同一の参照番号は同様の構成要素を表わしている。
【００１９】
【好ましい実施例の説明】
メモリを管理するための方法および装置について説明する。以下の記載では、説明のために、多数の具体的な詳細事項を述べて本発明を十分に理解できるようにしている。しかしながら、本発明はこれらの具体的な詳細事項がなくとも実施し得ることが当業者には明らかであろう。これ以外については、周知の構造および装置をブロック図形式で示し、本発明が不必要に不明瞭にならないようにしている。
【００２０】
ハードウェア概観
図１は、本発明の実施例を実現し得るコンピュータシステム１００を示すブロック図である。コンピュータシステム１００は、情報を伝えるためのバス１０２または他の通信メカニズムと、バス１０２に結合され情報を処理するためのプロセッサ１０４とを含む。コンピュータシステム１００はまた、バス１０２に結合され、情報およびプロセッサ１０４が実行する命令を記憶するための、ランダムアクセスメモリ（ＲＡＭ）または他の動的記憶装置といったメインメモリ１０６を含む。メインメモリ１０６を用いて、プロセッサ１０４が命令を実行する間に、実行する一時的変数または他の中間情報を記憶することもできる。コンピュータシステム１００はさらに、バス１０２に結合され、静的情報およびプロセッサ１０４に対する命令を記憶するための、読取専用メモリ（ＲＯＭ）１０８または他の静的記憶装置を含む。磁気ディスクまたは光ディスクなどの記憶装置１１０が設けられ、バス１０２に結合されて情報および命令を記憶する。
【００２１】
コンピュータシステム１００を、陰極線管（ＣＲＴ）といったディスプレイ１１２にバス１０２を介して結合し、情報をコンピュータユーザに対し表示することができる。英数字およびその他のキーを含む入力装置１１４は、バス１０２に結合され、情報およびコマンド選択をプロセッサ１０４に伝える。他の種類のユーザ入力装置としては、方向情報およびコマンド選択をプロセッサ１０４に伝えるためかつディスプレイ１１２上でのカーソルの動きを制御するための、マウス、トラックボールまたはカーソル方向キーといったカーソルコントロール１１６がある。典型的にこの入力装置は第１の軸（たとえばｘ）および第２の軸（たとえばｙ）という２つの軸における２つの自由度を有し、これによってこの入力装置は平面での位置を特定できる。
【００２２】
本発明は、オブジェクトのメモリ管理のためにコンピュータシステム１００を使用することに関する。本発明のある実施例に従うと、メモリの管理は、メインメモリ１０６に含まれる１以上の命令の１以上のシーケンスを実行するプロセッサ１０４に応答してコンピュータシステム１００により行なわれる。こういった命令は、メインメモリ１０６に、たとえば記憶装置１１０といった別のコンピュータ読取可能な媒体から読込むことができる。メインメモリ１０６に含まれる命令シーケンスを実行すると、プロセッサ１０４は、本明細書に記載するプロセスステップを実施する。多重処理配置の１以上のプロセッサを用いて、メインメモリ１０６に含まれる命令のシーケンスを実行することもできる。代替実施例では、ハードワイヤード回路を、ソフトウェア命令の代わりにまたはソフトウェア命令と組合わせて用いて、本発明を実現することができる。このように、本発明の実施例は、ハードウェア回路およびソフトウェアの特定の組合せに限定されるものではない。
【００２３】
本明細書で用いる「コンピュータ読取可能な媒体」という用語は、プロセッサ１０４が実行する命令を与えることに関わる何らかの媒体のことを指す。このような媒体には、不揮発性媒体、揮発性媒体および伝送媒体を含め、数多くの形態があるが、これらに限定される訳ではない。不揮発性媒体は例として記憶装置１１０などの光ディスクまたは磁気ディスクを含む。揮発性媒体はメインメモリ１０６などの動的メモリを含む。伝送媒体は、バス１０２を含むワイヤを含め、同軸ケーブル、銅線および光ファイバを含む。伝送媒体は、無線周波数（ＲＦ）および赤外（ＩＲ）データ通信中に発生する音波または光波の形態も取り得る。例として、コンピュータ読取可能な媒体の一般的な形態は、フロッピー（Ｒ）ディスク、フレキシブルディスク、ハードディスク、磁気テープ、その他の磁気媒体、ＣＤ−ＲＯＭ、ＤＶＤ、その他の光媒体、パンチカード、紙テープ、その他孔パターンを有する物理媒体、ＲＡＭ、ＰＲＯＭ、ＥＰＲＯＭ、ＦＬＡＳＨ−ＥＰＲＯＭ、その他メモリチップまたはカートリッジ、以下で説明する搬送波、またはこれら以外のコンピュータが読取可能な媒体を含む。
【００２４】
種々の形態のコンピュータ読取可能な媒体を、１以上の命令の１以上のシーケンスを実行のためにプロセッサ１０４に搬送するのに用いることができる。たとえば、初めは命令を遠隔コンピュータの磁気ディスクに置いてもよい。遠隔コンピュータは、命令を、自身の動的記憶装置にロードし、モデムを用いて電話線で送ることができる。コンピュータシステム１００のローカルモデムは、電話線のデータを受け、赤外線送信器を用いてこのデータを赤外線信号に変換できる。バス１０２に結合された赤外線検出器は、赤外線信号で搬送されるデータを受け、このデータをバス１０２に置く。バス１０２は、このデータをメインメモリ１０６に搬送し、ここからプロセッサ１０４は命令を取出して実行する。任意的に、メインメモリ１０６が受けた命令を、プロセッサ１０４による実行前または実行後いずれかに、記憶装置１１０に記憶させることができる。
【００２５】
コンピュータシステム１００はまた、バス１０２に結合された通信インターフェイス１１８を含む。通信インターフェイス１１８によって、ローカルネットワーク１２２に接続されたネットワークリンク１２０に結合する双方向データ通信が行なわれる。例として、通信インターフェイス１１８は、対応する種類の電話線へのデータ通信接続をもたらす統合デジタル通信サービス網（ＩＳＤＮ）カードまたはモデムでもよい。別の例として、通信インターフェイス１１８は、互換ＬＡＮへのデータ通信接続をもたらすローカルエリアネットワーク（ＬＡＮ）カードでもよい。ワイヤレスリンクを実現することもできる。どのような実現化例においても、通信インターフェイス１１８は、種々の種類の情報を表わすデジタルデータストリームを搬送する電気信号、電磁信号または光信号を送受信する。
【００２６】
典型的に、ネットワークリンク１２０は、１以上のネットワークを通して他のデータ装置にデータを提供する。たとえば、ネットワークリンク１２０により、ローカルネットワーク１２２を通して、インターネットサービスプロバイダ（ＩＳＰ）１２６が操作するホストコンピュータ１２４またはデータ機器への接続が得られる。ＩＳＰ１２６からは、現在は一般に「インターネット」１２８と呼ばれているワールドワイドパケットデータ通信ネットワークを通して、データ通信サービスが提供される。ローカルネットワーク１２２およびインターネット１２８はどちらも、デジタルデータストリームを搬送する電気信号、電磁信号または光信号を利用する。種々のネットワークを通る信号、ネットワークリンク１２０上の信号および通信インターフェイス１１８を通る信号は、コンピュータシステム１００へのおよびコンピュータシステムからのデジタルデータを運ぶ。これらの信号は、情報を伝達する搬送波の形態の例である。
【００２７】
コンピュータシステム１００は、ネットワーク、ネットワークリンク１２０および通信インターフェイス１１８を通して、プログラムコードを含むメッセージを送りデータを受けることができる。インターネットの例では、サーバ１３０が、アプリケーションプログラムについて要求されたコードを、インターネット１２８、ＩＳＰ１２６、ローカルネットワーク１２２および通信インターフェイス１１８を通して、送信することがある。本発明に従い、このようにダウンロードされたアプリケーションにより、本明細書で説明するようにメモリを管理する。
【００２８】
受けたコードを受けたときにプロセッサ１０４が実行してもよく、かつ／または、記憶装置１１０または他の不揮発性記憶装置に記憶しておいて後で実行してもよい。この態様で、コンピュータシステム１００は、搬送波の形でアプリケーションコードを得ることができる。
【００２９】
リファレンスタグ付け
本発明は、整列不変量を、強く型付けされた言語たとえばJAVA(R)（登録商標）の動的実行時環境に導入して活用し、オブジェクトへのすべてのリファレンス内のオブジェクトの記憶特性に関する情報をコード化できるという認識から、生まれたものである。リファレンスの一例としてマシンポインタがあり、マシンポインタは、コンピュータシステムのメモリ空間内のオブジェクトの場所を、実アドレスまたは仮想アドレスの形式で含む。ポインタに埋込まれた情報は、高速アクセスマシンレジスタにあることが多いため、参照されたオブジェクトのヘッダを取込むためにさらなるメモリサイクルを要しなくても、非常に高速で取出すことができる。
【００３０】
図２を参照して、実行時環境が管理するオブジェクトは、Ｎビット整列アドレスに記憶される（ステップ２００）。言い換えれば、こうしたオブジェクトの記憶は、２Nバイト境界を起点とする仮想アドレスで始まる。たとえば、オブジェクトを、３ビット整列アドレスに、すなわち２3＝８バイト境界に記憶することができる。したがって、このようなオブジェクトの、８進数で表現される正当な開始アドレスは、０２，４４７，６３０である。しかしながら、０２，４４７，６３４といったアドレスは、オブジェクトの記憶に有効な開始アドレスではない。結果として、ポインタの３個の最下位ビットは、異なるオブジェクトを区別するのに役立たない。なぜなら、この３個の最下位ビットについては８個の値のうちひとつのみが正当なアドレスで、残り７個の値は他のどのオブジェクトも示さないからである。この整列の制限のため、０２，４４７，６３０から０２，４４７，６３７までのアドレスを有するマシンポインタは効果的に同じオブジェクトを指す。
【００３１】
したがって、Ｎビット整列オブジェクトへのポインタのＮ個の下位ビットのいずれかを用いて、他の情報、すなわち参照されたオブジェクトの記憶特性をコード化できる。ポインタの残余の部分は「ベースアドレス」と呼ばれ、仮想メモリ内でのオブジェクトの場所を含む。したがって、ベースアドレスのビットより下位の、ポインタにおけるビットのいずれかを用いて、オブジェクトの記憶特性を示すことができる。例として、３ビット整列オブジェクトへのポインタの３個のビットすべてを用いて、このオブジェクトの記憶特性を示すことができる。別の例として、ビット２および３を専らオブジェクトの記憶特性を示すのに用い、ビット０を他の種類のインスタンス特性を示すのに用いることができる。
【００３２】
図３に示したある実現化例では、ポインタ３００は、３２ビットの仮想アドレスからなる。実行時環境内のオブジェクトが８バイト境界に整列していれば、タグ３０４に対し、ポインタ３００の３個の最下位ビットを利用でき、ベースアドレス部３０２を構成する残り２９ビットを用いて、参照されたオブジェクトの場所を保持する。図３は３ビットのタグ３０４を有する３２ビットのポインタ３００の一例を示しているが、本発明はこのような具体的なサイズに限定されない。ポインタのサイズおよびタグのサイズを実現化例ごとに変えてもよい。たとえば、ポインタのタグ付けは、１６ビット、３６ビットおよび６４ビットのポインタおよび１ビットから５ビットのタグに適している。
【００３３】
再び図２を参照して、オブジェクトへの、たとえばポインタというリファレンスが作成されると、オブジェクトの場所は、このリファレンスのベースアドレス部に記憶される（ステップ２０２）。参照されたオブジェクトの所望の記憶特性は、タグ部に記憶される（ステップ２０４）。オブジェクトを参照するポインタ３００に基づいてオブジェクトの記憶特性を取出すために、ポインタのデリファレンスを行なわなずに、ポインタ３００のタグ部３０４がアクセスされる（ステップ３０６）。タグは種々の方法で抽出できる。たとえば、ポインタをマスクし最下位ビット３０４を抽出することにより、または、ポインタ３００およびオブジェクトの実際の開始アドレスのポインタ差を計算することにより、タグを抽出できる。
【００３４】
タグ付けされたポインタのデリファレンスのためには、ベースアドレスをポインタから抽出してからデリファレンスを行なう。たとえば、タグ付けされたポインタ０２，４４７，６３４は、デリファレンスのためにベースアドレス０２，４４７，６３０に変換される。例として、ベースアドレスを、タグをマスクオフすることによって抽出できる。Ｃプログラミング言語では、タグを、式（ｐｔｒ＆−０７）でマスクオフできる。
【００３５】
記憶特性
ポインタタグにおいて種類情報をコード化するSmalltalk（登録商標）およびLISP Machine（登録商標）実現化例とは対照的に、本発明のある実施例では、強く型付けされた言語たとえばJAVA(R)（登録商標）のための動的実行時環境における参照タグ付けを用いて、オブジェクトの記憶特性に関する非種類情報をコード化する。強く型付けされた言語のための実行時環境では、ポインタに種類情報を記憶する必要はない。なぜなら、コンパイラは既に、たとえば一般的にはメッセージのディスパッチといったオブジェクトの種類を知っていることが不可欠である状況における、関連の種類情報を認識しているからである。
【００３６】
記憶特性は、「種類」以外の、安定したインスタンス特性であり、これは一般に、オブジェクトがどのようにしてメモリに記憶されているか、および、オブジェクトが実行時環境が管理するメモリにどれだけの期間記憶されているかに関する。ポインタタグに、３種類の記憶特性すなわち生存期間、フォーマットおよび連続性をコード化しておくことが特に有利なことがわかっている。加えて、これらの記憶特性を組合わせたものをポインタタグにコード化することができる。
【００３７】
オブジェクトの生存期間記憶特性は、オブジェクトが存続している期間を表わす。生存期間は、絶対的に時間で表わす、または、別のオブジェクトまたはイベントに関する相対的な時間で表わすことができる。例として、「最近」割当てられたオブジェクトを０でタグ付けし、「より古い」オブジェクトを１でタグ付けすることができる。より正確には、世代別ごみ回収器では、タグ０は新しい空間のオブジェクトと関連づけられ、タグ１は古い空間のオブジェクトと関連づけられる。この場合、より古いオブジェクトを、ごみ回収のために新しい空間が取除かれた４つの出現よりも長く存続するものとして定義できる。別の例として、生存期間は、オブジェクトが現在のＳＱＬコール中にセッションにおける過去のコールに割当てられたのか、または、セッション間を通して存続しているのかどうかを示すことができる。
【００３８】
オブジェクトのフォーマットは、オブジェクトの内的表現が何であるかを示す。フォーマットは種類とは異なり、種類は論理概念であるのに対しフォーマットは物理概念である。したがって、同じ種類の２つのオブジェクトが異なるフォーマットすなわち内的表現を有することが可能である。あるオブジェクトのフォーマットの一例は、別のオブジェクトへのリファレンスの内的表現を含む。このリファレンスは、あるフォーマットでは固有のマシンポインタとして、および、別のフォーマットでは数値リファレンスとして、実現できる。数値リファレンスは、オブジェクトの場所を、メモリの割当領域の空間またはオブジェクトそのものの起点といったように、暗黙のベースポインタからの変位またはオフセットとして説明する整数である。数値リファレンスの内的表現は整数であるため、数値リファレンスは、固有マシンポインタよりも移動性が高く潜在的に再配置しやすい。実際、数値リファレンスそのものをタグ付けして、数値リファレンスが参照するオブジェクトの連続性といった記憶特性を記録できる。
【００３９】
もうひとつ記憶特性は、オブジェクトの連続性であり、オブジェクトが連続したメモリ場所に記憶されているのか連続していないページに記憶されているのかを示す。この記憶特性は、メモリが通常非連続の複数ページとしてしか得られない実行時環境では特に有利なことがわかっている。１つのページは、コンピュータシステムの（仮想）アドレス空間の固定長の連続領域である。ある実施例では、ページサイズは４０９６（２12）であるが、このページサイズは他の実施例では２8（２５６）から２16（６５５３６）バイトといったように幅を持たせることができる。１つのオブジェクトは、複数ページに記憶されている場合、特に、複数ページのうち１つがこれらページの別のページに連続していない場合、非連続であるまたは「ページに分かれる」と言われる。ページに分けたオブジェクトのフィールド、インスタンス変数または「スロット」のアドレス計算は、ページテーブルを通したインデックスにより非常に複雑であるが、連続したオブジェクトについてはもっと簡単である。したがって、リファレンスタグにおいてオブジェクトの連続性をコード化することにより、適切なマシン命令をディスパッチしてページに分かれたオブジェクトのスロットにアクセスできる。
【００４０】
タグは、オブジェクトの生存期間およびフォーマット（１つのフォーマット）またはオブジェクトの連続性およびフォーマット（別のフォーマット）といったように、記憶特性の組合せをコード化できる。表１はこのような特性に対するタグ値に可能な１つの割当を列挙している。
【００４１】
【表１】
0003908909.tif 000002
【００４２】
オブジェクトの記憶特性はオブジェクトへのすべてのリファレンスにおいてコード化されているため、オブジェクトの記憶特性に生じた変化をオブジェクトへのリファレンスすべてに反映させなければならないことになる。しかしながら、この制限は、記憶特性のタグ付けにおいては問題ではない。例として、いくつかの特性は、フォーマットまたは連続性といったように、本質的に永久的である。このようなポインタタグの変更はもしあったとしてもごく稀にしか起こらない。別の例として、世代別ごみ回収器により、新しい空間のオブジェクトが古い空間に入れられた場合、このオブジェクトに対するすべてのリファレンスは、どんな場合でも必ずこの回収器によって再配置されねばならない。また、この再配置の一部として、生存期間がオブジェクトの永久特性でないとしても、タグを更新できる。
【００４３】
ポインタタグを用いた書込バリアの実現
図４は、ポインタタグを用いて世代別ごみ回収器において効率的に書込バリアを実現できるようにする方法を説明するフローチャートを示す。世代別ごみ回収器内で、オブジェクトは新しい空間に割当てられ（ステップ４００）、オブジェクトのいくつかはその生存期間に基づいて古い空間に移される（ステップ４０２）。覚書表と呼ばれるデータ構造が、書込バッファに維持されている。すなわち、ターゲットオブジェクトに対するターゲットポインタの、ソースポインタが参照するソースオブジェクト内のフィールドへの割当てに応じて、覚書表は、条件付きで更新される（ステップ４０４）。より具体的には、覚書表は、ターゲットオブジェクトが新しい空間にありソースオブジェクトが古い空間にあると判断された場合に更新される。
【００４４】
ステップ４１０−４１６は、ある実施例に従いこの判断をポインタタグを用いて行なう方法を説明している。ステップ４１０で、ターゲットタグが、マスキンングまたはポインタ差の計算により、ターゲットポインタから抽出され、ステップ４１２で、ソースタグがソースポインタから抽出される。これらの動作は典型的に、多くのコンピュータアーキテクチャではレジスタごとの動作であり、メモリポインタのデリファレンスを含まない。結果として、一般にはメモリポインタのデリファレンスに関連するオーバヘッド、たとえば、システムバス上にメモリ読出サイクルを発生させることまたはメモリフェッチの実行は回避される。したがって、ポインタタグは、キャッシュミスまたは仮想メモリページの誤りを引き起こす可能性のある、従来の方策の損失を避ける役割を果たす。特に、レジスタ動作のみを用いることによって、従来のオブジェクトヘッダ方法に比べて、性能が大幅に向上する。
【００４５】
ステップ４１４で、ソースタグおよび宛先タグを検査し、割当ステートメントが、新しい空間のターゲットオブジェクトを参照する古い空間のソースオブジェクトとなっているかどうか判断する。この検査が真であれば、覚書表が更新される（ステップ４１６）。ある実施例では、この検査を簡単に、ソースタグを古い空間の値と比較し、ターゲットタグを新しい空間の値と比較することによって行なうことができる。たとえば、Ｃプログラミング言語では、式((source & 07) == OLDSPACE && (target & 07) == NEWSPACE)で、この検査を行なうことができる。式中、sourceはソースオブジェクトへのポインタであり、targetはターゲットオブジェクトへのポインタであり、OLDSPACEおよびNEWSPACEは所定の値たとえばそれぞれ１および０に定められた明白な定数である。
【００４６】
上記の式により検査を行なうことができるが、タグの値を適切に選択することによってより効率的に行なうことができる。たとえば、１という古い空間のタグおよび０という新しい空間のタグを用いれば、この判断を、(source & 07) > (target & 07)という、不一致に関する比較によって行なうことができる。さらなるタグの値を用いると、たとえば、ポインタフォーマットオブジェクトへの割当を含むすべての書込動作が数値リファレンスフォーマットオブジェクトへの書込動作を含むものと別にされている場合、この比較をなおも世代別ごみ回収器に用いることができる。この状況は、世代別ごみ回収器を呼出期間メモリにおけるポインタフォーマット化オブジェクトに対してのみ用い、数値リファレンスフォーマット化オブジェクトがセッション期間メモリに割当てられている場合に生じ得る。
【００４７】
本発明について現在最も実用的かつ好ましい実施例だと考えられるものと関連づけて説明してきたが、本発明は、上記開示の実施例に限定されるのではなく、前掲のクレームの精神および範囲に含まれる種々の変形例および等価例をカバーすることが意図されていることが、理解されるであろう。
【図面の簡単な説明】
【図１】  実施例を実現するのに使用できるコンピュータシステムを示すブロック図である。
【図２】  タグ付きポインタを作成および使用するステップを示すフローチャートである。
【図３】  タグ付きポインタのある実現化例を概略的に示す。
【図４】  覚書表を書込バリアに維持するステップを示すフローチャートである。
【図１】
0003908909.tif 000003
【図２】
0003908909.tif 000004
【図３】
0003908909.tif 000005
【図４】
0003908909.tif 000006