(57)【特許請求の範囲】
【請求項１】
演算装置及びメモリを有する計算機であって、
前記メモリに割り当てられた複数の記憶領域に格納されるデータの参照元情報を、前記記憶領域毎に記憶する記憶部と、
更新後の参照元情報が、前記記憶部に記録された参照元情報と異なる記憶領域を解放対象の領域と判定する制御部と
を有する計算機。
【請求項２】
請求項１に記載の計算機であって、
前記記憶部が、前記データの参照関係の更新時に前記更新後の参照元情報を記憶する計算機。
【請求項３】
請求項１に記載の計算機であって、
前記制御部が、前記更新後の参照元情報が、前記記憶部に記録した参照元情報に含まれない記憶領域を解放対象領域として判定する計算機。
【請求項４】
請求項１に記載の計算機であって、
前記制御部は、更に、解放対象と判定した記憶領域の解放処理を実行するものであり、
前記記憶領域の解放処理の実行時に前記判定を実行する計算機。
【請求項５】
請求項４に記載の計算機であって、
前記前記制御部が、前記複数の記憶領域にデータを生成できなかったときに前記解放処理を実行する。
【請求項６】
請求項１に記載の計算機であって、
前記参照元情報に、参照元データの識別情報又は参照元データを格納する記憶領域の識別情報が少なくとも含まれる計算機。
【請求項７】
演算装置及びメモリを有する計算機に、
前記メモリに割り当てられた複数の記憶領域に格納されるデータの参照元情報を、前記記憶領域毎に記憶する手順と、
更新後の参照元情報が、前記記憶部に記録された参照元情報と異なる記憶領域を解放対象の領域と判定する手順と
を実行させるプログラムを格納するコンピュータ読み取り可能な非一時的な記録媒体。
【請求項８】
計算機が、
メモリに割り当てられた複数の記憶領域に格納されるデータの参照元情報を、前記記憶領域毎に記憶するステップと、
更新後の参照元情報が、前記記憶部に記録された参照元情報と異なる記憶領域を解放対象の領域と判定するステップと
を含むメモリ管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機、記録媒体及びメモリ管理方法に係り、計算機のメモリ管理を行う計算機、記録媒体及びメモリ管理方法に関する。
【背景技術】
【０００２】
計算機システムにおいて、プログラムが使用しているメモリ上のオブジェクトの暗黙的な回収手段として、ガベージコレクション(以下、ＧＣ)技術がある。Ｊａｖａ（登録商標）仮想マシン（以下、ＪＶＭ）は、ＧＣを採用した代表的な処理系の１つである。【０００３】
ＧＣでは、メモリ上のオブジェクトの参照関係を調べることで不要なオブジェクト(以下、ｄｅａｄオブジェクト)を見つけ出し、自動的な回収を実現している。具体的には、ＧＣ処理はプログラムが参照を辿ることができる元(以下、参照ルート)からメモリ上のオブジェクトの参照関係を辿り、最後まで到達できなかったオブジェクトをＤｅａｄオブジェクトと判定して回収することで行われる。従来のＧＣでは使用しているメモリ領域全域を一度に調べるという方式が採られており、この方式ではメモリ量に比例した処理時間が必要となる。【０００４】
近年、計算機に搭載されるメモリの大容量化が進んでおり、これによりＧＣの処理時間も増加する傾向にある。ＧＣには大別するとStop the World方式とConcurrent方式が有る。Stop the World方式ではＧＣ処理中はプログラムの処理を停止させて処理が実行される。このためＧＣ時間の増加は意図しないプログラムの長時間停止を招き、計算機システムの可用性を大きく損なう恐れがある。他方、Concurrent」方式では、プログラムの処理実行と並行してＧＣ処理を行うために、停止時間は小さいが、プログラムの実行性能が低下する問題がある(非特許文献１)。【０００５】
以上のようなメモリの大容量化に伴う問題に対して、メモリ領域全域を一度に処理する代わりに領域を複数の小領域に分割し、それぞれの小領域ごとに処理するＧＣ方式が提案されている(非特許文献２)(特許文献１)。これらの方式の場合、一度に処理するメモリ領域量は小さいため、Ｓｔｏｐ  ｔｈｅ  Ｗｏｒｌｄ方式を用いた場合でも長時間の停止を防ぐことが可能である。【０００６】
また、メモリ領域を複数の小領域に分割して処理するＧＣ技術では、メモリ領域内で値が変更された箇所を指し示すためのバリアセットと呼ばれる補助構造を持つことで、効率的なＧＣ処理が行えることが知られている(非特許文献１)。【０００７】
また、従来のメモリ管理方法として、プログラムから明示的に管理する目的で、メモリ領域を複数の小領域に分割するものも存在する(特許文献２)。また、この方法に対して、それぞれの小領域内に存在する不要領域の自動回収処理を併用したものもある(特許文献３)。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】米国特許７３４０４９４号
【特許文献２】特開２００９−３７５４７号公報
【特許文献３】特開２０１１−５３８６２号公報
【非特許文献】
【０００９】
【非特許文献１】“Garbage Collection: Algorithms for Automatic Dynamic Memory Management”(Richard Jones, Rafael Lins, 1996, John Wiley & Sons Inc, ISBN:978-0471941484)
【非特許文献２】I Richard L. Hudson,“ Incremental collection of mature objects, In Proceedings of the International Workshop on Memory Management, pp.388-403”, 1992
【発明の概要】
【発明が解決しようとする課題】
【００１０】
メモリ領域を複数の小領域に分割した場合、計算機システムの性能を高めるうえでは、どの小領域をＧＣの処理対象として選ぶかが重要となる。【００１１】
一般にメモリ領域内での不要領域の分布は一様ではない。このため選び方によっては、不要な領域が少ない小領域ばかりを選択してしまう可能性がある。この場合、一度のＧＣ処理で回収できる不要領域が少ないため、ＧＣ処理を何度も実行する必要が生じ、計算機システムの性能低下を招く。逆に、不要領域が多い小領域ばかりを選択することができれば、一度のＧＣ処理で回収できる不要領域が多くなる。このためＧＣ処理の実行回数が減少し、計算機システムの性能を向上させることが可能である。【００１２】
非特許文献２には、小領域の選び方として、全ての小領域を順繰りに選択することが開示されている。この場合であれば、全ての小領域が等しい頻度で選択されることから、不要領域が少ない小領域ばかりを選択し続けてしまうという恐れはない。しかし、回収効率が悪い小領域も含めて、全ての小領域を同じように選択（チェック）していくことになるために、選択処理の負荷の面で課題が残り、その分計算機システムの性能は低下する。【００１３】
また、特許文献１には、別の小領域の選び方として、Ｃｏｎｃｕｒｒｅｎｔ方式のＧＣを用いて各小領域の不要領域の量を調査することで、不要な領域の多い小領域の選択を可能にする技術が開示されている。しかし、この場合であっても、Ｃｏｎｃｕｒｒｅｎｔ方式のＧＣを併用することから、通常のＣｏｎｃｕｒｒｅｎｔ方式のＧＣと同様に性能低下の課題が生じる。メモリ領域を分割して管理するＧＣ処理では、領域の回収効率の更なる最適化が望まれる。
【課題を解決するための手段】
【００１４】
上述の課題を解決するために、例えば、請求の範囲に記載の発明を適用する。即ち演算装置及びメモリを有する計算機であって、前記メモリに割り当てられた複数の記憶領域に格納されるデータの参照元情報を、前記記憶領域毎に記憶する記憶部と、更新後の参照元情報が、前記記憶部に記録された参照元情報と異なる記憶領域を解放対象の領域と判定する制御部とを有する計算機を適用する。
【発明の効果】
【００１５】
本発明の一側面によれば、ＧＣ処理対象の領域を選択する際、領域の参照元の変化を利用して、より効率的に解放対象の領域を選択することができる。
本発明の他の課題及び効果は、以下の記載から明らかになるであろう。
【図面の簡単な説明】
【００１６】
【図１】本発明を適用した第１実施形態における計算機の構成例を示すブロック図である。
【図２】本実施形態におけるヒープ領域の構成例を示す模式図である。
【図３Ａ】本実施形態における参照元情報管理情報の例を模式的に示す図である。
【図３Ｂ】本実施形態における参照元情報管理情報とヒープ領域上のオブジェクトとの関係を模式的に示す図である。
【図４】本実施形態におけるＪａｖａプログラム実行部による参照元情報の記録処理の流れを示すフロー図である。
【図５】本実施形態におけるＧＣ処理部による参照元情報を用いたＧＣ対象の選択処理の流れを示すフロー図である。
【図６】第２実施形態における計算機の構成例を示すブロック図である。
【図７】第２実施形態におけるバリアセット情報の例を示す模式図である。
【図８Ａ】第２実施形態における参照元情報管理情報の例を示す模式図である。
【図８Ｂ】第２実施形態における参照元情報管理情報と、ヒープ領域上のオブジェクトとの関係を模式的に示す図である。
【図９】第２実施形態におけるＪａｖａプログラム実行部による参照元情報の記録処理の流れを示すフロー図である。
【図１０】第２実施形態におけるＧＣ処理部による参照元情報を用いたＧＣ対象の選択処理の流れを示すフロー図である。
【発明を実施するための形態】
【００１７】
＜第１実施形態＞
図１に、本発明を適用した第１実施形態である計算機１の構成を示す。本実形態では、計算機１にＪａｖａＶＭ１０が機能する例を用いるものとする。
計算機１には、ＣＰＵ２、メモリ３及び記憶部４等が設けられた汎用のサーバ装置を用いるものとする。ＣＰＵ２は、Ｊａｖａプログラム７０及びＯＳ８０との協働により、メモリ３上にＪａｖａＶＭ１０を実現する。また、ＪａｖａＶＭ１０には、ＧＣ処理部３０、Ｊａｖａプログラム実行部６０が実現されるとともに参照元管理情報４０Ａ、参照ルート５０が保持されるようになっている。
【００１８】
メモリ３には、ＯＳ８によってヒープ領域２０が割り当てられる。
図２に、ヒープ領域２０の構成を模式的に示す。ヒープ領域２０には、任意の数の小ヒープ領域２１ａ〜２１ｃが設けられる。ヒープ領域２０に含まれる小ヒープ領域２１の数やサイズは、ＣＰＵ２によるＪａｖａＶＭ１０の実行の過程で変化するようにしてもよい。また、小ヒープ領域２１は、夫々小領域識別子２２ａ〜２２ｃによって管理されるようになっており、小領域識別子２２には、夫々異なる値が登録されるものとする。
【００１９】
なお、ヒープ領域２０は、小ヒープ領域２１以外の領域を含んでいても良い。また、ヒープ領域２０中の小ヒープ領域２１ａ等は、例えば、上述の特許文献３に開示されるように、プログラムからの明示的な管理が可能な領域であってもよい。より詳細には、ヒープ領域２０が、Ｊａｖａヒープで、小ヒープ領域２１の全部又は一部が外部ヒープ領域であってもよい。
【００２０】
Ｊａｖａプログラム実行部６０は、Ｊａｖａプログラム７０を実行している途中で必要となったオブジェクトを、小ヒープ領域２１ａ等内に確保するようになっている。また、Ｊａｖａプログラム実行部６０は、小ヒープ領域２１内のオブジェクトに対する参照情報を参照ルート５０に格納し、該当するオブジェクトを操作するようになっている。
【００２１】
参照元管理情報４０Ａでは、各小ヒープ領域２１ａ〜２１ｃと、その参照元のオブジェクト名とが対応付けて管理されるようになっている。計算機１では、ＧＣ処理時の参照元オブジェクト名と、参照元管理情報４０Ａに記録したオブジェクト生成時の参照元のオブジェクト名とが異なる場合に、その小ヒープ領域２１を解放対象と判定するようになっている。即ちデータの参照関係に変化がある領域が不要領域である可能性が高く、特に、データ参照関係の変化によって、データ生成時の参照元オブジェクト名が削除された小ヒープ領域２１には、不要オブジェクトが格納されているとみなすことができる。
【００２２】
図３Ａ及び図３Ｂに、参照元管理情報４０Ａの構成とデータ例を模式的に示す。参照元管理情報４０Ａは、例えば、テーブル形式の情報であり、識別子フィールド４１、参照元オブジェクトフィールド４２が含まれる。参照元管理情報４０Ａには、小ヒープ領域２１と同数の行が含まれ、各行が１つの小ヒープ領域２１に対応する。識別子フィールド４１では、対応する小ヒープ領域２１の小領域識別子２２の値が保持される。参照元オブジェクトフィールド４２では、対応する小ヒープ領域２２内を参照しているオブジェクトの識別情報（オブジェクトＩＤ等）が保持される。
【００２３】
例えば、図３Ｂに示すように、小領域識別子２２ｂの値が「２」である小ヒープ領域２１ｂが、オブジェクトＢおよびオブジェクトＣを格納しており、このオブジェクトＢ及びＣがオブジェクトＡから参照されている場合、参照元管理情報４０Ａでは、小領域識別子フィールド４１が「２」で、参照元オブジェクトフィールドが「Ａ」である行に含まれるようになる。また、小領域識別子２２ｃの値が「３」である小ヒープ領域２１ｃに、オブジェクトＤ及びＥが格納され、このオブジェクトＤ及びＥが、夫々オブジェクトＡ又はＢから参照されている場合、参照元管理情報４０Ａにおいて、小領域識別子フィールド４１が「３」で、参照元オブジェクトフィールド４２がＡ及びＢである行に含まれることとなる。
【００２４】
ＧＣ処理部３０は、参照ルート５０に格納されているオブジェクトの参照関係を辿ることにより、ヒープ領域２０内で使用されていないオブジェクトを特定し、対応するメモリ領域を解放するようになっている。また、ＧＣ処理部３０は、Ｊａｖａプログラム実行部６０が小ヒープ領域２１ａ等内でのオブジェクトの確保に失敗（例えば、メモリリーク）した契機で呼び出され、ＧＣ処理を開始するようになっている。なお、ＧＣ処理部３０がＪａｖａプログラム実行部６０に呼び出される契機はこれに限定されるものではない。
【００２５】
以上が、本実施形態に係る計算機１の構成である。次に、計算機１の特徴の１つである「参照元情報の記録処理」及び「参照元情報を用いたＧＣ対象の選択処理」について説明する。
【００２６】
Ｊａｖａプログラム実行部６０は、小ヒープ領域２１ａ等に格納されたオブジェクト間の参照が変更された場合に、参照元管理情報４０Ａを変更する。また、ＧＣ処理部３０は、Ｊａｖａプログラム実行部６０から通知を受けると、参照元管理情報４０Ａに基づいて、処理対象とする小ヒープ領域２１ａ等を選択する。ＧＣ処理部３０によるＧＣ処理で回収される未使用オブジェクトは、この選択された小ヒープ領域２１ａ等内のオブジェクトに限定され、その他の小ヒープ領域内のオブジェクトについては未使用であっても回収は行わないようになっている。
【００２７】
図４に、Ｊａｖａプログラム実行部６０が、参照元管理情報４０Ａを変更する「参照元情報の記録処理」の流れを示す。
先ず、Ｊａｖａプログラム実行部６０は、Ｊａｖａプログラム７０を実行している途中で、各小ヒープ領域２１等に格納されているオブジェクト内の参照が変更された時点等の所定タイミングで、本処理を開始する。
【００２８】
Ｓ１０１で、Ｊａｖａプログラム実行部６０は、内部に格納している参照が変更されたオブジェクトを変数Ｓに代入する。
Ｓ１０２で、Ｊａｖａプログラム実行部６０は、変更後の新しい参照が指し示すヒープ位置を含む小ヒープ領域２１に対応する小領域識別子２２を変数Ｄに代入する。
Ｓ１０３で、Ｊａｖａプログラム実行部６０は、参照元管理情報４０Ａで、小領域識別子フィールド４１が「Ｄ」である行について、参照元オブジェクトフィールド４２に「Ｓ」を追加する。その後、Ｊａｖａプログラム実行部６０は、本処理フローを終了する。
【００２９】
なお、該当行の参照元オブジェクトフィールド４２に、既に「Ｓ」が含まれていれば、何もしなくてもよい。小領域識別子２２が「Ｄ」に対応する小ヒープ領域２１に「Ｓ」が含まれる場合も、何もしなくてもよい。
【００３０】
次いで、図５に、「参照元情報を用いたＧＣ対象の選択処理」の流れを示す。本処理は、ＧＣ処理部３０が、参照元管理情報４０Ａに基づいて、処理対象とする小ヒープ領域２１ａ等を選択する処理である。ＧＣ処理部３０は、Ｊａｖａプログラム実行部６０から通知を受けた時点等の所定タイミングで、本処理フローを開始する。
【００３１】
Ｓ２００で、ＧＣ処理部３０は、変数Ｒを空の集合に初期化する。
Ｓ２０１で、ＧＣ処理部３０は、参照元管理情報４０Ａ内の全小ヒープ領域について、未処理のものが有るか否かを確認する。有る場合には（Ｓ201:Yes）、Ｓ２０２に進み、無い場合には（S201:No）、Ｓ２０９に進む。
【００３２】
Ｓ２０２で、ＧＣ処理部３０は、参照元管理情報４０Ａ中の次の行を変数Ｃに設定する。
Ｓ２０３で、ＧＣ処理部３０は、変数Ｃ中の小領域識別子フィールド４１の値を変数Ｔに設定する。
Ｓ２０４で、ＧＣ処理部３０は、変数Ｃ中の参照元オブジェクトフィールド４２の値を変数Ｉに設定する。
【００３３】
Ｓ２０５で、ＧＣ処理部３０は、変数Ｉ内の全てのオブジェクトについて、その中に含まれる参照がＴの内部を指しているか否かを調べる。そのような参照を含まないオブジェクトが存在した場合（S205:No）、ＧＣ処理部３０は、Ｓ２０６で、変数Ｒに「Ｔ」を追加し、Ｓ２０１に戻る。上記のようなオブジェクトが存在しない場合（S205:Yes）、Ｓ２０１に戻る。
Ｓ２０７で、ＧＣ処理部３０は、Ｒに含まれる小ヒープ領域をＧＣ対象領域として選択する。
【００３４】
なお、Ｓ２０５において、ＧＣ処理部３０が、「Ｔ」を変数Ｒに追加するかどうかを判定する条件は、上記の条件に限定されるものではない。例えば、変数Ｉ内の全てのオブジェクトについて、その中に含まれる参照が「Ｔ」の内部を指しているか否かを調べ、もしそのような参照を含まないオブジェクトの数が、Ｊａｖａプログラム用ＡＰＩやＪａｖａＶＭ１０の起動時オプション又は外部ファイル等によって指定された閾値を超えた場合に、変数Ｒに「Ｔ」を追加することとしてもよい。あるいは、ＧＣ処理部３０は、Ｊａｖａプログラム用ＡＰＩやＪａｖａＶＭ１０の起動時オプション又は外部ファイル等によって指定された最大要素数を保持し、変数Ｒの要素数がこの最大要素数に達していない場合にのみ追加を行うことにしてもよい。
【００３５】
以上のように、第１実施形態の計算機１によれば、参照元オブジェクト名の変化を利用して、より効率的に解放対象の小ヒープ領域２１を選択することができる。即ち全小ヒープ領域２１ａ〜ｃを解放対象の候補として参照関係をチェックする必要がなく、不要領域を特定することができるため、その分高速処理が期待でき、処理負荷を低減させるという効果がある。
【００３６】
特に、計算機１は、参照元が他の小ヒープ領域２１に変更になったり、削除されたりして、不要領域（不要オブジェクトのみ又は不要オブジェクトを多く格納する領域）とみなせる小ヒープ領域を解放対象領域として選択するため解放処理における領域回収の効率も向上するという効果がある。
【００３７】
＜第２実施形態＞
第１実施形態の「参照元情報を用いたＧＣ対象の選択処理」では、参照元管理情報４０Ａ内の参照元オブジェクトフィールド４２に格納されている全てのオブジェクトについて、その内部の参照の確認を行うようになっている。
【００３８】
各小ヒープ領域２１への参照元オブジェクトが多い場合は、参照元オブジェクトフィールド４２に格納されるオブジェクト数が多くなることも想定される。第２実施形態の計算機システム２００では、より効率的な選択処理によって処理時間を短くし、プログラムの実行性能を向上させることを特徴の１つとする。より詳細には、バリアセットを用いて選択処理を効率的に実施する。
【００３９】
図６に、計算機システム２００の構成例を示す。第１実施形態との主な差異点は、ＪａｖａＶＭ１４２にバリアセット情報９０を保持する点と、参照元管理情報４０Ａに代えて、既存又は新規に追加された参照元バリアセットが管理される参照元管理情報４０Ｂを保持する点である。他の構成は第１実施形態と同様であるので、詳細な説明は省略する。
【００４０】
バリアセット情報９０は、ヒープ領域２０を固定長の領域（以下、「バリアセット領域」という。）で分割した際の、各バリアセット領域内での変更の有無を管理する情報である。バリアセット領域の領域長は、適当な固定値あるいはＪａｖａプログラム用ＡＰＩやＪａｖａＶＭ１０の起動時オプション又は外部ファイル等によって指定される値とすればよい。
【００４１】
図７に、バリアセット情報９０の構成とデータ例を模式的に示す。バリアセット情報２０は、バリアセット識別子フィールド９１と、バリアセット値フィールド９２とを有する。バリアセット情報９０は、ヒープ領域２０内のバリアセット領域と同数の行を有し、その各行が１つのバリアセット領域に対応する。バリアセット識別子フィールド９１は、対応するバリアセット領域を一意に識別する値（以下、「バリアセット識別子」という。）を保持する。バリアセット値フィールド９２は、対応するバリアセット領域内が変更されたか否かを示す値を保持する。
【００４２】
小ヒープ領域２１の領域長が、バリアセット領域の領域長の整数倍（１倍を含む。）であると、バリアセット情報９０に格納される情報がより正確となることから、選択処理においてより効率的な領域を選択することが可能となる。このため、バリアセット領域の領域長は、小ヒープ領域２１ａ等の領域長の整数分の１とすることが望ましい。
【００４３】
図８Ａに、第２実施形態における参照元管理情報４０Ｂの構成とデータ例を模式的に示す。参照元管理情報４０Ｂは、既に追加済みの参照元バリアセットを登録するフィールド４５（以下、「追加済みフィールド４５」という。）及び新規に追加された参照元バリアセットを登録するフィールド４７（以下、「新規追加フィールド４７」という。）を有する。
【００４４】
両フィールドは、０個以上のバリアセット識別子からなる。
追加済みフィールド４５に含まれるバリアセット識別子は、最後にＧＣ対象領域の選択処理が行われた時点において、対応するバリアセット領域内に、該当行に対応する小ヒープ領域２１ａ等内を参照しているオブジェクトを含んでいた識別子である。
新規追加フィールド４７に含まれるバリアセット識別子は、最後にＧＣ対象の選択処理が行われた時点以降に、対応するバリアセット領域内に、該当行に対応する小ヒープ領域２１ａ等内への参照が書き込まれた識別子である。
【００４５】
例えば、図８Ｂに例示すように、最後にＧＣ対象の選択処理が行われた時点において、小領域識別子２２ｂの値が「２」である小ヒープ領域２１ｂには、オブジェクトＢ及びＣが格納されている。オブジェクトＢ及びＣは、バリアセット識別子が「２」であるバリアセット領域内のオブジェクトＡから参照されているので、参照元管理情報４０Ｂは、小領域識別子フィールド４１が「２」で、追加済みフィールド４５が「２」である行を含むこととなる。
【００４６】
また、最後にＧＣ対象の選択処理が行われた時点において、小領域識別子２２ｃの値が「３」である小ヒープ領域２１ｃには、オブジェクトＤ及びＥが格納されている。このオブジェクトＤ及びＥのそれぞれが、バリアセット識別子が「２」であるバリアセット領域内のオブジェクトＡ及びバリアセット識別子が「４」であるバリアセット領域内のオブジェクトＢから参照されているので、参照元管理情報４３Ｂは、小領域識別子フィールド４１が「３」で、追加済みフィールド４５が「２」及び「４」である行を含むこととなる。
【００４７】
また、最後にＧＣ対象の選択処理が行われた時点以降において、上記オブジェクトＢからオブジェクトＤへの参照が、オブジェクトＢからＡへの参照に変更された場合、参照元管理情報４０Ｂは、小領域識別子フィールド４１が「１」で、新規追加フィールド４７が「４」である行を含むこととなる。
【００４８】
なお、参照元管理情報４０Ｂの追加済みフィールド４５と、新規追加フィールド４７とを纏めて１つのフィールドとしてもよいが、区分管理する方が効率的であり、好ましい。即ち最後にＧＣ対象領域の選択処理が行われた時点以降に変更されたバリアセット領域については、バリアセット情報９０中のバリアセット値フィールド９２の値が、常に「変更あり」であることが自明であるため、区別して扱った方がバリアセット情報９０中の値をより効率的に利用することができるためである。
【００４９】
図９に、計算機２００のＪａｖａプログラム実行部５０が、参照元管理情報４０Ｂを変更する際の「参照元情報の記録処理」の流れを示す。
先ず、Ｊａｖａプログラム実行部５０は、Ｊａｖａプログラム７０を実行している途中で、各小ヒープ領域２１に格納されているオブジェクト内の参照が変更された時点等の所定タイミングで、本処理を開始する。
【００５０】
Ｓ３００で、Ｊａｖａプログラム実行部６０は、内部に格納している参照が変更されたオブジェクトを含むバリアセット領域のバリアセット識別子を変数Ｓに代入する。
Ｓ３０１で、Ｊａｖａプログラム実行部６０は、変更後の新しい参照が指し示すヒープ位置を含む小ヒープ領域２１に対応する小領域識別子２２を変数Ｄに代入する。
Ｓ３０２で、Ｊａｖａプログラム実行部６０は、参照元管理情報４０Ｂ中で、小領域識別子フィールド４１が「Ｄ」である行について、新規追加フィールド４７に「Ｓ」を追加する。
なお、該当行の新規追加フィールド４７に、既に「Ｓ」が含まれていれば、何もしなくてもよい。また、「Ｓ」が、小領域識別子４１が「Ｄ」に対応する小ヒープ領域２１に含まれる場合も、何もしなくてもよい。
【００５１】
Ｓ３０３で、Ｊａｖａプログラム実行部６０は、バリアセット情報９０中で、バリアセット識別子フィールド９１が「Ｄ」である行について、バリアセット値フィールド９２の値を「変更あり」にする。その後、Ｊａｖａプログラム実行部６０は、本処理フローを終了する。
【００５２】
図１０に、第２実施形態において、ＧＣ処理部３０が、参照元管理情報４０Ｂに基づいて、処理対象とする小ヒープ領域２１ａ等を選択する際の「参照元情報を用いたＧＣ対象の選択処理」の流れを示す。本処理は、Ｓ４０４、Ｓ４０５、Ｓ４０６及びＳ４０９の処理が、第１実施形態における「選択処理（図５）」と異なり、その他のステップは同様である。
【００５３】
Ｓ４００で、ＧＣ処理部３０は、変数Ｒを空の集合に初期化する。
【００５４】
Ｓ４０１で、ＧＣ処理部３０は、参照元管理情報４０Ｂ内の全ての小ヒープ領域中で見処理の領域が有るか否かをチェックする。有る場合には（Ｓ401:Yes）、Ｓ４０２に進み、無い場合には（S401:No）、ステップＳ４０８に進む。
【００５５】
Ｓ４０２で、ＧＣ処理部３０は、参照元管理情報４０Ｂ中の次の行を変数Ｃに設定する。
Ｓ４０３で、ＧＣ処理部３０は、変数Ｃ中の小領域識別子フィールド４１の値を変数Ｔに設定する。
Ｓ４０４で、ＧＣ処理部３０は、変数Ｃ中の追加済みフィールド４５の値を変数Ｉに設定する。
【００５６】
Ｓ４０５で、ＧＣ処理部３０は、Ｃ中の新規追加フィールド４７の要素を、Ｃ中の追加済みフィールド４５に追加し、新規追加フィールド４７の値を空にする。なお、追加済みフィールド４５に含まれていた要素については追加しなくても良い。
【００５７】
Ｓ４０６で、ＧＣ処理部３０は、変数Ｉ内の全てのバリアセット識別子について、バリアセット情報９０の対応する行を調べ、対応する行のバリアセット値フィールド９２の値が「変更あり」であるバリアセット識別子が存在するか否かをチェックする。パリアセット値フィールド９２の値が「変更あり」であるオブジェクトが存在する場合（S406:Yes）、ＧＣ処理部３０は、Ｓ４０７に進み、変数Ｒに「Ｔ」を追加してＳ４０１に戻る。そのようなオブジェクトが存在しない場合（S406：No）、Ｓ２０１に戻る。なお、図５のステップＳ２０５と同様、ＧＣ処理部３０が「Ｔ」を変数Ｒに追加するかどうかを判定する条件は、上記の条件に限定されるものではない。
【００５８】
Ｓ４０７で、ＧＣ処理部３０は、「Ｒ」に含まれる小ヒープ領域をＧＣ対象領域として選択する。
その後、Ｓ４０８で、ＧＣ処理部３０は、バリアセット情報９０中の全ての行について、バリアセット値フィールド９１の値を「変更無し」に設定し、本処理を終了する。
【００５９】
このように、第２実施形態の計算機２００によれば、各小ヒープ領域１４２１１への参照元オブジェクトが多い場合に、解放対象領域を効率的に選択することができる。
【００６０】
以上、本発明を実施するための形態について説明したが、本発明は上記種々の例に限定されるものではなく、その趣旨を逸脱しない範囲で種々の構成等が適用できる。例えば、上記例では、各機能部をＣＰＵとプログラムの協働による機能部とする例を上げたが、これらの一部をハードウェアとして構成することも可能である。各種処理の順番を入れ替えることも可能である。
【００６１】
なお、本実施形態における種々のプログラムは、電子・電気及び／又は磁気的な可搬性の非一時的な記録媒体に格納することもできるし、インターネット等のネットワークを介してダウンロード及びインストールことも可能である。
【符号の説明】
【００６２】
１及び２００・・・計算機、７０・・・Ｊａｖａプログラム、１０・・・ＪａｖａＶＭ、２０・・・ヒープ領域、３０・・・ＧＣ処理部、４０Ａ及び４０Ｂ・・・参照元管理情報、５０・・・参照ルート、６０・・・Ｊａｖａプログラム実行部、９０・・・バリアセット情報
【図１】
0005899369.tif 000002
【図２】
0005899369.tif 000003
【図３Ａ】
0005899369.tif 000004
【図３Ｂ】
0005899369.tif 000005
【図４】
0005899369.tif 000006
【図５】
0005899369.tif 000007
【図６】
0005899369.tif 000008
【図７】
0005899369.tif 000009
【図８Ａ】
0005899369.tif 000010
【図８Ｂ】
0005899369.tif 000011
【図９】
0005899369.tif 000012
【図１０】
0005899369.tif 000013