(57)【要約】      （修正有）【課題】並行型ガーベジコレクションにおいて、アプリケーションプログラムの処理の停止時間を減らす。【解決手段】情報処理方法は、（Ａ）複数の領域に分割されたヒープ領域１０１から、第１のポインタが指すオブジェクトを特定し、（Ｂ）特定されたオブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、（Ｃ）ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域と判断した場合に、特定されたオブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで第１のポインタを更新する処理を含む。【選択図】図１
2014044472.tif 000002
【特許請求の範囲】
【請求項１】
複数の領域に分割されたヒープ領域から、第１のポインタが指すオブジェクトを特定し、
特定された前記オブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、
前記ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であると判断した場合に、特定された前記オブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで前記第１のポインタを更新する
処理をコンピュータが実行する情報処理方法。
【請求項２】
前記ヒープ領域における前記複数の領域の中のうち第１の領域に対してガーベジコレクションを実行する場合、前記第１の領域のオブジェクトの移動先の領域である第２の領域を確保し、
前記ヒープ領域を使用してアプリケーションプログラムの処理を実行する処理部が前記第１の領域のオブジェクトに対して書き込みをすることを禁止し且つ読み出しをすることを可能とするための設定をし、
前記第１の領域のオブジェクトを、前記第２の領域にコピーする、
処理を前記コンピュータがさらに実行する請求項１記載の情報処理方法。
【請求項３】
前記２の領域を確保する処理において、
前記第１の領域のオブジェクトの移動先のアドレスを当該第１の領域のオブジェクトに格納し、
前記処理部が、
前記第１の領域におけるオブジェクトに対して読み出し又は書き込みのためにアクセスする場合、当該オブジェクトの移動先のアドレスを当該オブジェクトから取得し、当該オブジェクトを指す第２のポインタを、取得した前記移動先のアドレスで更新し、
更新後の前記第２のポインタによって、前記第２の領域にコピーされたオブジェクトにアクセスする
ことを特徴とする請求項２記載の情報処理方法。
【請求項４】
複数の領域に分割されたヒープ領域から、第１のポインタが指すオブジェクトを特定し、
特定された前記オブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、
前記ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であると判断した場合に、特定された前記オブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで前記第１のポインタを更新する
処理をコンピュータに実行させるためのプログラム。
【請求項５】
メモリと、
前記メモリにおける、複数の領域に分割されたヒープ領域から、第１のポインタが指すオブジェクトを特定し、特定された前記オブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、前記ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であると判断した場合に、特定された前記オブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで前記第１のポインタを更新する処理部と、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ガーベジコレクションに関する。
【背景技術】
【０００２】
ストップザワールド型と呼ばれる、スループット重視のガーベジコレクションにおいては、実際にガーベジコレクションが開始すると、ヒープ領域を利用するアプリケーションプログラムの処理は停止する。
【０００３】
一方、並行型ガーベジコレクション（コンカレントガーベジコレクションとも呼ばれる）においては、ガーベジコレクションにおける一部の処理をアプリケーションプログラムの処理と並行して行うことができる。
【０００４】
並行型ガーベジコレクションとして、例えば以下のような技術が知られている。具体的には、生存オブジェクトの再配置をせず、空き領域をフリーリストで管理することにより、アプリケーションプログラムの処理をマーキングと並行して行う技術がある。しかし、この技術では、空き領域が分断されてしまうという問題がある。
【０００５】
また、空き領域が分断されるという問題を解消するため、生存オブジェクトを再配置する技術がある。この技術では、生存オブジェクトを再配置する際、配置先となる領域を限定することで、アプリケーションプログラムの処理の停止時間を短縮している。
【０００６】
また、リードバリアを利用することにより、マーキング及び退避（ここでは、再配置及び参照ポインタの更新を含む）をアプリケーションプログラムの処理と並行して行う技術がある。この技術においては、マーキングを要する追加の参照ポインタの検出、及び退避されたオブジェクトの検出にリードバリアを利用している。
【０００７】
また、アプリケーションプログラムの処理と並行して、ヤング世代（第一世代とも呼ばれる）の生存オブジェクトを退避させる技術がある。
【０００８】
しかし、通常、参照ポインタを更新する場合には、メモリ空間全体をスキャンして全ての参照ポインタを探す必要があるため、更新に時間がかかる。そのため、参照ポインタの更新時にアプリケーションプログラムの処理を停止する並行型ガーベジコレクションでは、アプリケーションプログラムの処理の停止時間が長くなることがある。
【０００９】
また、特に生存オブジェクトの移動する処理（すなわち、移動先の領域に生存オブジェクトをコピーする処理）をアプリケーションプログラムの処理と並行で実行することについては、上で述べた技術では十分ではない。上で述べた技術では、例えばリードバリアを利用する方法を採用しているが、このような方法は処理コストが高いという問題がある。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】米国特許第７３４０４９４号
【特許文献２】米国特許第７６６０９６１号
【非特許文献】
【００１１】
【非特許文献１】Tony Printezis、David Detlefs、"A Generational Mostly-concurrent Garbage Collector"、[online]、２０００年６月、Oracle Labs、[平成２４年８月２４日検索]、インターネット
【非特許文献２】David Detlefs、Christine Flood、Steve Heller、Tony Printezis、"Garbage-First Garbage Collection"、[online]、２００４年１０月、Oracle Labs、[平成２４年８月２４日検索]、インターネット
【非特許文献３】Cliff Click、Gil Tene、Michael Wolf、"The Pauseless GC Algorithm"、[online]、２００５年６月、Association for Computing Machinery、[平成２４年８月２４日検索]、インターネット
【発明の概要】
【発明が解決しようとする課題】
【００１２】
従って、１つの側面では、本発明の目的は、並行型ガーベジコレクションにおいて、アプリケーションプログラムの処理の停止時間を減らすための技術を提供することである。
【課題を解決するための手段】
【００１３】
本発明に係る情報処理方法は、（Ａ）複数の領域に分割されたヒープ領域から、第１のポインタが指すオブジェクトを特定し、（Ｂ）特定されたオブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、（Ｃ）ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域と判断した場合に、特定されたオブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで第１のポインタを更新する処理を含む。
【発明の効果】
【００１４】
並行型ガーベジコレクションにおいて、アプリケーションプログラムの処理の停止時間を減らすことができるようになる。
【図面の簡単な説明】
【００１５】
【図１】図１は、本実施の形態における情報処理装置の機能ブロック図である。
【図２】図２は、世代領域が創成されてから解放されるまでに行われる処理の処理フローである。
【図３】図３は、フェーズの進行について説明するための図である。
【図４】図４は、ヒープ領域に対するアクセスについて説明するための図である。
【図５】図５は、世代領域の状態の推移について説明するための図である。
【図６】図６は、マーキング処理の処理フローを示す図である。
【図７】図７は、マーキング処理の処理フローを示す図である。
【図８】図８は、参照ポインタの更新について説明するための図である。
【図９】図９は、解放処理の処理フローを示す図である。
【図１０】図１０は、確保処理の処理フローを示す図である。
【図１１】図１１は、移動処理の処理フローを示す図である。
【図１２】図１２は、オブジェクトを移動する処理を並列で実行する例を示す図である。
【図１３】図１３は、オブジェクトを移動する処理を並列で実行する例を示す図である。
【図１４】図１４は、設定処理の処理フローを示す図である。
【図１５】図１５は、アプリケーション処理部がオブジェクトにアクセスする際に実行する処理の処理フローを示す図である。
【図１６】図１６は、世代管理テーブルについて説明するための図である。
【図１７】図１７は、世代領域の状態の推移について説明するための図である。
【図１８】図１８は、アクセサとして実行するプログラムの一例を示す図である。
【図１９】図１９は、アクセサとして実行するプログラムの一例を示す図である。
【図２０】図２０は、アプリケーション処理部がオブジェクトにアクセスする際に実行する処理の処理フローを示す図である。
【図２１】図２１は、オブジェクトへの書き込みの具体例を示す図である。
【図２２】図２２は、オブジェクトへの書き込みの具体例を示す図である。
【図２３】図２３は、オブジェクトへの書き込みの具体例を示す図である。
【図２４】図２４は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１６】
図１に、本実施の形態における情報処理装置１の機能ブロック図を示す。情報処理装置１は、ヒープ領域１０１と、マーキング部１０３１、移動部１０３３及び設定部１０３９を含むガーベジコレクタ部１０３と、アプリケーション処理部１０５と、ルートセット１０７と、アクセサ１０９と、参照更新部１１１とを含む。また、移動部１０３３は、第１処理部１０３５及び第２処理部１０３７を含む。これらの処理部等は、単一のプロセス空間に実装可能となっている。
【００１７】
ヒープ領域１０１は、アプリケーション処理部１０５が処理を実行する際に利用するメモリ領域である。ヒープ領域１０１には、アプリケーション処理部１０５のオブジェクト生成要求によってオブジェクトが生成される。本実施の形態において、オブジェクトとは、データが格納される領域である。ヒープ領域１０１における丸の図形はオブジェクトを示している。ヒープ領域１０１は、所定のサイズを有する複数の世代領域に分割されている。世代領域とは、世代別ガーベジコレクションにおける、ヒープ領域の分割単位である。本実施の形態において、世代領域のサイズは、メモリプロテクトの単位であるページサイズの倍数とする。但し、世代領域の数に限定は無い。
【００１８】
ガーベジコレクタ部１０３は、ガーベジコレクションを実行する。マーキング部１０３１は、マークフェーズの処理を実行する。移動部１０３３における第１処理部１０３５及び第２処理部１０３７は、移動フェーズの処理を実行する。設定部１０３９は、参照更新フェーズの処理を実行する。ガーベジコレクタ部１０３の数は複数である場合もある。
【００１９】
アプリケーション処理部１０５は、ユーザが開発したアプリケーションプログラムをインタプリタ又はコンパイラとして処理する。アプリケーションプログラム処理部１０５は、例えばユーザスレッドである。アプリケーション処理部１０５は、オブジェクト生成要求を出力することにより、ヒープ領域１０１にオブジェクトを生成する。アプリケーション処理部１０５は、読み出し要求及び書き込み要求を出力することにより、アクセサ１０９を介してオブジェクトにアクセスする。アプリケーション処理部１０５の数は複数である場合もある。
【００２０】
ルートセット１０７は、参照ポインタの集合である。参照ポインタの集合は、例えばスタック及びレジスタ内にある参照ポインタ及びシステム（例えばＪａｖａ（登録商標）仮想マシン等）が保持する参照ポインタを含む。なお、本実施の形態においては、オブジェクトを指すポインタのことを参照ポインタと呼ぶ。
【００２１】
アクセサ１０９は、アプリケーション処理部１０５からの要求に応じ、ヒープ領域１０１内のオブジェクトにアクセスする。また、アクセサ１０９は、世代領域毎に設けられた参照更新部１１１に、参照ポインタの更新を行わせる。
【００２２】
（１）本実施の形態における並行型ガーベジコレクションの概要
図２を用いて、本実施の形態の並行型ガーベジコレクションにおけるフェーズの推移について説明する。図２は、特定の世代領域が創成されてから解放されるまでに行われる処理の処理フローである。なお、「並行」とは、異なる作業を同時に行うことを意味している。
【００２３】
本実施の形態における並行型ガーベジコレクションは、非回収フェーズと、マークフェーズと、移動フェーズと、参照更新フェーズとを含む。
【００２４】
非回収フェーズは、ステップＳ１００１及びＳ１００２を含む。
【００２５】
ガーベジコレクタ部１０３は、世代領域を創成する（ステップＳ１００１）。具体的には、例えばＵＮＩＸ（登録商標）系のＯＳ（Operating System）であればＰＲＯＴ＿ＮＯＮＥであった領域（すなわち、未使用であった領域）をＰＲＯＴ＿ＲＥＡＤ｜ＰＲＯＴ＿ＷＲＩＴＥに設定する。この処理は、メモリコミットとも呼ばれる。
【００２６】
アプリケーション処理部１０５は、創成された世代領域にオブジェクトを生成すると共に、オブジェクトにアクセスする（ステップＳ１００２）。なお、非回収フェーズにおいてアプリケーション処理部１０５がオブジェクトにアクセスする際には、ライトバリア及び参照更新処理は行われない。
【００２７】
マークフェーズは、ステップＳ１００３乃至Ｓ１００６を含む。
【００２８】
マーキング部１０３１は、マーキング処理を実施する（ステップＳ１００３）。具体的には、マーキング部１０３１は、参照ポインタによって到達可能なオブジェクトに対して、生存オブジェクトであることを表すマークを付与する。なお、マーキング処理については後で詳細に説明する。また、生存オブジェクトとは、参照ポインタによって到達可能なオブジェクトである。
【００２９】
マーキング部１０３１は、オブジェクトの生存率を算出する（ステップＳ１００４）。生存率は、例えば、世代領域のサイズに対する生存オブジェクトのサイズ又は数に基づき算出される。
【００３０】
マーキング部１０３１は、世代領域に生存オブジェクトが存在する（すなわちオブジェクトの生存率が０％ではない）か判断する（ステップＳ１００５）。世代領域に生存オブジェクトが存在しない場合（ステップＳ１００５：Ｎｏルート）、すなわち生存率が０％である場合、その世代領域を解放してもよいので、ステップＳ１０１１の処理に移行する。
【００３１】
一方、世代領域に生存オブジェクトが存在する場合、すなわちオブジェクトの生存率が０％ではない場合（ステップＳ１００５：Ｙｅｓルート）、マーキング部１０３１は、生存率が所定の閾値未満であるか判断する（ステップＳ１００６）。閾値は、例えば５０（％）である。
【００３２】
生存率が所定の閾値以上である場合（ステップＳ１００６：Ｎｏルート）、その世代領域を解放すべきでないので、ステップＳ１００２の処理に戻る。一方、生存率が所定の閾値未満である場合（ステップＳ１００６：Ｙｅｓルート）、ステップＳ１００７に移行する。
【００３３】
このように、ガーベジコレクションの対象となる世代領域（以下、回収対象の世代領域と呼ぶ）であると判断するまでは、たとえ不要であるオブジェクトであったとしても回収をせず、世代領域内のいかなるオブジェクトも移動しない。
【００３４】
移動フェーズは、ステップＳ１００７及びＳ１００８を含む。
【００３５】
移動部１０３３における第１処理部１０３５は、確保処理を実行する（ステップＳ１００７）。具体的には、回収対象の世代領域のオブジェクトの移動先の領域を確保する。なお、確保処理については、後で詳細に説明する。
【００３６】
移動部１０３３における第２処理部１０３７は、移動処理を実行する（ステップＳ１００８）。具体的には、回収対象の世代領域のオブジェクトを、確保された領域にコピーする。なお、移動処理については、後で詳細に説明する。
【００３７】
参照更新フェーズは、ステップＳ１００９及びＳ１０１０を含む。なお、参照更新とは、移動先のオブジェクトが正しく参照されるように、移動元のオブジェクトを指す参照ポインタを、移動先のオブジェクトのアドレスに更新することをいう。
【００３８】
設定部１０３９は、参照更新の設定処理を実施する（ステップＳ１００９）。参照更新の設定処理については、後で詳細に説明する。そして、参照更新の設定処理が実施されると、アプリケーション処理部１０５は、参照ポインタの更新を行う（ステップＳ１０１０）。また、次のマークフェーズが開始している場合には、マーキング部１０３１も参照ポインタを更新する。
【００３９】
そして、ガーベジコレクタ部１０３は、解放処理を実施する（ステップＳ１０１１）。具体的には、例えばＰＲＯＴ＿ＲＥＡＤであった領域（すなわち、読み出し専用であった領域）をＰＲＯＴ＿ＮＯＮＥ（アクセス不可）に設定する。この処理は、メモリアンコミットとも呼ばれる。解放処理については、後で詳細に説明する。そして処理は終了する。
【００４０】
このように、回収対象とならない限り、非回収フェーズとマークフェーズとを交互に繰り返す。マークフェーズの結果、回収対象となった世代領域は、移動フェーズ及び参照更新フェーズを経て解放される。
【００４１】
次に、図３を用いて、本実施の形態の並行型ガーベジコレクションの進行について説明する。前提として、以下のような動作条件が設定されているとする。
【００４２】
（ａ）マークフェーズは、全世代領域を同時に対象とする。（ｂ）マークフェーズにおいて回収対象ではないとされた世代領域は非回収フェーズに移行する。（ｃ）移動フェーズ及び参照更新フェーズは、回収対象とする世代領域のみで実行される。（ｄ）マークフェーズの期間と参照更新フェーズの期間とは重なる。マークフェーズが完了することで参照更新フェーズが完了する。（ｅ）移動フェーズ完了後、ヒープ領域１０１のサイズ又はガーベジコレクションの進捗状況等に基づき、次のマークフェーズを開始するまでにガーベジコレクタ部１０３の休止期間を設けてもよい。（ｆ）アプリケーション処理部１０５が世代領域にアクセスする際に実行される参照更新処理は、世代領域の創成時に無効に設定され、参照更新フェーズの開始時に有効に設定される。（ｇ）移動フェーズにおいては、回収対象の世代領域のオブジェクトへの書き込みを禁止する。（ｈ）参照更新フェーズが完了すると、世代領域は解放される。
【００４３】
まず、マークフェーズ（１）が行われると、回収対象の世代領域が特定される。回収対象の世代領域は移動フェーズ（１）に移行し、回収対象ではない世代領域は非回収フェーズに移行する。移動フェーズ（１）においては、回収対象の世代領域は読み出しのみ可能となるように設定される。非回収フェーズの世代領域は、読み出し及び書き込みが可能である。非回収フェーズの期間は、マークフェーズ完了後、回収対象外の世代領域について次回のマークフェーズが開始するまでの期間である。
【００４４】
移動フェーズ（１）が完了すると、参照更新フェーズ（１）が開始する。参照更新フェーズ（１）においては、設定部１０３９が、参照更新処理が有効になるように設定をする。すると、移動フェーズ（１）において移動されたオブジェクトを指す参照ポインタは、アプリケーション処理部１０５がそのオブジェクトにアクセスする際に更新される。また、マークフェーズ（２）が開始すると、マーキング部１０３１が、参照ポインタを更新する。そして、参照更新フェーズ（１）及びマークフェーズ（２）が完了すると、マークフェーズ（１）によって回収対象となった世代領域は読み出し及び書き込みが不可になるように設定される（すなわち、解放され未使用の状態となる）。
【００４５】
マークフェーズ（２）が行われると、回収対象の世代領域が特定される。回収対象の世代領域は移動フェーズ（２）に移行し、回収対象ではない世代領域は非回収フェーズに移行する。移動フェーズ（２）においては、回収対象の世代領域は読み出しのみ可能となるように設定される。非回収フェーズの世代領域は、読み出し及び書き込みが可能である。
【００４６】
移動フェーズ（２）が完了すると、参照更新フェーズ（２）が開始する。参照更新フェーズ（１）においては、設定部１０３９が、参照更新処理が有効になるように設定をする。すると、移動フェーズ（２）において移動されたオブジェクトを指す参照ポインタは、アプリケーション処理部１０５がそのオブジェクトにアクセスする際に更新される。また、マークフェーズ（３）が開始すると、マーキング部１０３１が、参照ポインタを更新する。
【００４７】
このように、マーキング処理において回収対象とされた世代領域についての参照更新は、マーキング処理の後にアプリケーション処理部１０５によって行われるか、又は次回のマーキング処理において行われる。また、移動フェーズにおいては読み出しのみが可能となるので、移動元のオブジェクトと移動先のオブジェクトとが同じであることを担保できる。また、読み出しについてはアプリケーション処理部１０５の処理を停止しなくて済み、回収対象ではない世代領域についてはアプリケーション処理部１０５は通常どおり処理を行える。
【００４８】
図４に、各フェーズにおいてヒープ領域１０１に対して行われるアクセスを示す。図４には、アプリケーション処理部１０５及びガーベジコレクタ部１０３の各々について、ヒープ領域１０１に対するアクセスに関連する処理がフェーズ毎に示されている。
【００４９】
次に、図５を用いて、世代領域の状態の推移について説明する。
【００５０】
前提として、（１）に示すように、ヒープ領域１０１内に１０の世代領域Ｇ１乃至Ｇ１０が設けられており、Ｇ１乃至Ｇ６が使用可能となっており、Ｇ７乃至Ｇ１０が未使用となっているとする。また、半分以上（すなわち、５つ以上）の世代領域が使用可能になった時点でマークフェーズが開始するものとする。また、マークフェーズ開始前に生成されたオブジェクトはマーキングの対象であり、マークフェーズ開始後に生成されたオブジェクトはルートとして取り扱う。
【００５１】
マークフェーズが行われた結果、Ｇ１、Ｇ４及びＧ５が回収対象になり、（２）の状態になったとする。回収対象の世代領域は３つなので、３つ分の代替領域を創成可能な状態にする。このように代替領域を用意するのは、以下のような理由による。すなわち、世代領域が解放されるまでの間、オブジェクトは移動元の世代領域と移動先の世代領域とに重複して存在しているので、その分だけ使用可能なヒープ領域が減ることになる。そこで、常に１０個分の世代領域を使用することができるように、代替領域を用意しておく。
【００５２】
Ｇ１、Ｇ４及びＧ５のオブジェクトの移動先としてＧ７が確保され、新たにＧ８及びＧ９が創成された結果、（３）に示す状態になったとする。移動フェーズが完了すると、参照更新フェーズが開始する。そして、使用中の世代領域が５つ以上になったのでマークフェーズが開始する。
【００５３】
マークフェーズが行われた結果、Ｇ３及びＧ８が回収対象になり、Ｇ１、Ｇ４及びＧ５が解放され、（４）の状態になったとする。回収対象の世代領域は２つなので、２つ分の代替領域を創成可能な状態にする。
【００５４】
Ｇ３及びＧ８のオブジェクトの移動先としてＧ４が確保され、Ｇ１及びＧ５が創成された結果、（５）に示す状態になったとする。移動フェーズが完了すると、参照更新フェーズが開始する。そして、使用中の世代領域が５つ以上になったのでマークフェーズが開始する。
【００５５】
マークフェーズが行われた結果、Ｇ２、Ｇ５及びＧ９が回収対象になり、Ｇ３及びＧ８が解放され、（６）の状態になったとする。回収対象の世代領域は３つなので、３つ分の代替領域を創成可能な状態にする。
【００５６】
Ｇ２、Ｇ５及びＧ９のオブジェクトの移動先がＧ４になり、Ｇ３が創成された結果、（７）に示す状態になったとする。移動フェーズが完了すると、参照更新フェーズが開始する。そして、使用中の世代領域が５つ以上になったのでマークフェーズが開始する。
【００５７】
マークフェーズが行われた結果、Ｇ７が回収対象になり、Ｇ２、Ｇ５及びＧ９が解放され、（８）の状態になったとする。回収対象の世代領域は１つなので、１つ分の代替領域を創成可能な状態にする。
【００５８】
Ｇ７のオブジェクトの移動先がＧ２になり、Ｇ８が創成された結果、（９）に示す状態になったとする。移動フェーズが完了すると、参照更新フェーズが開始する。そして、使用中の世代領域が５つ以上になったのでマークフェーズが開始する。
【００５９】
なお、上で述べた例では、最大で９つの世代領域が回収対象となる可能性があるため、回収対象の世代領域の代替領域として９つの世代領域分のアドレス空間を予め予約しておいてもよい。
【００６０】
（２）マークフェーズ
次に、図６乃至図８を用いて、マーキング部１０３１が実行するマーキング処理について説明する。
【００６１】
マーキング部１０３１は、未処理の参照ポインタが有るか判断する（図６：ステップＳ１）。ステップＳ１においては、ルートセット１０７に含まれる参照ポインタ及びライトバリア又はリマークによって検出された参照ポインタの中に、未処理の参照ポインタが有るか判断する。
【００６２】
なお、ライトバリアとは、アプリケーション処理部１０５がオブジェクトに格納されているデータを書き換えることによる、オブジェクトの参照関係の変更を検出することをいう。また、リマークとは、並行型のマーキングにおいて、マークフェーズ開始時におけるルートセット１０７との差分を検出し、アプリケーション処理部１０５の処理を停止してマークし直す処理である。通常は、差分はごく僅かであるため、アプリケーション処理部１０５の処理の停止時間は問題とならない。マークフェーズが開始する前であれば、ライトバリア及びリマークを実行しなくてもよい。しかし、マークフェーズが開始した後は、移動元のオブジェクト（すなわち、不要となったオブジェクト）を指す参照ポインタは未到達になるため、ライトバリア及びリマークを実行する。
【００６３】
未処理の参照ポインタが無い場合（ステップＳ１：Ｎｏルート）、元の処理に戻る。一方、未処理の参照ポインタが有る場合（ステップＳ１：Ｙｅｓルート）、マーキング部１０３１は、未処理の参照ポインタを１つ特定する（ステップＳ３）。また、マーキング部１０３１は、特定された参照ポインタが指すオブジェクトをヒープ領域１０１から特定する（ステップＳ４）。
【００６４】
マーキング部１０３１は、特定されたオブジェクトが、参照更新フェーズの世代領域のオブジェクトであるか判断する（ステップＳ５）。ステップＳ５においては、そのオブジェクトに移動先のアドレスが格納されているか否かによって判断する。なお、参照更新フェーズの世代領域のオブジェクトは、移動元のオブジェクトであり、移動元のオブジェクトには、直近の移動フェーズにおいて移動先のアドレスが格納されている。
【００６５】
参照ポインタが、参照更新フェーズの世代領域のオブジェクトを指していない場合（ステップＳ５：Ｎｏルート）、参照ポインタの更新をしなくてもよいので、ステップＳ９の処理に移行する。一方、参照ポインタが、参照更新フェーズの世代領域のオブジェクトを指している場合（ステップＳ５：Ｙｅｓルート）、マーキング部１０３１は、以下のような処理を実行する。具体的には、マーキング部１０３１は、参照ポインタが指すオブジェクトに格納されている移動先のアドレスを取り出し、移動先のアドレスで参照ポインタを更新する（ステップＳ７）。
【００６６】
マーキング部１０３１は、参照ポインタが指すオブジェクトにマークが有るか判断する（ステップＳ９）。マークが無い場合（ステップＳ１１：Ｎｏルート）、マーキング部１０３１は、参照ポインタが指すオブジェクトにマークを付与する（ステップＳ１１）。そして処理は端子Ｂを介して図７のステップＳ１７に移行する。なお、ステップＳ７において参照ポインタが更新されている場合には、移動先のオブジェクトにマークが付与される。
【００６７】
一方、マークが有る場合（ステップＳ９：Ｙｅｓルート）、マーキングスタックにおける次の参照ポインタについて処理するため、処理は端子Ａを介して図７のステップＳ１３に移行する。
【００６８】
図７の説明に移行し、マーキング部１０３１は、マーキングスタックに参照ポインタが有るか判断する（ステップＳ１３）。マーキングスタックは、参照を辿る過程で見つかった参照ポインタを格納するための記憶領域である。マーキング部１０３１は、マーキングスタックを利用して参照を辿ることにより、到達可能なオブジェクトに漏れなく到達できるようになる。マーキングスタックを利用して参照を辿る技術は、従来からよく知られているので詳細な説明を省略する。
【００６９】
マーキングスタックに参照ポインタが有る場合（ステップＳ１３：Ｙｅｓルート）、マーキング部１０３１は、マーキングスタックから参照ポインタを取り出し、その参照ポインタが指すオブジェクトを特定する（ステップＳ１５）。マーキングスタックに参照ポインタが無い場合（ステップＳ１３：Ｎｏルート）、次の参照ポインタについて処理するため、端子Ｃを介して図６のステップＳ１に戻る。
【００７０】
マーキング部１０３１は、ステップＳ１５において特定されたオブジェクト又はステップＳ１１においてマークが付与されたオブジェクトに未処理の参照ポインタが格納されているか判断する（ステップＳ１７）。
【００７１】
未処理の参照ポインタが無い場合（ステップＳ１７：Ｎｏルート）、マーキングスタックにおける次の参照ポインタについて処理するため、ステップＳ１３の処理に戻る。一方、未処理の参照ポインタが有る場合（ステップＳ１７：Ｙｅｓルート）、マーキング部１０３１は、未処理の参照ポインタを１つ特定する（ステップＳ１９）。また、マーキング部１０３１は、特定された参照ポインタが指すオブジェクトをヒープ領域１０１から特定する（ステップＳ２０）。
【００７２】
マーキング部１０３１は、特定されたオブジェクトが、参照更新フェーズの世代領域のオブジェクトであるか判断する（ステップＳ２１）。
【００７３】
参照ポインタが、参照更新フェーズの世代領域のオブジェクトを指していない場合（ステップＳ２１：Ｎｏルート）、参照ポインタを更新しなくてもよいので、ステップＳ２５の処理に移行する。一方、参照ポインタが、参照更新フェーズの世代領域のオブジェクトを指している場合（ステップＳ２１：Ｙｅｓルート）、マーキング部１０３１は、以下のような処理を実行する。具体的には、マーキング部１０３１は、参照ポインタが指すオブジェクトに格納されている移動先のアドレスを取り出し、移動先のアドレスで参照ポインタを更新する（ステップＳ２３）。
【００７４】
マーキング部１０３１は、参照ポインタが指すオブジェクトにマークが有るか判断する（ステップＳ２５）。マークが無い場合（ステップＳ２５：Ｎｏルート）、マーキング部１０３１は、参照ポインタが指すオブジェクトにマークを付与する。また、マーキング部１０３１は、参照ポインタをマーキングスタックに積む（ステップＳ２７）。なお、ステップＳ２３において参照ポインタが更新されている場合には、移動先のオブジェクトにマークが付与される。そしてステップＳ１７の処理に戻る。また、オブジェクトにマークが有る場合（ステップＳ２５：Ｙｅｓルート）、ステップＳ１７の処理に戻る。
【００７５】
図８を用いて、参照ポインタの更新について具体的に説明する。図８においては、４つの長方形の図形はオブジェクトを表しており、矢印は参照を表しており、生存オブジェクトにはマークが付与されている。図８の左上に示された参照ポインタは、オブジェクトＡを指している。オブジェクトＡには、オブジェクトＢを指す参照ポインタ（ｏｂｊｅｃｔ  ａｄｄｒｅｓｓ１）が格納されている。マーキング処理においては、オブジェクトＢを指す参照ポインタによってオブジェクトＢに到達するが、オブジェクトＢは移動元のオブジェクト（すなわち、参照更新フェーズのオブジェクト）である。そのため、オブジェクトＢにはマークを付与せず、移動先のアドレス（ｆｏｒｗａｒｄｉｎｇ＿ａｄｄｒｅｓｓ）を取り出し、移動先のアドレスで参照ポインタを更新する。古い参照は、点線で表されている。また、更新された参照ポインタによって移動先のオブジェクトであるオブジェクトＣに到達し、オブジェクトＣにマークを付与する。オブジェクトＣには、オブジェクトＤを指す参照ポインタ（ｏｂｊｅｃｔ  ａｄｄｒｅｓｓ２）が格納されている。従って、オブジェクトＣに格納されている参照ポインタによってオブジェクトＤに到達する。
【００７６】
以上のように、マーキング処理においては、ルートセット１０７に含まれる参照ポインタ及び到達したオブジェクトに格納されている参照ポインタを漏れなくスキャンしている。そのため、マーキング処理が完了した時点で移動元のオブジェクトに到達することは無くなる。
【００７７】
そして、到達可能なオブジェクトを指す参照ポインタを更新しているため、到達できないオブジェクトを指す参照ポインタについては更新しない。すなわち、結果として無駄になる参照更新処理を省くことができるので、一部の並行型ガーベジコレクションと比べると、アプリケーション処理部１０５の処理を停止する時間が少なくて済む。
【００７８】
また、アプリケーション処理部１０５が古い参照ポインタを別の領域（例えば、ヒープ領域、スタック領域、ローカル変数領域、Ｊａｖａ（登録商標）仮想マシン等のシステムが保持している参照ポインタ群がある領域）へコピーする場合であっても、ライトバリア又はリマークによってそのコピー行為を検出し、コピーされた参照ポインタをマーキング部１０３１に通知する。これにより、オブジェクトの移動後に直ちに参照ポインタを更新しなくても、オブジェクトの参照関係の一貫性を維持することができるようになる。
【００７９】
（３）世代領域の解放
次に、図９を用いて、解放処理（Ｓ１０１１）について説明する。なお、解放処理は、他の処理と並列に実行することができる。ここで、並列とは、同じ作業を多重で処理することを意味している。
【００８０】
マークフェーズが完了すると、マーキング部１０３１は、解放の対象となる世代領域が有るか判断する（図９：ステップＳ３１）。ステップＳ３１においては、直近の移動フェーズにおいて回収対象であった世代領域が有るか判断する。
【００８１】
解放の対象となる世代領域が無い場合（ステップＳ３１：Ｎｏルート）、元の処理に戻る。一方、解放の対象となる世代領域が有る場合（ステップＳ３１：Ｙｅｓルート）、マーキング部１０３１は、その世代領域についてのアクセスカウンタの値が０より大きいか判断する（ステップＳ３３）。アクセスカウンタの値が０より大きい場合（ステップＳ３３：Ｙｅｓルート）、その世代領域を解放することはできないので、マーキング部１０３１は、ステップＳ３３の処理に戻りリトライする。
【００８２】
なお、マーキング処理が完了した後に、アプリケーション処理部１０５が直近の移動フェーズにおいて回収対象であった世代領域のオブジェクトに新たにアクセスすることは無い。そのため、基本的には、マークフェーズが完了すれば、直近の移動フェーズにおいて回収対象であった世代領域を解放することができる。但し、マークフェーズの完了する前に、直近の移動フェーズにおいて回収対象であった世代領域のオブジェクトにアクセスしようとしてアクセサ１０９の実行を開始し、アクセスが終了する前にマークフェーズが完了して世代領域が解放される可能性がある。そのような場合には、移動先のアドレスを取り出せないか、又は解放された世代領域が新たに創成されることにより誤ったデータで参照ポインタを更新してしまう可能性がある。このような問題を防ぐため、アクセスカウンタを利用して、世代領域のオブジェクトにアクセス中であるアプリケーション処理部１０５が無いことを確認した上で解放をする。
【００８３】
アクセスカウンタの値が０以下である場合（ステップＳ３３：Ｎｏルート）、マーキング部１０３１は、その世代領域をアクセス禁止に設定し、解放する（ステップＳ３５）。ステップＳ３５においては、例えばＰＲＯＴ＿ＮＯＮＥに設定することで、読み出し及び書き込みをできないようにする。そしてステップＳ３１の処理に戻る。
【００８４】
以上のような処理を実施すれば、エラー等を発生させることなく世代領域を解放できるようになる。
【００８５】
（４）移動フェーズ
次に、図１０乃至図１３を用いて、移動フェーズにおいて移動部１０３３が実行する処理について説明する。まず、図１０を用いて、確保処理（Ｓ１００７）について説明する。なお、確保処理は世代領域毎に実行される。
【００８６】
移動部１０３３における第１処理部１０３５は、回収対象の世代領域に、移動先のアドレスが格納されていないオブジェクトが有るか判断する（図１０：ステップＳ４１）。移動先のアドレスが格納されていないオブジェクトが無い場合（ステップＳ４１：Ｎｏルート）、移動先の領域は確保されているので、元の処理に戻る。
【００８７】
一方、移動先のアドレスが格納されているオブジェクトが有る場合（ステップＳ４１：Ｙｅｓルート）、第１処理部１０３５は、その生存オブジェクトの移動先の世代領域が有るか判断する（ステップＳ４３）。移動先の世代領域が有る場合（ステップＳ４３：Ｙｅｓルート）、移動先のアドレスは、移動先の世代領域に存在するオブジェクトの末尾の位置に設定されているので、ステップＳ５１の処理に移行する。
【００８８】
移動先の世代領域が無い場合（ステップＳ４３：Ｎｏルート）、第１処理部１０３５は、創成可能な未使用の世代領域が有るか判断する（ステップＳ４５）。創成可能な未使用の世代領域が無い場合（ステップＳ４５：Ｎｏルート）、本実施の形態の並行型ガーベジコレクションを実行することができないので、第１処理部１０３５は、アプリケーション処理部１０５の処理を停止する。また、第１処理部１０３５は、ヒープ領域１０１の全体に対してガーベジコレクションを実行する（ステップＳ５５）。そして元の処理に戻る。
【００８９】
一方、創成可能な未使用の世代領域が有る場合（ステップＳ４５：Ｙｅｓルート）、第１処理部１０３５は、新たに世代領域を創成する（ステップＳ４７）。なお、ガーベジコレクションを実行する際には、同じ世代領域に存在するオブジェクトの寿命が同程度であることが好ましい。しかし、生成されたばかりのオブジェクトは、ガーベジコレクションを経たオブジェクトと比べると、寿命が短いことが多い。従って、オブジェクトが新たに生成される世代領域と移動先（すなわち退避先）の世代領域とは別にすることが好ましい。
【００９０】
第１処理部１０３５は、創成した世代領域の先頭アドレスを移動先のアドレスに設定し（ステップＳ４９）、移動先のアドレスを移動元のオブジェクトに格納する（ステップＳ５１）。また、第１処理部１０３５は、オブジェクトのサイズを移動先アドレスに加算する（ステップＳ５３）。すなわち、移動先アドレスを新たに設定する。そしてステップＳ４１の処理に戻る。
【００９１】
以上のような処理を実施すれば、生存オブジェクトの移動先の領域が適切に確保されるようになる。
【００９２】
次に、図１１を用いて、移動処理（Ｓ１００８）について説明する。移動処理は、世代領域毎に実行される。
【００９３】
移動部１０３３における第２処理部１０３７は、回収対象の世代領域を読み出し専用に設定する（図１１：ステップＳ６１）。ステップＳ６１においては、例えばＰＲＯＴ＿ＲＥＡＤに設定することにより、読み出しは可能とするが書き込みは禁止する。
【００９４】
なお、メモリプロテクトによってアクセス制限された世代領域へアクセスすると、セグメント例外が発生する。セグメント例外は同期シグナルであり、トラップを発生させたアプリケーション処理部１０５（すなわちスレッド）自身がトラップハンドラの処理をする。そのため、プロセス内の複数のアプリケーション処理部１０５が同時にトラップハンドラを処理することができる。トラップハンドラでは、アプリケーション処理部１０５が、アクセス再開のための待ち事象で待ち、アクセスの再開が通知された場合にはアクセサ１０９の先頭から処理を再開する。
【００９５】
図１１の説明に戻り、第２処理部１０３７は、回収対象の世代領域の生存オブジェクトに格納されているデータを、当該生存オブジェクトに格納されている移動先のアドレスに従ってコピーする（ステップＳ６３）。そして処理を終了する。
【００９６】
なお、情報処理装置１の計算資源に余裕がある場合には、ステップＳ６３におけるコピーの処理を並列で実行してもよい。例えば図１２に示すように、世代領域毎に第２処理部１０３７を割り当て、並列で処理を実行するようにしてもよい。また、例えば図１３に示すように、１の世代領域に対して複数の第２処理部１０３７を割り当て、並列で処理を実行するようにしてもよい。また、図１２に示したような方法と図１３に示したような方法とを組み合わせてもよい。なお、図１２及び図１３においては、色が付された長方形がオブジェクトを表している。移動前のオブジェクトはオブジェクトＯ１乃至Ｏ７であり、移動後のオブジェクトにはダッシュが付されている。
【００９７】
以上のような処理を実施すれば、オブジェクトの移動中であっても、回収対象の世代領域のオブジェクトに対する読み出しを停止せずに済む。また、回収対象ではない世代領域のオブジェクトに対する書き込み及び読み出しを停止せずに済む。これにより、アプリケーションの応答時間を均一にする（すなわち、応答性能を向上させる）ことができるようになる。
【００９８】
また、回収対象の世代領域のオブジェクトに対する書き込みは禁止されているので、移動先のオブジェクトが移動元のオブジェクトと同じであることが保証されている。
【００９９】
（５）参照更新フェーズ
次に、図１４を用いて、参照更新フェーズにおいて設定部１０３９が実行する設定処理（Ｓ１００９）について説明する。なお、参照更新処理は世代領域毎に実行される。
【０１００】
まず、設定部１０３９は、回収対象の世代領域をアクセス禁止に設定する（図１４：ステップＳ７１）。ステップＳ７１においては、例えばＰＲＯＴ＿ＮＯＮＥに設定することにより、読み出し及び書き込みを禁止する。このようにするのは、アクセサ１０９が繰り返し呼び出されることによって設定部１０３９の処理が遅延すことを防ぐためである。
【０１０１】
設定部１０３９は、回収対象の世代領域についてのアクセスカウンタの値が０より大きいか判断する（ステップＳ７３）。アクセスカウンタの値が０より大きい場合（ステップＳ７３：Ｙｅｓルート）、その世代領域を解放することはできないので、設定部１０３９は、ステップＳ７３の処理に戻りリトライする。
【０１０２】
アクセスカウンタの値が０以下である場合（ステップＳ７３：Ｎｏルート）、設定部１０３９は、回収対象の世代領域の参照更新処理を有効に設定する（ステップＳ７５）。具体的には、アプリケーション処理部１０５が参照更新部１１１を介して参照ポインタを更新できるようにする。
【０１０３】
設定部１０３９は、回収対象の世代領域を読み出し専用に設定する（ステップＳ７７）。ステップＳ７７においては、例えばＰＲＯＴ＿ＲＥＡＤに設定することで、読み出しは可能とするが書き込みは禁止する。
【０１０４】
設定部１０３９は、トラップハンドラによって処理を停止しているアプリケーション処理部１０５に、オブジェクトへのアクセスの再開を通知する（ステップＳ７９）。すなわち、回収対象の世代領域がアクセス禁止に設定されていたためトラップハンドラによって処理を停止していたアプリケーション処理部１０５に対し、読み出しを再開できることを通知する。
【０１０５】
以上のような処理を実施すれば、トラップハンドラによって処理を停止していたアプリケーション処理部１０５は、トラップハンドラから復帰して参照ポインタを更新できるようになる。
【０１０６】
（６）アプリケーション処理部１０５によるアクセス
次に、図１５乃至図２３を用いて、アプリケーション処理部１０５がオブジェクトにアクセスする際の処理について説明する。
【０１０７】
まず、アプリケーション処理部１０５は、ルートセット１０７に含まれる参照ポインタが指すオブジェクトのアドレスを右シフト演算し、オブジェクトが存在する世代領域を特定する（図１５：ステップＳ８１）。
【０１０８】
図１６を用いて、ステップＳ８１の処理について説明する。図１６の例には、１メガバイトのサイズを有するＮ個の世代領域と、各世代領域に対応する世代管理テーブルとが示されている。色が付された領域は、オブジェクトが存在する領域である。世代管理テーブルは、ヒープ領域１０１とは別のメモリ領域に設けられる。世代管理テーブルには、例えば、世代領域の先頭アドレス、世代領域の末尾アドレス、世代領域のうち使用されている領域の末尾アドレス、世代領域のサイズ、世代の識別情報、参照更新処理についての情報、アクセス再開のための待ち事象の情報、アクセスカウンタ等、世代領域に関する情報が格納される。
【０１０９】
本実施の形態においては、以下のようにして世代領域を特定する。
【０１１０】
ＧｅｎｅｒａｔｉｏｎＥｎｔｒｙ＝Ｇｅｎｅｒａｔｉｏｎ．Ｔａｂｌｅ[（ｏｂｊ＿ａｄｄｒ−ｈｅａｐ＿ｓｔａｒｔ）＞＞２０]
【０１１１】
ここで、ｏｂｊ＿ａｄｄｒはオブジェクトのアドレスであり、ｈｅａｐ＿ｓｔａｒｔはヒープ領域の先頭アドレスである。従って、オブジェクト１のアドレスをＯ１、オブジェクト２のアドレスをＯ２、オブジェクト３のアドレスをＯ３とすると、図１６に示したオブジェクト１については、ＧｅｎｅｒａｔｉｏｎＥｎｔｒｙ＝Ｇｅｎｅｒａｔｉｏｎ．Ｔａｂｌｅ[（Ｏ１−ｈｅａｐ＿ｓｔａｒｔ）＞＞２０]＝ＧｅｎｅｒａｔｉｏｎＴａｂｌｅ[１]となる。オブジェクト２については、ＧｅｎｅｒａｔｉｏｎＥｎｔｒｙ＝Ｇｅｎｅｒａｔｉｏｎ．Ｔａｂｌｅ[（Ｏ２−ｈｅａｐ＿ｓｔａｒｔ）＞＞２０]＝ＧｅｎｅｒａｔｉｏｎＴａｂｌｅ[２]となる。オブジェクト３については、ＧｅｎｅｒａｔｉｏｎＥｎｔｒｙ＝Ｇｅｎｅｒａｔｉｏｎ．Ｔａｂｌｅ[（Ｏ３−ｈｅａｐ＿ｓｔａｒｔ）＞＞２０]＝ＧｅｎｅｒａｔｉｏｎＴａｂｌｅ[２]となる。
【０１１２】
従って、オブジェクト１にアクセスする場合はＧｅｎｅｒａｔｉｏｎＴａｂｌｅ[１]．ｒｅｆｅｒｅｎｃｅ＿ｕｐｄａｔｅｒを使用し、オブジェクト２及びオブジェクト３にアクセスする場合はＧｅｎｅｒａｔｉｏｎＴａｂｌｅ[２]．ｒｅｆｅｒｅｎｃｅ＿ｕｐｄａｔｅｒを使用する。
【０１１３】
また、参照更新フェーズにおいては、以下のように、参照更新処理が有効になるように設定される。
【０１１４】
ＧｅｎｅｒａｔｉｏｎＴａｂｌｅ[Ｎ]．ｒｅｆｅｒｅｎｃｅ＿ｕｐｄａｔｅｒ＝ｒｅｆｅｒｅｎｃｅ＿ｕｐｄａｔｅ；
【０１１５】
ここで、Ｎは世代領域の識別情報である。
【０１１６】
一方、参照更新フェーズ以外のフェーズにおいては、以下のように、参照更新処理が無効になるように設定される。
【０１１７】
ＧｅｎｅｒａｔｉｏｎＴａｂｌｅ[Ｎ]．ｒｅｆｅｒｅｎｃｅ＿ｕｐｄａｔｅｒ＝ｒｅｆｅｒｅｎｃｅ＿ｎｏ＿ｕｐｄａｔｅ；
【０１１８】
図１５の説明に戻り、アプリケーション処理部１０５は、ステップＳ８１において特定された世代領域のアクセスカウンタをインクリメントする（ステップＳ８３）。
【０１１９】
アプリケーション処理部１０５は、ステップＳ８１の処理において使用した参照ポインタが他者（例えば、マーキング部１０３１）によって更新されたか判断する（ステップＳ８５）。更新された場合（ステップＳ８５：Ｙｅｓルート）、エラーを発生させないようにするため、アプリケーション処理部１０５は、その世代領域のアクセスカウンタをデクリメントし（ステップＳ８７）、ステップＳ８１の処理に戻る。
【０１２０】
図１７を用いて、ステップＳ８５及びＳ８７の処理について説明する。図１７において、（１）乃至（６）の世代領域の状態は、図５における（１）乃至（６）の世代領域の状態と同じである。例えば、（１）の状態の前にアプリケーション処理部１０５がアクセサ１０９を実行し、オブジェクトＡへのアクセスを開始したとする。この場合、（３）の状態まではオブジェクトＡにアクセスしても問題は生じない。
【０１２１】
しかし、（３）の状態で参照ポインタが移動先のオブジェクトＢを指すように更新された場合に、アプリケーション処理部１０５が更新前の参照ポインタを使用すると、移動元のオブジェクトであるオブジェクトＡにアクセスし続けてしまうことになる。そして、（５）の状態において参照更新フェーズが完了し、残骸Ｘを含む世代領域が新たに創成されて使用可能な状態になった場合には、アプリケーション処理部１０５は全く異なるオブジェクトにアクセスすることになる。
【０１２２】
そこで、ステップＳ８５においては、アクセスカウンタをインクリメントした後に参照ポインタが更新された場合には、参照ポインタを再度読み直し、ステップＳ８１の処理に戻るようにする。
【０１２３】
ここで、アクセサ１０９として実行するプログラムの一例を図１８及び図１９に示す。図１８及び図１９の例では、プログラムには、世代管理エントリのＩＤを算出する処理についてのコードと、参照更新処理についてのコードと、トラップハンドラについてのコードと、ヒープ回収者（すなわちガーベジコレクタ部１０３）についてのコードと、書き込み用アクセサについてのコードと、読み出し用アクセサについてのコードと、アクセスカウンタの増減についてのコードとが含まれる。アクセサ１０９には、アクセス対象のオブジェクトを指す参照ポインタと、実際にアクセスするフィールド（すなわち、オブジェクトに格納されているデータ）の位置へのオフセット値とをパラメタとして与えられる。参照更新部１１１の処理は、図１８における「有効な参照更新処理」及び「無効な参照更新処理」の部分により実現される。
【０１２４】
図１５の説明に戻り、そのオブジェクトが存在する世代領域が回収対象ではない場合（ステップＳ８９：Ｙｅｓルート）、通常どおりアクセス可能（すなわち、ＰＲＯＴ＿ＲＥＡＤ｜ＰＲＯＴ＿ＷＲＩＴＥに設定されている）である。従って、アプリケーション処理部１０５は、オブジェクトにアクセス（すなわち、オブジェクトに格納されているデータの読み出し又はオブジェクトへのデータの書き込み）する（ステップＳ９１）。なお、世代領域が回収対象ではない場合とは、その世代領域がマークフェーズ又は非回収フェーズにある場合である。そして、アクセスが終了すると、そのオブジェクトを含む世代領域のアクセスカウンタをデクリメントする（ステップＳ９３）。そして処理を終了する。
【０１２５】
一方、その世代領域が回収対象である場合（ステップＳ８９：Ｎｏルート）、処理は端子Ｄを介して図２０のステップＳ９５に移行する。ステップＳ８９において、世代領域が回収対象である場合とは、世代領域が移動フェーズ又は参照更新フェーズにある場合である。
【０１２６】
図２０の説明に移行し、そのオブジェクトを含む世代領域が参照更新フェーズである場合（ステップＳ９５：Ｙｅｓルート）、その世代領域のオブジェクトには移動先のアドレスが格納されている。よって、アプリケーション処理部１０５は、その世代領域のオブジェクトから移動先のアドレスを読み出し、そのオブジェクトを指す参照ポインタを移動先のアドレスで更新する（ステップＳ９７）。但し、他のアプリケーション処理部１０５又はガーベジコレクタ部１０３によって参照ポインタが更新された場合には、参照ポインタを更新しない。そして、アプリケーション処理部１０５は、更新された参照ポインタによって移動先のオブジェクトにアクセスする（ステップＳ９９）。処理は端子Ｅを介して図１５のステップＳ９３に移行する。
【０１２７】
一方、そのオブジェクトを含む世代領域が参照更新フェーズではない場合（ステップＳ９５：Ｎｏルート）、そのオブジェクトは移動フェーズの世代領域に存在する。そして、その世代領域におけるオブジェクトの移動が未完了である場合（ステップＳ１０１：Ｙｅｓルート）、その世代領域は読み出し専用に設定されている。
【０１２８】
よって、オブジェクトへのアクセスが読み出しである場合（ステップＳ１０３：Ｙｅｓルート）、アプリケーション処理部１０５は、そのオブジェクトに読み出しのためアクセスする（ステップＳ１０５）。そして処理は端子Ｅを介して図１５のステップＳ９３に移行する。
【０１２９】
一方、オブジェクトへのアクセスが書き込みである場合（ステップＳ１０３：Ｎｏルート）又はオブジェクトの移動が完了している場合（ステップＳ１０１：Ｎｏルート）、アプリケーション処理部１０５はオブジェクトにアクセスすることはできない。従って、アプリケーション処理部１０５は、その世代領域のアクセスカウンタをデクリメントする（ステップＳ１０７）。また、アプリケーション処理部１０５は、ガーベジコレクタ部１０３から処理再開の通知を受信するまで待機する（ステップＳ１０９）。処理は端子Ｆを介して図１５のステップＳ８１に戻る。
【０１３０】
以上のような処理を実施すれば、実際にアプリケーション処理部１０５が回収対象の世代領域のオブジェクトにアクセスする際に参照ポインタを更新できるようになる。従って、たとえオブジェクトが移動済みであっても、更新しなくてもよい参照ポインタを更新することが無くなる。
【０１３１】
図２１乃至図２３に、オブジェクトへの書き込みの具体例を示す。図２１は、ｐｕｔｆｉｅｌｄ命令によってオブジェクトに書き込みをする例を示す。図２１では、スタックと、命令列と、オブジェクトとが示されている。アプリケーション処理部１０５がアクセスするオブジェクトを指す参照ポインタは、スタックに存在している。アプリケーション処理部１０５は、命令列におけるｐｕｔｆｉｅｌｄ命令のオペランドから、アクセスするフィールドへのオフセット（ｆｉｅｌｄ＿ｏｆｆｓｅｔ）を取り出す。また、スタックにある代入値（ｖａｌｕｅ）を、オブジェクトのオフセットの位置へ格納する。
【０１３２】
図２２は、オブジェクトの移動中に、ｐｕｔｆｉｅｌｄ命令によるオブジェクトへの書き込みがトラップされる例を示す。アクセスの方法は図２１と同様である。しかし、スタックにある代入値を、コピー中のオブジェクトにおけるオフセットの位置へ格納しようと試みるときに、メモリプロテクト（この場合、ＰＲＯＴ＿ＲＥＡＤ）によって処理がトラップされる。
【０１３３】
図２３は、参照ポインタの更新後に、ｐｕｔｆｉｅｌｄ命令によってオブジェクトに書き込みをする例を示している。アクセスの方法は図２１と同様である。但し、アプリケーション処理部１０５が移動前のオブジェクトのオフセットの位置へ代入値を格納するためにアクセサ１０９を実行している最中に、参照更新処理によって参照ポインタが更新されている。このような場合には、参照ポインタの更新後に移動先のオブジェクトにおけるオフセットの位置へ代入値を格納する。
【０１３４】
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置１の機能ブロック構成は必ずしも実際のプログラムモジュール構成に対応するものではない。
【０１３５】
また、上で説明した各テーブルの構成は一例であって、必ずしも上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
【０１３６】
なお、ガーベジコレクタ部１０３は、ステップＳ３３においてアクセスカウンタが０になったと判断してから世代領域を解放している。しかし、ガーベジコレクタ部１０３がマークフェーズの最後に、アプリケーション処理部１０５によって実行されているアクセサ内の参照を更新するようにしてもよい。このようにすれば、ステップＳ３３の処理を実行しなくて済む。
【０１３７】
また、例えばＪａｖａ（登録商標）の場合、オブジェクトの型（例えば、インスタンスオブジェクト、クラスオブジェクト及び配列オブジェクト等）に応じてアクセサを使い分けてもよい。具体的には、ｇｅｔｆｉｅｌｄ、ｐｕｔｆｉｅｌｄ、ｇｅｔｓｔａｔｉｃ、ｐｕｔｓｔａｔｉｃ、［ａ／ｂ／ｃ／ｓ／ｉ／ｌ／ｆ／ｄ］ａｌｏａｄ及び［ａ／ｂ／ｃ／ｓ／ｉ／ｌ／ｆ／ｄ／ｄ］ａｓｔｏｒｅ等の命令毎にアクセサを用意してもよい。
【０１３８】
また、上ではメモリプロテクトをＰＲＯＴ＿ＲＥＡＤ｜ＰＲＯＴ＿ＷＲＩＴＥ、ＰＲＯＴ＿ＲＥＡＤ及びＰＲＯＴ＿ＮＯＮＥによって実現する例を示した。しかし、例えばＷｉｎｄｏｗｓ（登録商標）であれば、ＰＡＧＥ＿ＲＥＡＤＷＲＩＴＥ、ＰＡＧＥ＿ＲＥＡＤ及びＰＡＧＥ＿ＤＥＣＯＭＭＩＴを用いればよい。
【０１３９】
また、例えば生存率が５０％未満の世代領域を回収対象とすると、最大でもヒープ領域１０１の１／３に相当する領域が退避用に予約されていればよい。従って、例えば予め取得した統計に基づき生存オブジェクトの総量が予測可能であるならば、世代領域１つ分のサイズ以上であってヒープ領域１０１の１／３に相当する領域のサイズ以下において適当なサイズを予約してもよい。但し、予測に失敗して退避用の領域が不足した場合には、並行型ガーベジコレクションを中断し、アプリケーション処理部１０５の処理を停止した上でガーベジコレクションをすることになる。
【０１４０】
並行型ガーベジコレクションの場合、新規なオブジェクトの生成と不要なオブジェクトの回収とが並行して行われる。オブジェクトの生成量と回収量との差について、特定のマークフェーズの開始からその次の回のマークフェーズの開始までの統計を取得し、マークフェーズ開始のタイミング又は退避用の世代領域の増減に反映してもよい。なお、オブジェクトの生成量が常に回収量を上回る場合には、メモリ不足となりシステムがダウンする。そのため、統計を取得することにより、一時的に生成量が回収量を上回ることによる問題の発生に対処することができる。
【０１４１】
なお、上で述べた情報処理装置１は、コンピュータ装置であって、図２４に示すように、メモリ２５０１とＣＰＵ（Central Processing Unit）２５０３とハードディスク・ドライブ（ＨＤＤ：Hard Disk Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【０１４２】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【０１４３】
本実施の形態に係る情報処理方法は、（Ａ）複数の領域に分割されたヒープ領域から、第１のポインタが指すオブジェクトを特定し、（Ｂ）特定されたオブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、（Ｃ）ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であると判断した場合に、特定されたオブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで第１のポインタを更新する処理を含む。
【０１４４】
このようにすれば、更新しなくてもよいポインタを更新することは無く、ポインタの更新に要する時間を減らせるので、一部の並行型ガーベジコレクションと比べると、アプリケーションプログラムの処理の停止時間を減らすことができるようになる。
【０１４５】
また、本情報処理方法が、（Ｄ）移動先のアドレスにより特定されるオブジェクトに対し、生存オブジェクトであることを表すマークを付与する処理をさらに含むようにしてもよい。ガーベジコレクションの対象となる領域のオブジェクトに対してはマークを付与しなくてもよく、移動先のオブジェクトにマークを付与すれば、参照関係の一貫性を保つことができるからである。
【０１４６】
また、本情報処理方法が、（Ｅ）ヒープ領域における複数の領域の中のうち第１の領域に対してガーベジコレクションを実行する場合、第１の領域のオブジェクトの移動先の領域である第２の領域を確保し、（Ｆ）ヒープ領域を使用してアプリケーションプログラムの処理を実行する処理部が第１の領域のオブジェクトに対して書き込みをすることを禁止し且つ読み出しをすることを可能とするための設定をし、（Ｇ）第１の領域のオブジェクトを、第２領域にコピーする処理をさらに含むようにしてもよい。このようにすれば、オブジェクトの移動中であっても、ガーベジコレクションの対象とする領域のオブジェクトに対する読み出しを停止せずに済み、またガーベジコレクションの対象ではない領域のオブジェクトに対する書き込み及び読み出しを停止せずに済む。また、ガーベジコレクションを実行する領域のオブジェクトに対する書き込みは禁止されているので、移動先のオブジェクトが移動元のオブジェクトと同じであることが保証される。
【０１４７】
また、上で述べた第２の領域を確保する処理において、（ｅ１）第１の領域のオブジェクトの移動先のアドレスを当該第１の領域のオブジェクトに格納し、上で述べた処理部が、第１の領域におけるオブジェクトに対して読み出し又は書き込みのためにアクセスする場合、当該オブジェクトの移動先のアドレスを当該オブジェクトから取得し、当該オブジェクトを指す第２のポインタを、取得した移動先のアドレスで更新し、更新後の第２のポインタによって、第２の領域にコピーされたオブジェクトにアクセスするようにしてもよい。このようにすれば、アプリケーションプログラムの処理を実行する処理部が実際にガーベジコレクションの対象となる領域にアクセスする行為の際に参照ポインタを更新するので、余計な参照ポインタを更新しなくて済む。
【０１４８】
また、本情報処理方法が、（Ｈ）第１の領域のオブジェクトにアクセスする処理部があるか否かを、アクセス中の処理部の数を計数するためのカウンタを用いて判断し、（Ｉ）第１の領域のオブジェクトにアクセスする処理部が無いと判断した場合に、第１の領域を解放する処理をさらに含むようにしてもよい。このようにすれば、処理部がオブジェクトにアクセス中であるにもかかわらず領域を解放することはなくなるので、問題が発生することを防止できるようになる。
【０１４９】
また、本情報処理方法が、（Ｊ）複数の領域のうち解放されている領域のいずれかに対し、処理部が書き込み及び読み出しをすることを可能とするための設定をする処理をさらに含むようにしてもよい。このようにすれば、処理部が、設定がされた領域を使用して処理をすることができるようになる。
【０１５０】
また、上で述べた第２の領域を確保する処理において、（ｅ２）複数の領域の中から、生存オブジェクトのサイズ又は数に基づき、ガーベジコレクションを実行する領域を特定するようにしてもよい。このようにすれば、ガーベジコレクションを実行すべき領域を適切に特定することができるようになる。
【０１５１】
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
【０１５２】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１５３】
（付記１）
複数の領域に分割されたヒープ領域から、第１のポインタが指すオブジェクトを特定し、
特定された前記オブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、
前記ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であると判断した場合に、特定された前記オブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで前記第１のポインタを更新する
処理をコンピュータが実行する情報処理方法。
【０１５４】
（付記２）
前記移動先のアドレスにより特定されるオブジェクトに対し、生存オブジェクトであることを表すマークを付与する
処理を前記コンピュータがさらに実行する付記１記載の情報処理方法。
【０１５５】
（付記３）
前記ヒープ領域における前記複数の領域の中のうち第１の領域に対してガーベジコレクションを実行する場合、前記第１の領域のオブジェクトの移動先の領域である第２の領域を確保し、
前記ヒープ領域を使用してアプリケーションプログラムの処理を実行する処理部が前記第１の領域のオブジェクトに対して書き込みをすることを禁止し且つ読み出しをすることを可能とするための設定をし、
前記第１の領域のオブジェクトを、前記第２の領域にコピーする、
処理を前記コンピュータがさらに実行する付記１又は２記載の情報処理方法。
【０１５６】
（付記４）
前記２の領域を確保する処理において、
前記第１の領域のオブジェクトの移動先のアドレスを当該第１の領域のオブジェクトに格納し、
前記処理部が、
前記第１の領域におけるオブジェクトに対して読み出し又は書き込みのためにアクセスする場合、当該オブジェクトの移動先のアドレスを当該オブジェクトから取得し、当該オブジェクトを指す第２のポインタを、取得した前記移動先のアドレスで更新し、
更新後の前記第２のポインタによって、前記第２の領域にコピーされたオブジェクトにアクセスする
ことを特徴とする付記３記載の情報処理方法。
【０１５７】
（付記５）
前記第１の領域のオブジェクトにアクセスする処理部があるか否かを、アクセス中の前記処理部の数を計数するためのカウンタを用いて判断し、
前記第１の領域のオブジェクトにアクセスする処理部が無いと判断した場合に、前記第１の領域を解放する
処理を前記コンピュータがさらに実行する付記４記載の情報処理方法。
【０１５８】
（付記６）
前記複数の領域のうち解放されている領域のいずれかに対し、前記処理部が書き込み及び読み出しをすることを可能とするための設定をする
処理を前記コンピュータがさらに実行する付記５記載の情報処理方法。
【０１５９】
（付記７）
前記第２の領域を確保する処理において、
前記複数の領域の中から、生存オブジェクトのサイズ又は数に基づき、前記ガーベジコレクションを実行する領域を特定する
ことを特徴とする付記２乃至６のいずれか１つ記載の情報処理方法。
【０１６０】
（付記８）
複数の領域に分割されたヒープ領域から、第１のポインタが指すオブジェクトを特定し、
特定された前記オブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、
前記ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であると判断した場合に、特定された前記オブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで前記第１のポインタを更新する
処理をコンピュータに実行させるためのプログラム。
【０１６１】
（付記９）
メモリと、
前記メモリにおける、複数の領域に分割されたヒープ領域から、第１のポインタが指すオブジェクトを特定し、特定された前記オブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、前記ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であると判断した場合に、特定された前記オブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで前記第１のポインタを更新する処理部と、
を有する情報処理装置。
【符号の説明】
【０１６２】
１  情報処理装置    １０１  ヒープ領域
１０３  ガーベジコレクタ部    １０３１  マーキング部
１０３３  移動部    １０３５  第１処理部
１０３７  第２処理部    １０３９  設定部
１０５  アプリケーション処理部    １０７  ルートセット
１０９  アクセサ    １１１  参照更新部
【図１】
2014044472.tif 000003
【図２】
2014044472.tif 000004
【図３】
2014044472.tif 000005
【図４】
2014044472.tif 000006
【図５】
2014044472.tif 000007
【図６】
2014044472.tif 000008
【図７】
2014044472.tif 000009
【図８】
2014044472.tif 000010
【図９】
2014044472.tif 000011
【図１０】
2014044472.tif 000012
【図１１】
2014044472.tif 000013
【図１２】
2014044472.tif 000014
【図１３】
2014044472.tif 000015
【図１４】
2014044472.tif 000016
【図１５】
2014044472.tif 000017
【図１６】
2014044472.tif 000018
【図１７】
2014044472.tif 000019
【図１８】
2014044472.tif 000020
【図１９】
2014044472.tif 000021
【図２０】
2014044472.tif 000022
【図２１】
2014044472.tif 000023
【図２２】
2014044472.tif 000024
【図２３】
2014044472.tif 000025
【図２４】
2014044472.tif 000026