JP6044181B2 - ガーベジコレクションのための情報処理方法、プログラム及び装置 - Google Patents

ガーベジコレクションのための情報処理方法、プログラム及び装置 Download PDF

Info

Publication number
JP6044181B2
JP6044181B2 JP2012184922A JP2012184922A JP6044181B2 JP 6044181 B2 JP6044181 B2 JP 6044181B2 JP 2012184922 A JP2012184922 A JP 2012184922A JP 2012184922 A JP2012184922 A JP 2012184922A JP 6044181 B2 JP6044181 B2 JP 6044181B2
Authority
JP
Japan
Prior art keywords
area
generation
generation area
phase
pointer
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2012184922A
Other languages
English (en)
Other versions
JP2014044472A5 (ja
JP2014044472A (ja
Inventor
勝友 関口
勝友 関口
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2012184922A priority Critical patent/JP6044181B2/ja
Priority to US13/972,179 priority patent/US20140059093A1/en
Publication of JP2014044472A publication Critical patent/JP2014044472A/ja
Publication of JP2014044472A5 publication Critical patent/JP2014044472A5/ja
Application granted granted Critical
Publication of JP6044181B2 publication Critical patent/JP6044181B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • G06F12/0269Incremental or concurrent garbage collection, e.g. in real-time systems
    • G06F12/0276Generational garbage collection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory
    • G06F12/0269Incremental or concurrent garbage collection, e.g. in real-time systems

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System (AREA)

Description

本発明は、ガーベジコレクションに関する。
ストップザワールド型と呼ばれる、スループット重視のガーベジコレクションにおいては、実際にガーベジコレクションが開始すると、ヒープ領域を利用するアプリケーションプログラムの処理は停止する。
一方、並行型ガーベジコレクション(コンカレントガーベジコレクションとも呼ばれる)においては、ガーベジコレクションにおける一部の処理をアプリケーションプログラムの処理と並行して行うことができる。
並行型ガーベジコレクションとして、例えば以下のような技術が知られている。具体的には、生存オブジェクトの再配置をせず、空き領域をフリーリストで管理することにより、アプリケーションプログラムの処理をマーキングと並行して行う技術がある。しかし、この技術では、空き領域が分断されてしまうという問題がある。
また、空き領域が分断されるという問題を解消するため、生存オブジェクトを再配置する技術がある。この技術では、生存オブジェクトを再配置する際、配置先となる領域を限定することで、アプリケーションプログラムの処理の停止時間を短縮している。
また、リードバリアを利用することにより、マーキング及び退避(ここでは、再配置及び参照ポインタの更新を含む)をアプリケーションプログラムの処理と並行して行う技術がある。この技術においては、マーキングを要する追加の参照ポインタの検出、及び退避されたオブジェクトの検出にリードバリアを利用している。
また、アプリケーションプログラムの処理と並行して、ヤング世代(第一世代とも呼ばれる)の生存オブジェクトを退避させる技術がある。
しかし、通常、参照ポインタを更新する場合には、メモリ空間全体をスキャンして全ての参照ポインタを探す必要があるため、更新に時間がかかる。そのため、参照ポインタの更新時にアプリケーションプログラムの処理を停止する並行型ガーベジコレクションでは、アプリケーションプログラムの処理の停止時間が長くなることがある。
また、特に生存オブジェクト移動する処理(すなわち、移動先の領域に生存オブジェクトをコピーする処理)をアプリケーションプログラムの処理と並行で実行することについては、上で述べた技術では十分ではない。上で述べた技術では、例えばリードバリアを利用する方法を採用しているが、このような方法は処理コストが高いという問題がある。
米国特許第7340494号 米国特許第7660961号
Tony Printezis、David Detlefs、"A Generational Mostly-concurrent Garbage Collector"、[online]、2000年6月、Oracle Labs、[平成24年8月24日検索]、インターネット David Detlefs、Christine Flood、Steve Heller、Tony Printezis、"Garbage-First Garbage Collection"、[online]、2004年10月、Oracle Labs、[平成24年8月24日検索]、インターネット Cliff Click、Gil Tene、Michael Wolf、"The Pauseless GC Algorithm"、[online]、2005年6月、Association for Computing Machinery、[平成24年8月24日検索]、インターネット
従って、1つの側面では、本発明の目的は、並行型ガーベジコレクションにおいて、アプリケーションプログラムの処理の停止時間を減らすための技術を提供することである。
本発明に係る情報処理方法は、複数の世代領域に分割されたヒープ領域から、第1のポインタが指す第1のオブジェクトを特定し、第1のオブジェクトの移動先のアドレスとして、第1のオブジェクトが属する第1の世代領域とは異なる第2の世代領域のアドレスが設定されているか否かを判断し、第1のオブジェクトの移動先のアドレスとして第2の世代領域のアドレスが設定されている場合には、移動先のアドレスを取得し、動先のアドレスで第1のポインタを更新する処理を含む。
並行型ガーベジコレクションにおいて、アプリケーションプログラムの処理の停止時間を減らすことができるようになる。
図1は、本実施の形態における情報処理装置の機能ブロック図である。 図2は、世代領域が創成されてから解放されるまでに行われる処理の処理フローである。 図3は、フェーズの進行について説明するための図である。 図4は、ヒープ領域に対するアクセスについて説明するための図である。 図5は、世代領域の状態の推移について説明するための図である。 図6は、マーキング処理の処理フローを示す図である。 図7は、マーキング処理の処理フローを示す図である。 図8は、参照ポインタの更新について説明するための図である。 図9は、解放処理の処理フローを示す図である。 図10は、確保処理の処理フローを示す図である。 図11は、移動処理の処理フローを示す図である。 図12は、オブジェクトを移動する処理を並列で実行する例を示す図である。 図13は、オブジェクトを移動する処理を並列で実行する例を示す図である。 図14は、設定処理の処理フローを示す図である。 図15は、アプリケーション処理部がオブジェクトにアクセスする際に実行する処理の処理フローを示す図である。 図16は、世代管理テーブルについて説明するための図である。 図17は、世代領域の状態の推移について説明するための図である。 図18は、アクセサとして実行するプログラムの一例を示す図である。 図19は、アクセサとして実行するプログラムの一例を示す図である。 図20は、アプリケーション処理部がオブジェクトにアクセスする際に実行する処理の処理フローを示す図である。 図21は、オブジェクトへの書き込みの具体例を示す図である。 図22は、オブジェクトへの書き込みの具体例を示す図である。 図23は、オブジェクトへの書き込みの具体例を示す図である。 図24は、コンピュータの機能ブロック図である。
図1に、本実施の形態における情報処理装置1の機能ブロック図を示す。情報処理装置1は、ヒープ領域101と、マーキング部1031、移動部1033及び設定部1039を含むガーベジコレクタ部103と、アプリケーション処理部105と、ルートセット107と、アクセサ109と、参照更新部111とを含む。また、移動部1033は、第1処理部1035及び第2処理部1037を含む。これらの処理部等は、単一のプロセス空間に実装可能となっている。
ヒープ領域101は、アプリケーション処理部105が処理を実行する際に利用するメモリ領域である。ヒープ領域101には、アプリケーション処理部105のオブジェクト生成要求によってオブジェクトが生成される。本実施の形態において、オブジェクトとは、データが格納される領域である。ヒープ領域101における丸の図形はオブジェクトを示している。ヒープ領域101は、所定のサイズを有する複数の世代領域に分割されている。世代領域とは、世代別ガーベジコレクションにおける、ヒープ領域の分割単位である。本実施の形態において、世代領域のサイズは、メモリプロテクトの単位であるページサイズの倍数とする。但し、世代領域の数に限定は無い。
ガーベジコレクタ部103は、ガーベジコレクションを実行する。マーキング部1031は、マークフェーズの処理を実行する。移動部1033における第1処理部1035及び第2処理部1037は、移動フェーズの処理を実行する。設定部1039は、参照更新フェーズの処理を実行する。ガーベジコレクタ部103の数は複数である場合もある。
アプリケーション処理部105は、ユーザが開発したアプリケーションプログラムを処理するインタプリタ又はコンパイラとして動作する。アプリケーション理部105は、例えばユーザスレッドである。アプリケーション処理部105は、オブジェクト生成要求を出力することにより、ヒープ領域101にオブジェクトを生成する。アプリケーション処理部105は、読み出し要求及び書き込み要求を出力することにより、アクセサ109を介してオブジェクトにアクセスする。アプリケーション処理部105の数は複数である場合もある。
ルートセット107は、参照ポインタの集合である。参照ポインタの集合は、例えばスタック及びレジスタ内にある参照ポインタ及びシステム(例えばJava(登録商標)仮想マシン等)が保持する参照ポインタを含む。なお、本実施の形態においては、オブジェクトを指すポインタのことを参照ポインタと呼ぶ。
アクセサ109は、アプリケーション処理部105からの要求に応じ、ヒープ領域101内のオブジェクトにアクセスする。また、アクセサ109は、世代領域毎に設けられた参照更新部111に、参照ポインタの更新を行わせる。
(1)本実施の形態における並行型ガーベジコレクションの概要
図2を用いて、本実施の形態の並行型ガーベジコレクションにおけるフェーズの推移について説明する。図2は、特定の世代領域が創成されてから解放されるまでに行われる処理の処理フローである。なお、「並行」とは、異なる作業を同時に行うことを意味している。
本実施の形態における並行型ガーベジコレクションは、非回収フェーズと、マークフェーズと、移動フェーズと、参照更新フェーズとを含む。
非回収フェーズは、ステップS1001及びS1002を含む。
ガーベジコレクタ部103は、世代領域を創成する(ステップS1001)。具体的には、例えばUNIX(登録商標)系のOS(Operating System)であればPROT_NONEであった領域(すなわち、未使用であった領域)をPROT_READ|PROT_WRITEに設定する。この処理は、メモリコミットとも呼ばれる。
アプリケーション処理部105は、創成された世代領域にオブジェクトを生成すると共に、オブジェクトにアクセスする(ステップS1002)。なお、非回収フェーズにおいてアプリケーション処理部105がオブジェクトにアクセスする際には、ライトバリア及び参照更新処理は行われない。
マークフェーズは、ステップS1003乃至S1006を含む。
マーキング部1031は、マーキング処理を実施する(ステップS1003)。具体的には、マーキング部1031は、参照ポインタによって到達可能なオブジェクトに対して、生存オブジェクトであることを表すマークを付与する。なお、マーキング処理については後で詳細に説明する。また、生存オブジェクトとは、参照ポインタによって到達可能なオブジェクトである。
マーキング部1031は、オブジェクトの生存率を算出する(ステップS1004)。生存率は、例えば、世代領域のサイズに対する生存オブジェクトのサイズ又は数に基づき算出される。
マーキング部1031は、世代領域に生存オブジェクトが存在する(すなわちオブジェクトの生存率が0%ではない)か判断する(ステップS1005)。世代領域に生存オブジェクトが存在しない場合(ステップS1005:Noルート)、すなわち生存率が0%である場合、その世代領域を解放してもよいので、ステップS1011の処理に移行する。
一方、世代領域に生存オブジェクトが存在する場合、すなわちオブジェクトの生存率が0%ではない場合(ステップS1005:Yesルート)、マーキング部1031は、生存率が所定の閾値未満であるか判断する(ステップS1006)。閾値は、例えば50(%)である。
生存率が所定の閾値以上である場合(ステップS1006:Noルート)、その世代領域を解放すべきでないので、ステップS1002の処理に戻る。一方、生存率が所定の閾値未満である場合(ステップS1006:Yesルート)、ステップS1007に移行する。
このように、ガーベジコレクションの対象となる世代領域(以下、回収対象の世代領域と呼ぶ)であると判断するまでは、たとえ不要であるオブジェクトであったとしても回収をせず、世代領域内のいかなるオブジェクトも移動しない。
移動フェーズは、ステップS1007及びS1008を含む。
移動部1033における第1処理部1035は、確保処理を実行する(ステップS1007)。具体的には、回収対象の世代領域のオブジェクトの移動先の領域を確保する。なお、確保処理については、後で詳細に説明する。
移動部1033における第2処理部1037は、移動処理を実行する(ステップS1008)。具体的には、回収対象の世代領域のオブジェクトを、確保された領域にコピーする。なお、移動処理については、後で詳細に説明する。
参照更新フェーズは、ステップS1009及びS1010を含む。なお、参照更新とは、移動先のオブジェクトが正しく参照されるように、移動元のオブジェクトを指す参照ポインタを、移動先のオブジェクトのアドレスに更新することをいう。
設定部1039は、参照更新の設定処理を実施する(ステップS1009)。参照更新の設定処理については、後で詳細に説明する。そして、参照更新の設定処理が実施されると、アプリケーション処理部105は、参照ポインタの更新を行う(ステップS1010)。また、次のマークフェーズが開始している場合には、マーキング部1031も参照ポインタを更新する。
そして、ガーベジコレクタ部103は、解放処理を実施する(ステップS1011)。具体的には、例えばPROT_READであった領域(すなわち、読み出し専用であった領域)をPROT_NONE(アクセス不可)に設定する。この処理は、メモリアンコミットとも呼ばれる。解放処理については、後で詳細に説明する。そして処理は終了する。
このように、回収対象とならない限り、非回収フェーズとマークフェーズとを交互に繰り返す。マークフェーズの結果、回収対象となった世代領域は、移動フェーズ及び参照更新フェーズを経て解放される。
次に、図3を用いて、本実施の形態の並行型ガーベジコレクションの進行について説明する。前提として、以下のような動作条件が設定されているとする。
(a)マークフェーズは、全世代領域を同時に対象とする。(b)マークフェーズにおいて回収対象ではないとされた世代領域は非回収フェーズに移行する。(c)移動フェーズ及び参照更新フェーズは、回収対象とする世代領域のみで実行される。(d)マークフェーズの期間と参照更新フェーズの期間とは重なる。マークフェーズが完了することで参照更新フェーズが完了する。(e)移動フェーズ完了後、ヒープ領域101のサイズ又はガーベジコレクションの進捗状況等に基づき、次のマークフェーズを開始するまでにガーベジコレクタ部103の休止期間を設けてもよい。(f)アプリケーション処理部105が世代領域にアクセスする際に実行される参照更新処理は、世代領域の創成時に無効に設定され、参照更新フェーズの開始時に有効に設定される。(g)移動フェーズにおいては、回収対象の世代領域のオブジェクトへの書き込みを禁止する。(h)参照更新フェーズが完了すると、世代領域は解放される。
まず、マークフェーズ(1)が行われると、回収対象の世代領域が特定される。回収対象の世代領域は移動フェーズ(1)に移行し、回収対象ではない世代領域は非回収フェーズに移行する。移動フェーズ(1)においては、回収対象の世代領域は読み出しのみ可能となるように設定される。非回収フェーズの世代領域は、読み出し及び書き込みが可能である。非回収フェーズの期間は、マークフェーズ完了後、回収対象外の世代領域について次回のマークフェーズが開始するまでの期間である。
移動フェーズ(1)が完了すると、参照更新フェーズ(1)が開始する。参照更新フェーズ(1)においては、設定部1039が、参照更新処理が有効になるように設定をする。すると、移動フェーズ(1)において移動されたオブジェクトを指す参照ポインタは、アプリケーション処理部105がそのオブジェクトにアクセスする際に更新される。また、マークフェーズ(2)が開始すると、マーキング部1031が、参照ポインタを更新する。そして、参照更新フェーズ(1)及びマークフェーズ(2)が完了すると、マークフェーズ(1)によって回収対象となった世代領域は読み出し及び書き込みが不可になるように設定される(すなわち、解放され未使用の状態となる)。
マークフェーズ(2)が行われると、回収対象の世代領域が特定される。回収対象の世代領域は移動フェーズ(2)に移行し、回収対象ではない世代領域は非回収フェーズに移行する。移動フェーズ(2)においては、回収対象の世代領域は読み出しのみ可能となるように設定される。非回収フェーズの世代領域は、読み出し及び書き込みが可能である。
移動フェーズ(2)が完了すると、参照更新フェーズ(2)が開始する。参照更新フェーズ()においては、設定部1039が、参照更新処理が有効になるように設定をする。すると、移動フェーズ(2)において移動されたオブジェクトを指す参照ポインタは、アプリケーション処理部105がそのオブジェクトにアクセスする際に更新される。また、マークフェーズ(3)が開始すると、マーキング部1031が、参照ポインタを更新する。
このように、マーキング処理において回収対象とされた世代領域についての参照更新は、マーキング処理の後にアプリケーション処理部105によって行われるか、又は次回のマーキング処理において行われる。また、移動フェーズにおいては読み出しのみが可能となるので、移動元のオブジェクトと移動先のオブジェクトとが同じであることを担保できる。また、読み出しについてはアプリケーション処理部105の処理を停止しなくて済み、回収対象ではない世代領域についてはアプリケーション処理部105は通常どおり処理を行える。
図4に、各フェーズにおいてヒープ領域101に対して行われるアクセスを示す。図4には、アプリケーション処理部105及びガーベジコレクタ部103の各々について、ヒープ領域101に対するアクセスに関連する処理がフェーズ毎に示されている。
次に、図5を用いて、世代領域の状態の推移について説明する。
前提として、(1)に示すように、ヒープ領域101内に10の世代領域G1乃至G10が設けられており、G1乃至G6が使用可能となっており、G7乃至G10が未使用となっているとする。また、半分以上(すなわち、5つ以上)の世代領域が使用可能になった時点でマークフェーズが開始するものとする。また、マークフェーズ開始前に生成されたオブジェクトはマーキングの対象であり、マークフェーズ開始後に生成されたオブジェクトはルートとして取り扱う。
マークフェーズが行われた結果、G1、G4及びG5が回収対象になり、(2)の状態になったとする。回収対象の世代領域は3つなので、3つ分の代替領域を創成可能な状態にする。このように代替領域を用意するのは、以下のような理由による。すなわち、世代領域が解放されるまでの間、オブジェクトは移動元の世代領域と移動先の世代領域とに重複して存在しているので、その分だけ使用可能なヒープ領域が減ることになる。そこで、常に10個分の世代領域を使用することができるように、代替領域を用意しておく。
G1、G4及びG5のオブジェクトの移動先としてG7が確保され、新たにG8及びG9が創成された結果、(3)に示す状態になったとする。移動フェーズが完了すると、参照更新フェーズが開始する。そして、使用中の世代領域が5つ以上になったのでマークフェーズが開始する。
マークフェーズが行われた結果、G3及びG8が回収対象になり、G1、G4及びG5が解放され、(4)の状態になったとする。回収対象の世代領域は2つなので、2つ分の代替領域を創成可能な状態にする。
G3及びG8のオブジェクトの移動先としてG4が確保され、G1及びG5が創成された結果、(5)に示す状態になったとする。移動フェーズが完了すると、参照更新フェーズが開始する。そして、使用中の世代領域が5つ以上になったのでマークフェーズが開始する。
マークフェーズが行われた結果、G2、G5及びG9が回収対象になり、G3及びG8が解放され、(6)の状態になったとする。回収対象の世代領域は3つなので、3つ分の代替領域を創成可能な状態にする。
G2、G5及びG9のオブジェクトの移動先がG4になり、G3が創成された結果、(7)に示す状態になったとする。移動フェーズが完了すると、参照更新フェーズが開始する。そして、使用中の世代領域が5つ以上になったのでマークフェーズが開始する。
マークフェーズが行われた結果、G7が回収対象になり、G2、G5及びG9が解放され、(8)の状態になったとする。回収対象の世代領域は1つなので、1つ分の代替領域を創成可能な状態にする。
G7のオブジェクトの移動先がG2になり、G8が創成された結果、(9)に示す状態になったとする。移動フェーズが完了すると、参照更新フェーズが開始する。そして、使用中の世代領域が5つ以上になったのでマークフェーズが開始する。
なお、上で述べた例では、最大で9つの世代領域が回収対象となる可能性があるため、回収対象の世代領域の代替領域として9つの世代領域分のアドレス空間を予め予約しておいてもよい。
(2)マークフェーズ
次に、図6乃至図8を用いて、マーキング部1031が実行するマーキング処理について説明する。
マーキング部1031は、未処理の参照ポインタが有るか判断する(図6:ステップS1)。ステップS1においては、ルートセット107に含まれる参照ポインタ及びライトバリア又はリマークによって検出された参照ポインタの中に、未処理の参照ポインタが有るか判断する。
なお、ライトバリアとは、アプリケーション処理部105がオブジェクトに格納されているデータを書き換えることによる、オブジェクトの参照関係の変更を検出することをいう。また、リマークとは、並行型のマーキングにおいて、マークフェーズ開始時におけるルートセット107との差分を検出し、アプリケーション処理部105の処理を停止してマークし直す処理である。通常は、差分はごく僅かであるため、アプリケーション処理部105の処理の停止時間は問題とならない。マークフェーズが開始する前であれば、ライトバリア及びリマークを実行しなくてもよい。しかし、マークフェーズが開始した後は、移動元のオブジェクト(すなわち、不要となったオブジェクト)を指す参照ポインタは未到達になるため、ライトバリア及びリマークを実行する。
未処理の参照ポインタが無い場合(ステップS1:Noルート)、元の処理に戻る。一方、未処理の参照ポインタが有る場合(ステップS1:Yesルート)、マーキング部1031は、未処理の参照ポインタを1つ特定する(ステップS3)。また、マーキング部1031は、特定された参照ポインタが指すオブジェクトをヒープ領域101から特定する(ステップS4)。
マーキング部1031は、特定されたオブジェクトが、参照更新フェーズの世代領域のオブジェクトであるか判断する(ステップS5)。ステップS5においては、そのオブジェクトに移動先のアドレスが格納されているか否かによって判断する。なお、参照更新フェーズの世代領域のオブジェクトは、移動元のオブジェクトであり、移動元のオブジェクトには、直近の移動フェーズにおいて移動先のアドレスが格納されている。
参照ポインタが、参照更新フェーズの世代領域のオブジェクトを指していない場合(ステップS5:Noルート)、参照ポインタの更新をしなくてもよいので、ステップS9の処理に移行する。一方、参照ポインタが、参照更新フェーズの世代領域のオブジェクトを指している場合(ステップS5:Yesルート)、マーキング部1031は、以下のような処理を実行する。具体的には、マーキング部1031は、参照ポインタが指すオブジェクトに格納されている移動先のアドレスを取り出し、移動先のアドレスで参照ポインタを更新する(ステップS7)。
マーキング部1031は、参照ポインタが指すオブジェクトにマークが有るか判断する(ステップS9)。マークが無い場合(ステップS:Noルート)、マーキング部1031は、参照ポインタが指すオブジェクトにマークを付与する(ステップS11)。そして処理は端子Bを介して図7のステップS17に移行する。なお、ステップS7において参照ポインタが更新されている場合には、移動先のオブジェクトにマークが付与される。
一方、マークが有る場合(ステップS9:Yesルート)、マーキングスタックにおける次の参照ポインタについて処理するため、処理は端子Aを介して図7のステップS13に移行する。
図7の説明に移行し、マーキング部1031は、マーキングスタックに参照ポインタが有るか判断する(ステップS13)。マーキングスタックは、参照を辿る過程で見つかった参照ポインタを格納するための記憶領域である。マーキング部1031は、マーキングスタックを利用して参照を辿ることにより、到達可能なオブジェクトに漏れなく到達できるようになる。マーキングスタックを利用して参照を辿る技術は、従来からよく知られているので詳細な説明を省略する。
マーキングスタックに参照ポインタが有る場合(ステップS13:Yesルート)、マーキング部1031は、マーキングスタックから参照ポインタを取り出し、その参照ポインタが指すオブジェクトを特定する(ステップS15)。マーキングスタックに参照ポインタが無い場合(ステップS13:Noルート)、次の参照ポインタについて処理するため、端子Cを介して図6のステップS1に戻る。
マーキング部1031は、ステップS15において特定されたオブジェクト又はステップS11においてマークが付与されたオブジェクトに未処理の参照ポインタが格納されているか判断する(ステップS17)。
未処理の参照ポインタが無い場合(ステップS17:Noルート)、マーキングスタックにおける次の参照ポインタについて処理するため、ステップS13の処理に戻る。一方、未処理の参照ポインタが有る場合(ステップS17:Yesルート)、マーキング部1031は、未処理の参照ポインタを1つ特定する(ステップS19)。また、マーキング部1031は、特定された参照ポインタが指すオブジェクトをヒープ領域101から特定する(ステップS20)。
マーキング部1031は、特定されたオブジェクトが、参照更新フェーズの世代領域のオブジェクトであるか判断する(ステップS21)。
参照ポインタが、参照更新フェーズの世代領域のオブジェクトを指していない場合(ステップS21:Noルート)、参照ポインタを更新しなくてもよいので、ステップS25の処理に移行する。一方、参照ポインタが、参照更新フェーズの世代領域のオブジェクトを指している場合(ステップS21:Yesルート)、マーキング部1031は、以下のような処理を実行する。具体的には、マーキング部1031は、参照ポインタが指すオブジェクトに格納されている移動先のアドレスを取り出し、移動先のアドレスで参照ポインタを更新する(ステップS23)。
マーキング部1031は、参照ポインタが指すオブジェクトにマークが有るか判断する(ステップS25)。マークが無い場合(ステップS25:Noルート)、マーキング部1031は、参照ポインタが指すオブジェクトにマークを付与する。また、マーキング部1031は、参照ポインタをマーキングスタックに積む(ステップS27)。なお、ステップS23において参照ポインタが更新されている場合には、移動先のオブジェクトにマークが付与される。そしてステップS17の処理に戻る。また、オブジェクトにマークが有る場合(ステップS25:Yesルート)、ステップS17の処理に戻る。
図8を用いて、参照ポインタの更新について具体的に説明する。図8においては、4つの長方形の図形はオブジェクトを表しており、矢印は参照を表しており、生存オブジェクトにはマークが付与されている。図8の左上に示された参照ポインタは、オブジェクトAを指している。オブジェクトAには、オブジェクトBを指す参照ポインタ(object address1)が格納されている。マーキング処理においては、オブジェクトBを指す参照ポインタによってオブジェクトBに到達するが、オブジェクトBは移動元のオブジェクト(すなわち、参照更新フェーズのオブジェクト)である。そのため、オブジェクトBにはマークを付与せず、移動先のアドレス(forwarding_address)を取り出し、移動先のアドレスで参照ポインタを更新する。古い参照は、点線で表されている。また、更新された参照ポインタによって移動先のオブジェクトであるオブジェクトCに到達し、オブジェクトCにマークを付与する。オブジェクトCには、オブジェクトDを指す参照ポインタ(object address2)が格納されている。従って、オブジェクトCに格納されている参照ポインタによってオブジェクトDに到達する。
以上のように、マーキング処理においては、ルートセット107に含まれる参照ポインタ及び到達したオブジェクトに格納されている参照ポインタを漏れなくスキャンしている。そのため、マーキング処理が完了した時点で移動元のオブジェクトに到達することは無くなる。
そして、到達可能なオブジェクトを指す参照ポインタを更新しているため、到達できないオブジェクトを指す参照ポインタについては更新しない。すなわち、結果として無駄になる参照更新処理を省くことができるので、一部の並行型ガーベジコレクションと比べると、アプリケーション処理部105の処理を停止する時間が少なくて済む。
また、アプリケーション処理部105が古い参照ポインタを別の領域(例えば、ヒープ領域、スタック領域、ローカル変数領域、Java(登録商標)仮想マシン等のシステムが保持している参照ポインタ群がある領域)へコピーする場合であっても、ライトバリア又はリマークによってそのコピー行為を検出し、コピーされた参照ポインタをマーキング部1031に通知する。これにより、オブジェクトの移動後に直ちに参照ポインタを更新しなくても、オブジェクトの参照関係の一貫性を維持することができるようになる。
(3)世代領域の解放
次に、図9を用いて、解放処理(S1011)について説明する。なお、解放処理は、他の処理と並列に実行することができる。ここで、並列とは、同じ作業を多重で処理することを意味している。
マークフェーズが完了すると、マーキング部1031は、解放の対象となる世代領域が有るか判断する(図9:ステップS31)。ステップS31においては、直近の移動フェーズにおいて回収対象であった世代領域が有るか判断する。
解放の対象となる世代領域が無い場合(ステップS31:Noルート)、元の処理に戻る。一方、解放の対象となる世代領域が有る場合(ステップS31:Yesルート)、マーキング部1031は、その世代領域についてのアクセスカウンタの値が0より大きいか判断する(ステップS33)。アクセスカウンタの値が0より大きい場合(ステップS33:Yesルート)、その世代領域を解放することはできないので、マーキング部1031は、ステップS33の処理に戻りリトライする。
なお、マーキング処理が完了した後に、アプリケーション処理部105が直近の移動フェーズにおいて回収対象であった世代領域のオブジェクトに新たにアクセスすることは無い。そのため、基本的には、マークフェーズが完了すれば、直近の移動フェーズにおいて回収対象であった世代領域を解放することができる。但し、マークフェーズの完了する前に、直近の移動フェーズにおいて回収対象であった世代領域のオブジェクトにアクセスしようとしてアクセサ109の実行を開始し、アクセスが終了する前にマークフェーズが完了して世代領域が解放される可能性がある。そのような場合には、移動先のアドレスを取り出せないか、又は解放された世代領域が新たに創成されることにより誤ったデータで参照ポインタを更新してしまう可能性がある。このような問題を防ぐため、アクセスカウンタを利用して、世代領域のオブジェクトにアクセス中であるアプリケーション処理部105が無いことを確認した上で解放をする。
アクセスカウンタの値が0以下である場合(ステップS33:Noルート)、マーキング部1031は、その世代領域をアクセス禁止に設定し、解放する(ステップS35)。ステップS35においては、例えばPROT_NONEに設定することで、読み出し及び書き込みをできないようにする。そしてステップS31の処理に戻る。
以上のような処理を実施すれば、エラー等を発生させることなく世代領域を解放できるようになる。
(4)移動フェーズ
次に、図10乃至図13を用いて、移動フェーズにおいて移動部1033が実行する処理について説明する。まず、図10を用いて、確保処理(S1007)について説明する。なお、確保処理は世代領域毎に実行される。
移動部1033における第1処理部1035は、回収対象の世代領域に、移動先のアドレスが格納されていないオブジェクトが有るか判断する(図10:ステップS41)。移動先のアドレスが格納されていないオブジェクトが無い場合(ステップS41:Noルート)、移動先の領域は確保されているので、元の処理に戻る。
一方、移動先のアドレスが格納されていないオブジェクトが有る場合(ステップS41:Yesルート)、第1処理部1035は、その生存オブジェクトの移動先の世代領域が有るか判断する(ステップS43)。移動先の世代領域が有る場合(ステップS43:Yesルート)、移動先のアドレスは、移動先の世代領域に存在するオブジェクトの末尾の位置に設定されているので、ステップS51の処理に移行する。
移動先の世代領域が無い場合(ステップS43:Noルート)、第1処理部1035は、創成可能な未使用の世代領域が有るか判断する(ステップS45)。創成可能な未使用の世代領域が無い場合(ステップS45:Noルート)、本実施の形態の並行型ガーベジコレクションを実行することができないので、第1処理部1035は、アプリケーション処理部105の処理を停止する。また、第1処理部1035は、ヒープ領域101の全体に対してガーベジコレクションを実行する(ステップS55)。そして元の処理に戻る。
一方、創成可能な未使用の世代領域が有る場合(ステップS45:Yesルート)、第1処理部1035は、新たに世代領域を創成する(ステップS47)。なお、ガーベジコレクションを実行する際には、同じ世代領域に存在するオブジェクトの寿命が同程度であることが好ましい。しかし、生成されたばかりのオブジェクトは、ガーベジコレクションを経たオブジェクトと比べると、寿命が短いことが多い。従って、オブジェクトが新たに生成される世代領域と移動先(すなわち退避先)の世代領域とは別にすることが好ましい。
第1処理部1035は、創成した世代領域の先頭アドレスを移動先のアドレスに設定し(ステップS49)、移動先のアドレスを移動元のオブジェクトに格納する(ステップS51)。また、第1処理部1035は、オブジェクトのサイズを移動先アドレスに加算する(ステップS53)。すなわち、移動先アドレスを新たに設定する。そしてステップS41の処理に戻る。
以上のような処理を実施すれば、生存オブジェクトの移動先の領域が適切に確保されるようになる。
次に、図11を用いて、移動処理(S1008)について説明する。移動処理は、世代領域毎に実行される。
移動部1033における第2処理部1037は、回収対象の世代領域を読み出し専用に設定する(図11:ステップS61)。ステップS61においては、例えばPROT_READに設定することにより、読み出しは可能とするが書き込みは禁止する。
なお、メモリプロテクトによってアクセス制限された世代領域へアクセスすると、セグメント例外が発生する。セグメント例外は同期シグナルであり、トラップを発生させたアプリケーション処理部105(すなわちスレッド)自身がトラップハンドラの処理をする。そのため、プロセス内の複数のアプリケーション処理部105が同時にトラップハンドラを処理することができる。トラップハンドラでは、アプリケーション処理部105が、アクセス再開のための待ち事象で待ち、アクセスの再開が通知された場合にはアクセサ109の先頭から処理を再開する。
図11の説明に戻り、第2処理部1037は、回収対象の世代領域の生存オブジェクトに格納されているデータを、当該生存オブジェクトに格納されている移動先のアドレスに従ってコピーする(ステップS63)。そして処理を終了する。
なお、情報処理装置1の計算資源に余裕がある場合には、ステップS63におけるコピーの処理を並列で実行してもよい。例えば図12に示すように、世代領域毎に第2処理部1037を割り当て、並列で処理を実行するようにしてもよい。また、例えば図13に示すように、1の世代領域に対して複数の第2処理部1037を割り当て、並列で処理を実行するようにしてもよい。また、図12に示したような方法と図13に示したような方法とを組み合わせてもよい。なお、図12及び図13においては、色が付された長方形がオブジェクトを表している。移動前のオブジェクトはオブジェクトO1乃至O7であり、移動後のオブジェクトにはダッシュが付されている。
以上のような処理を実施すれば、オブジェクトの移動中であっても、回収対象の世代領域のオブジェクトに対する読み出しを停止せずに済む。また、回収対象ではない世代領域のオブジェクトに対する書き込み及び読み出しを停止せずに済む。これにより、アプリケーションの応答時間を均一にする(すなわち、応答性能を向上させる)ことができるようになる。
また、回収対象の世代領域のオブジェクトに対する書き込みは禁止されているので、移動先のオブジェクトが移動元のオブジェクトと同じであることが保証されている。
(5)参照更新フェーズ
次に、図14を用いて、参照更新フェーズにおいて設定部1039が実行する設定処理(S1009)について説明する。なお、参照更新処理は世代領域毎に実行される。
まず、設定部1039は、回収対象の世代領域をアクセス禁止に設定する(図14:ステップS71)。ステップS71においては、例えばPROT_NONEに設定することにより、読み出し及び書き込みを禁止する。このようにするのは、アクセサ109が繰り返し呼び出されることによって設定部1039の処理が遅延すことを防ぐためである。
設定部1039は、回収対象の世代領域についてのアクセスカウンタの値が0より大きいか判断する(ステップS73)。アクセスカウンタの値が0より大きい場合(ステップS73:Yesルート)、その世代領域を解放することはできないので、設定部1039は、ステップS73の処理に戻りリトライする。
アクセスカウンタの値が0以下である場合(ステップS73:Noルート)、設定部1039は、回収対象の世代領域の参照更新処理を有効に設定する(ステップS75)。具体的には、アプリケーション処理部105が参照更新部111を介して参照ポインタを更新できるようにする。
設定部1039は、回収対象の世代領域を読み出し専用に設定する(ステップS77)。ステップS77においては、例えばPROT_READに設定することで、読み出しは可能とするが書き込みは禁止する。
設定部1039は、トラップハンドラによって処理を停止しているアプリケーション処理部105に、オブジェクトへのアクセスの再開を通知する(ステップS79)。すなわち、回収対象の世代領域がアクセス禁止に設定されていたためトラップハンドラによって処理を停止していたアプリケーション処理部105に対し、読み出しを再開できることを通知する。
以上のような処理を実施すれば、トラップハンドラによって処理を停止していたアプリケーション処理部105は、トラップハンドラから復帰して参照ポインタを更新できるようになる。
(6)アプリケーション処理部105によるアクセス
次に、図15乃至図23を用いて、アプリケーション処理部105がオブジェクトにアクセスする際の処理について説明する。
まず、アプリケーション処理部105は、ルートセット107に含まれる参照ポインタが指すオブジェクトのアドレスを右シフト演算し、オブジェクトが存在する世代領域を特定する(図15:ステップS81)。
図16を用いて、ステップS81の処理について説明する。図16の例には、1メガバイトのサイズを有するN個の世代領域と、各世代領域に対応する世代管理テーブルとが示されている。色が付された領域は、オブジェクトが存在する領域である。世代管理テーブルは、ヒープ領域101とは別のメモリ領域に設けられる。世代管理テーブルには、例えば、世代領域の先頭アドレス、世代領域の末尾アドレス、世代領域のうち使用されている領域の末尾アドレス、世代領域のサイズ、世代の識別情報、参照更新処理についての情報、アクセス再開のための待ち事象の情報、アクセスカウンタ等、世代領域に関する情報が格納される。
本実施の形態においては、以下のようにして世代領域を特定する。
GenerationEntry=Generation.Table[(obj_addr−heap_start)>>20]
ここで、obj_addrはオブジェクトのアドレスであり、heap_startはヒープ領域の先頭アドレスである。従って、オブジェクト1のアドレスをO1、オブジェクト2のアドレスをO2、オブジェクト3のアドレスをO3とすると、図16に示したオブジェクト1については、GenerationEntry=Generation.Table[(O1−heap_start)>>20]=GenerationTable[1]となる。オブジェクト2については、GenerationEntry=Generation.Table[(O2−heap_start)>>20]=GenerationTable[2]となる。オブジェクト3については、GenerationEntry=Generation.Table[(O3−heap_start)>>20]=GenerationTable[2]となる。
従って、オブジェクト1にアクセスする場合はGenerationTable[1].reference_updaterを使用し、オブジェクト2及びオブジェクト3にアクセスする場合はGenerationTable[2].reference_updaterを使用する。
また、参照更新フェーズにおいては、以下のように、参照更新処理が有効になるように設定される。
GenerationTable[N].reference_updater=reference_update;
ここで、Nは世代領域の識別情報である。
一方、参照更新フェーズ以外のフェーズにおいては、以下のように、参照更新処理が無効になるように設定される。
GenerationTable[N].reference_updater=reference_no_update;
図15の説明に戻り、アプリケーション処理部105は、ステップS81において特定された世代領域のアクセスカウンタをインクリメントする(ステップS83)。
アプリケーション処理部105は、ステップS81の処理において使用した参照ポインタが他者(例えば、マーキング部1031)によって更新されたか判断する(ステップS85)。更新された場合(ステップS85:Yesルート)、エラーを発生させないようにするため、アプリケーション処理部105は、その世代領域のアクセスカウンタをデクリメントし(ステップS87)、ステップS81の処理に戻る。
図17を用いて、ステップS85及びS87の処理について説明する。図17において、(1)乃至(6)の世代領域の状態は、図5における(1)乃至(6)の世代領域の状態と同じである。例えば、(1)の状態の前にアプリケーション処理部105がアクセサ109を実行し、オブジェクトAへのアクセスを開始したとする。この場合、(3)の状態まではオブジェクトAにアクセスしても問題は生じない。
しかし、(3)の状態で参照ポインタが移動先のオブジェクトBを指すように更新された場合に、アプリケーション処理部105が更新前の参照ポインタを使用すると、移動元のオブジェクトであるオブジェクトAにアクセスし続けてしまうことになる。そして、(5)の状態において参照更新フェーズが完了し、残骸Xを含む世代領域が新たに創成されて使用可能な状態になった場合には、アプリケーション処理部105は全く異なるオブジェクトにアクセスすることになる。
そこで、ステップS85においては、アクセスカウンタをインクリメントした後に参照ポインタが更新された場合には、参照ポインタを再度読み直し、ステップS81の処理に戻るようにする。
ここで、アクセサ109として実行するプログラムの一例を図18及び図19に示す。図18及び図19の例では、プログラムには、世代管理エントリのIDを算出する処理についてのコードと、参照更新処理についてのコードと、トラップハンドラについてのコードと、ヒープ回収者(すなわちガーベジコレクタ部103)についてのコードと、書き込み用アクセサについてのコードと、読み出し用アクセサについてのコードと、アクセスカウンタの増減についてのコードとが含まれる。アクセサ109には、アクセス対象のオブジェクトを指す参照ポインタと、実際にアクセスするフィールド(すなわち、オブジェクトに格納されているデータ)の位置へのオフセット値とをパラメタとして与えられる。参照更新部111の処理は、図18における「有効な参照更新処理」及び「無効な参照更新処理」の部分により実現される。
図15の説明に戻り、そのオブジェクトが存在する世代領域が回収対象ではない場合(ステップS89:Yesルート)、通常どおりアクセス可能(すなわち、PROT_READ|PROT_WRITEに設定されている)である。従って、アプリケーション処理部105は、オブジェクトにアクセス(すなわち、オブジェクトに格納されているデータの読み出し又はオブジェクトへのデータの書き込み)する(ステップS91)。なお、世代領域が回収対象ではない場合とは、その世代領域がマークフェーズ又は非回収フェーズにある場合である。そして、アクセスが終了すると、そのオブジェクトを含む世代領域のアクセスカウンタをデクリメントする(ステップS93)。そして処理を終了する。
一方、その世代領域が回収対象である場合(ステップS89:Noルート)、処理は端子Dを介して図20のステップS95に移行する。ステップS89において、世代領域が回収対象である場合とは、世代領域が移動フェーズ又は参照更新フェーズにある場合である。
図20の説明に移行し、そのオブジェクトを含む世代領域が参照更新フェーズである場合(ステップS95:Yesルート)、その世代領域のオブジェクトには移動先のアドレスが格納されている。よって、アプリケーション処理部105は、その世代領域のオブジェクトから移動先のアドレスを読み出し、そのオブジェクトを指す参照ポインタを移動先のアドレスで更新する(ステップS97)。但し、他のアプリケーション処理部105又はガーベジコレクタ部103によって参照ポインタが更新された場合には、参照ポインタを更新しない。そして、アプリケーション処理部105は、更新された参照ポインタによって移動先のオブジェクトにアクセスする(ステップS99)。処理は端子Eを介して図15のステップS93に移行する。
一方、そのオブジェクトを含む世代領域が参照更新フェーズではない場合(ステップS95:Noルート)、そのオブジェクトは移動フェーズの世代領域に存在する。そして、その世代領域におけるオブジェクトの移動が未完了である場合(ステップS101:Yesルート)、その世代領域は読み出し専用に設定されている。
よって、オブジェクトへのアクセスが読み出しである場合(ステップS103:Yesルート)、アプリケーション処理部105は、そのオブジェクトに読み出しのためアクセスする(ステップS105)。そして処理は端子Eを介して図15のステップS93に移行する。
一方、オブジェクトへのアクセスが書き込みである場合(ステップS103:Noルート)又はオブジェクトの移動が完了している場合(ステップS101:Noルート)、アプリケーション処理部105はオブジェクトにアクセスすることはできない。従って、アプリケーション処理部105は、その世代領域のアクセスカウンタをデクリメントする(ステップS107)。また、アプリケーション処理部105は、ガーベジコレクタ部103から処理再開の通知を受信するまで待機する(ステップS109)。処理は端子Fを介して図15のステップS81に戻る。
以上のような処理を実施すれば、実際にアプリケーション処理部105が回収対象の世代領域のオブジェクトにアクセスする際に参照ポインタを更新できるようになる。従って、たとえオブジェクトが移動済みであっても、更新しなくてもよい参照ポインタを更新することが無くなる。
図21乃至図23に、オブジェクトへの書き込みの具体例を示す。図21は、putfield命令によってオブジェクトに書き込みをする例を示す。図21では、スタックと、命令列と、オブジェクトとが示されている。アプリケーション処理部105がアクセスするオブジェクトを指す参照ポインタは、スタックに存在している。アプリケーション処理部105は、命令列におけるputfield命令のオペランドから、アクセスするフィールドへのオフセット(field_offset)を取り出す。また、スタックにある代入値(value)を、オブジェクトのオフセットの位置へ格納する。
図22は、オブジェクトの移動中に、putfield命令によるオブジェクトへの書き込みがトラップされる例を示す。アクセスの方法は図21と同様である。しかし、スタックにある代入値を、コピー中のオブジェクトにおけるオフセットの位置へ格納しようと試みるときに、メモリプロテクト(この場合、PROT_READ)によって処理がトラップされる。
図23は、参照ポインタの更新後に、putfield命令によってオブジェクトに書き込みをする例を示している。アクセスの方法は図21と同様である。但し、アプリケーション処理部105が移動前のオブジェクトのオフセットの位置へ代入値を格納するためにアクセサ109を実行している最中に、参照更新処理によって参照ポインタが更新されている。このような場合には、参照ポインタの更新後に移動先のオブジェクトにおけるオフセットの位置へ代入値を格納する。
以上本発明の一実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上で説明した情報処理装置1の機能ブロック構成は必ずしも実際のプログラムモジュール構成に対応するものではない。
また、上で説明した各テーブルの構成は一例であって、必ずしも上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしても良い。
なお、ガーベジコレクタ部103は、ステップS33においてアクセスカウンタが0になったと判断してから世代領域を解放している。しかし、ガーベジコレクタ部103がマークフェーズの最後に、アプリケーション処理部105によって実行されているアクセサ内の参照を更新するようにしてもよい。このようにすれば、ステップS33の処理を実行しなくて済む。
また、例えばJava(登録商標)の場合、オブジェクトの型(例えば、インスタンスオブジェクト、クラスオブジェクト及び配列オブジェクト等)に応じてアクセサを使い分けてもよい。具体的には、getfield、putfield、getstatic、putstatic、[a/b/c/s/i/l/f/d]aload及び[a/b/c/s/i/l/f/d/d]astore等の命令毎にアクセサを用意してもよい。
また、上ではメモリプロテクトをPROT_READ|PROT_WRITE、PROT_READ及びPROT_NONEによって実現する例を示した。しかし、例えばWindows(登録商標)であれば、PAGE_READWRITE、PAGE_READ及びPAGE_DECOMMITを用いればよい。
また、例えば生存率が50%未満の世代領域を回収対象とすると、最大でもヒープ領域101の1/3に相当する領域が退避用に予約されていればよい。従って、例えば予め取得した統計に基づき生存オブジェクトの総量が予測可能であるならば、世代領域1つ分のサイズ以上であってヒープ領域101の1/3に相当する領域のサイズ以下において適当なサイズを予約してもよい。但し、予測に失敗して退避用の領域が不足した場合には、並行型ガーベジコレクションを中断し、アプリケーション処理部105の処理を停止した上でガーベジコレクションをすることになる。
並行型ガーベジコレクションの場合、新規なオブジェクトの生成と不要なオブジェクトの回収とが並行して行われる。オブジェクトの生成量と回収量との差について、特定のマークフェーズの開始からその次の回のマークフェーズの開始までの統計を取得し、マークフェーズ開始のタイミング又は退避用の世代領域の増減に反映してもよい。なお、オブジェクトの生成量が常に回収量を上回る場合には、メモリ不足となりシステムがダウンする。そのため、統計を取得することにより、一時的に生成量が回収量を上回ることによる問題の発生に対処することができる。
なお、上で述べた情報処理装置1は、コンピュータ装置であって、図24に示すように、メモリ2501とCPU(Central Processing Unit)2503とハードディスク・ドライブ(HDD:Hard Disk Drive)2505と表示装置2509に接続される表示制御部2507とリムーバブル・ディスク2511用のドライブ装置2513と入力装置2515とネットワークに接続するための通信制御部2517とがバス2519で接続されている。オペレーティング・システム(OS:Operating System)及び本実施例における処理を実施するためのアプリケーション・プログラムは、HDD2505に格納されており、CPU2503により実行される際にはHDD2505からメモリ2501に読み出される。CPU2503は、アプリケーション・プログラムの処理内容に応じて表示制御部2507、通信制御部2517、ドライブ装置2513を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ2501に格納されるが、HDD2505に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク2511に格納されて頒布され、ドライブ装置2513からHDD2505にインストールされる。インターネットなどのネットワーク及び通信制御部2517を経由して、HDD2505にインストールされる場合もある。このようなコンピュータ装置は、上で述べたCPU2503、メモリ2501などのハードウエアとOS及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
以上述べた本発明の実施の形態をまとめると、以下のようになる。
本実施の形態に係る情報処理方法は、(A)複数の領域に分割されたヒープ領域から、第1のポインタが指すオブジェクトを特定し、(B)特定されたオブジェクトが存在する領域が、ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であるか判断し、(C)ガーベジコレクションの対象となる領域であり且つオブジェクトのコピーが完了している領域であると判断した場合に、特定されたオブジェクトの移動先のアドレスを取得し、当該移動先のアドレスで第1のポインタを更新する処理を含む。
このようにすれば、更新しなくてもよいポインタを更新することは無く、ポインタの更新に要する時間を減らせるので、一部の並行型ガーベジコレクションと比べると、アプリケーションプログラムの処理の停止時間を減らすことができるようになる。
また、本情報処理方法が、(D)移動先のアドレスにより特定されるオブジェクトに対し、生存オブジェクトであることを表すマークを付与する処理をさらに含むようにしてもよい。ガーベジコレクションの対象となる領域のオブジェクトに対してはマークを付与しなくてもよく、移動先のオブジェクトにマークを付与すれば、参照関係の一貫性を保つことができるからである。
また、本情報処理方法が、(E)ヒープ領域における複数の領域の中のうち第1の領域に対してガーベジコレクションを実行する場合、第1の領域のオブジェクトの移動先の領域である第2の領域を確保し、(F)ヒープ領域を使用してアプリケーションプログラムの処理を実行する処理部が第1の領域のオブジェクトに対して書き込みをすることを禁止し且つ読み出しをすることを可能とするための設定をし、(G)第1の領域のオブジェクトを、第2領域にコピーする処理をさらに含むようにしてもよい。このようにすれば、オブジェクトの移動中であっても、ガーベジコレクションの対象とする領域のオブジェクトに対する読み出しを停止せずに済み、またガーベジコレクションの対象ではない領域のオブジェクトに対する書き込み及び読み出しを停止せずに済む。また、ガーベジコレクションを実行する領域のオブジェクトに対する書き込みは禁止されているので、移動先のオブジェクトが移動元のオブジェクトと同じであることが保証される。
また、上で述べた第2の領域を確保する処理において、(e1)第1の領域のオブジェクトの移動先のアドレスを当該第1の領域のオブジェクトに格納し、上で述べた処理部が、第1の領域におけるオブジェクトに対して読み出し又は書き込みのためにアクセスする場合、当該オブジェクトの移動先のアドレスを当該オブジェクトから取得し、当該オブジェクトを指す第2のポインタを、取得した移動先のアドレスで更新し、更新後の第2のポインタによって、第2の領域にコピーされたオブジェクトにアクセスするようにしてもよい。このようにすれば、アプリケーションプログラムの処理を実行する処理部が実際にガーベジコレクションの対象となる領域にアクセスする行為の際に参照ポインタを更新するので、余計な参照ポインタを更新しなくて済む。
また、本情報処理方法が、(H)第1の領域のオブジェクトにアクセスする処理部があるか否かを、アクセス中の処理部の数を計数するためのカウンタを用いて判断し、(I)第1の領域のオブジェクトにアクセスする処理部が無いと判断した場合に、第1の領域を解放する処理をさらに含むようにしてもよい。このようにすれば、処理部がオブジェクトにアクセス中であるにもかかわらず領域を解放することはなくなるので、問題が発生することを防止できるようになる。
また、本情報処理方法が、(J)複数の領域のうち解放されている領域のいずれかに対し、処理部が書き込み及び読み出しをすることを可能とするための設定をする処理をさらに含むようにしてもよい。このようにすれば、処理部が、設定がされた領域を使用して処理をすることができるようになる。
また、上で述べた第2の領域を確保する処理において、(e2)複数の領域の中から、生存オブジェクトのサイズ又は数に基づき、ガーベジコレクションを実行する領域を特定するようにしてもよい。このようにすれば、ガーベジコレクションを実行すべき領域を適切に特定することができるようになる。
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、CD−ROM、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。尚、中間的な処理結果はメインメモリ等の記憶装置に一時保管される。
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)
複数の世代領域に分割されたヒープ領域から、第1のポインタが指す第1のオブジェクトを特定し、
第1のオブジェクトの移動先のアドレスとして前記第1のオブジェクトが属する第1の世代領域とは異なる第2の世代領域のアドレスが設定されているか否かを判断し、
前記第1のオブジェクトの移動先のアドレスとして前記第2の世代領域のアドレスが設定されている場合には、前記移動先のアドレスを取得し、
前記移動先のアドレスで前記第1のポインタを更新する
処理をコンピュータが実行する情報処理方法。
(付記2)
前記判断する処理が、
前記第1の世代領域が、前記第1のポインタを更新するフェーズにある世代領域として設定されているか否かを判断する
処理を含む付記1記載の情報処理方法。
(付記
前記移動先のアドレスにより特定されるオブジェクトに対し、生存オブジェクトであることを表すマークを付与する
処理を前記コンピュータがさらに実行する付記1記載の情報処理方法。
(付記
前記ヒープ領域における前記複数の世代領域のち第3の世代領域に対してガーベジコレクションを実行する場合、前記第3の世代領域のオブジェクトの移動先の領域である第4の世代領域を確保し、
前記ヒープ領域を使用してアプリケーションプログラムの処理を実行する処理部が前記第3の世代領域のオブジェクトに対して書き込みをすることを禁止し且つ読み出しをすることを可能とするための設定をし、
前記第3の世代領域のオブジェクトを、前記第4の世代領域にコピーする、
処理を前記コンピュータがさらに実行する付記1乃至3のいずれか1つ記載の情報処理方法。
(付記
前記第4の世代領域を確保する処理において、
前記第3の世代領域のオブジェクトの移動先のアドレスを当該第3の世代領域のオブジェクトに格納し、
前記処理部が、
前記第3の世代領域におけるオブジェクトに対して読み出し又は書き込みのためにアクセスする場合、当該オブジェクトの移動先のアドレスを当該オブジェクトから取得し、当該オブジェクトを指す第2のポインタを、取得した前記移動先のアドレスで更新し、
更新後の前記第2のポインタによって、前記第4の世代領域にコピーされたオブジェクトにアクセスする
ことを特徴とする付記記載の情報処理方法。
(付記
前記第3の世代領域のオブジェクトにアクセスする処理部があるか否かを、アクセス中の前記処理部の数を計数するためのカウンタを用いて判断し、
前記第3の世代領域のオブジェクトにアクセスする処理部が無いと判断した場合に、前記第3の世代領域を解放する
処理を前記コンピュータがさらに実行する付記記載の情報処理方法。
(付記
前記複数の世代領域のうち解放されている世代領域のいずれかに対し、前記処理部が書き込み及び読み出しをすることを可能とするための設定をする
処理を前記コンピュータがさらに実行する付記記載の情報処理方法。
(付記
前記第4の世代領域を確保する処理において、
前記複数の世代領域の中から、生存オブジェクトのサイズ又は数に基づき、前記ガーベジコレクションを実行する世代領域を特定する
ことを特徴とする付記乃至のいずれか1つ記載の情報処理方法。
(付記
複数の世代領域に分割されたヒープ領域から、第1のポインタが指す第1のオブジェクトを特定し、
第1のオブジェクトの移動先のアドレスとして前記第1のオブジェクトが属する第1の世代領域とは異なる第2の世代領域のアドレスが設定されているか否かを判断し、
前記第1のオブジェクトの移動先のアドレスとして前記第2の世代領域のアドレスが設定されている場合には、前記移動先のアドレスを取得し、
前記移動先のアドレスで前記第1のポインタを更新する
処理をコンピュータに実行させるためのプログラム。
(付記10
メモリと、
前記メモリにおける、複数の世代領域に分割されたヒープ領域から、第1のポインタが指す第1のオブジェクトを特定し、第1のオブジェクトの移動先のアドレスとして前記第1のオブジェクトが属する第1の世代領域とは異なる第2の世代領域のアドレスが設定されているか否かを判断し、前記第1のオブジェクトの移動先のアドレスとして前記第2の世代領域のアドレスが設定されている場合には、前記移動先のアドレスを取得し、前記移動先のアドレスで前記第1のポインタを更新する処理部と、
を有する情報処理装置。
1 情報処理装置 101 ヒープ領域
103 ガーベジコレクタ部 1031 マーキング部
1033 移動部 1035 第1処理部
1037 第2処理部 1039 設定部
105 アプリケーション処理部 107 ルートセット
109 アクセサ 111 参照更新部

Claims (6)

  1. 複数の世代領域に分割されたヒープ領域における第1の世代領域に対してガーベジコレクションを実行する場合、前記第1の世代領域のオブジェクトの移動先の領域である第2の世代領域を前記複数の世代領域から特定し、
    前記第1の世代領域のオブジェクトに対する書き込みを禁止し且つ前記第1の世代領域のオブジェクトからの読み出しを可能にするための設定をし、
    前記第1の世代領域のオブジェクトを、特定された前記第2の世代領域にコピーする、
    処理をンピュータが実行する情報処理方法。
  2. 前記ヒープ領域から、第1のポインタが指す第1のオブジェクトを特定し、
    前記第1のオブジェクトの移動先のアドレスとして、前記第1のオブジェクトが属する第3の世代領域とは異なる第4の世代領域のアドレスが設定されているか否かを判断し、
    前記第1のオブジェクトの移動先のアドレスとして前記第4の世代領域のアドレスが設定されている場合には、前記移動先のアドレスを取得し、
    前記移動先のアドレスで前記第1のポインタを更新する
    処理を前記コンピュータがさらに実行する請求項1記載の情報処理方法。
  3. 前記第4の世代領域のアドレスが設定されているか否かを判断する処理において
    前記第の世代領域が、前記第1のポインタを更新するフェーズにある世代領域として設定されているか否かを判断する
    求項記載の情報処理方法。
  4. 前記の世代領域を特定する処理において、
    前記第の世代領域のオブジェクトの移動先のアドレスを当該第の世代領域のオブジェクトに格納し、
    前記コンピュータが、
    前記第の世代領域オブジェクトに対して読み出し又は書き込みのためにアクセスする場合、当該オブジェクトの移動先のアドレスを当該オブジェクトから取得し、当該オブジェクトを指す第2のポインタを、取得した前記移動先のアドレスで更新し、
    更新後の前記第2のポインタによって、前記第の世代領域にコピーされたオブジェクトにアクセスする
    処理をさらに実行する請求項記載の情報処理方法。
  5. 複数の世代領域に分割されたヒープ領域における第1の世代領域に対してガーベジコレクションを実行する場合、前記第1の世代領域のオブジェクトの移動先の領域である第2の世代領域を前記複数の世代領域から特定し、
    前記第1の世代領域のオブジェクトに対する書き込みを禁止し且つ前記第1の世代領域のオブジェクトからの読み出しを可能にするための設定をし、
    前記第1の世代領域のオブジェクトを、特定された前記第2の世代領域にコピーする、
    処理をコンピュータに実行させるためのプログラム。
  6. メモリと、
    前記メモリにおける、複数の世代領域に分割されたヒープ領域における第1の世代領域に対してガーベジコレクションを実行する場合、前記第1の世代領域のオブジェクトの移動先の領域である第2の世代領域を前記複数の世代領域から特定し、前記第1の世代領域のオブジェクトに対する書き込みを禁止し且つ前記第1の世代領域のオブジェクトからの読み出しを可能にするための設定をし、前記第1の世代領域のオブジェクトを、特定された前記第2の世代領域にコピーする処理部と、
    を有する情報処理装置。
JP2012184922A 2012-08-24 2012-08-24 ガーベジコレクションのための情報処理方法、プログラム及び装置 Active JP6044181B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2012184922A JP6044181B2 (ja) 2012-08-24 2012-08-24 ガーベジコレクションのための情報処理方法、プログラム及び装置
US13/972,179 US20140059093A1 (en) 2012-08-24 2013-08-21 Information processing method and apparatus for garbage collection

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012184922A JP6044181B2 (ja) 2012-08-24 2012-08-24 ガーベジコレクションのための情報処理方法、プログラム及び装置

Publications (3)

Publication Number Publication Date
JP2014044472A JP2014044472A (ja) 2014-03-13
JP2014044472A5 JP2014044472A5 (ja) 2014-06-19
JP6044181B2 true JP6044181B2 (ja) 2016-12-14

Family

ID=50148979

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012184922A Active JP6044181B2 (ja) 2012-08-24 2012-08-24 ガーベジコレクションのための情報処理方法、プログラム及び装置

Country Status (2)

Country Link
US (1) US20140059093A1 (ja)
JP (1) JP6044181B2 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10180902B2 (en) * 2015-06-30 2019-01-15 International Business Machines Corporation Pauseless location and object handle based garbage collection
US10176093B2 (en) 2015-06-30 2019-01-08 International Business Machines Corporation Pauseless location and object handle based garbage collection
US9734053B2 (en) 2015-06-30 2017-08-15 International Business Machines Corporation Garbage collection handler to update object pointers
US10761979B2 (en) 2016-07-01 2020-09-01 Intel Corporation Bit check processors, methods, systems, and instructions to check a bit with an indicated check bit value
JP2018010507A (ja) * 2016-07-14 2018-01-18 富士通株式会社 メモリ管理プログラム、メモリ管理方法及びメモリ管理装置
US10146684B2 (en) * 2016-10-24 2018-12-04 Datrium, Inc. Distributed data parallel method for reclaiming space
US10877884B2 (en) * 2018-01-09 2020-12-29 International Business Machines Corporation Copying and forwarding for concurrent copying garbage collection
US11281578B2 (en) * 2019-08-20 2022-03-22 Micron Technology, Inc. Garbage collection in a memory sub-system during a low battery state
US10929288B1 (en) * 2019-10-08 2021-02-23 International Business Machines Corporation Protecting against data loss during garbage collection

Family Cites Families (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5560003A (en) * 1992-12-21 1996-09-24 Iowa State University Research Foundation, Inc. System and hardware module for incremental real time garbage collection and memory management
US6038572A (en) * 1997-04-23 2000-03-14 Sun Microsystems, Inc. Method and apparatus for localizing nodes in a garbage collected carded heap
US5873105A (en) * 1997-06-26 1999-02-16 Sun Microsystems, Inc. Bounded-pause time garbage collection system and method including write barrier associated with a source instance of a partially relocated object
US6618737B2 (en) * 2000-03-09 2003-09-09 International Business Machines Corporation Speculative caching of individual fields in a distributed object system
US6526422B1 (en) * 2000-05-15 2003-02-25 Sun Microsystems, Inc. Striding-type generation scanning for parallel garbage collection
US7210122B2 (en) * 2001-03-22 2007-04-24 International Business Machines, Corporation Method for reducing write barrier overhead
US7058670B2 (en) * 2002-12-20 2006-06-06 Sun Microsystems, Inc. Scalable, space-efficient, parallel remembered-sets
US7657543B1 (en) * 2004-10-12 2010-02-02 Sun Microsystems, Inc. Method and system for creating and using shadow roots
US20070162475A1 (en) * 2005-12-30 2007-07-12 Intel Corporation Method and apparatus for hardware-based dynamic escape detection in managed run-time environments
JP2007213252A (ja) * 2006-02-08 2007-08-23 Hitachi Ltd ゴミ集め処理プログラム及びゴミ集め処理方法
US8281293B2 (en) * 2007-07-24 2012-10-02 International Business Machines Corporation Copy-on-write optimization of immutable objects for objects oriented languages
US9110791B2 (en) * 2008-03-03 2015-08-18 Microsoft Technology Licensing, Llc Optimistic object relocation
US7937419B2 (en) * 2008-06-26 2011-05-03 Tatu Ylonen Oy Garbage collection via multiobjects
US8312219B2 (en) * 2009-03-02 2012-11-13 International Business Machines Corporation Hybrid caching techniques and garbage collection using hybrid caching techniques
JP2011134202A (ja) * 2009-12-25 2011-07-07 Internatl Business Mach Corp <Ibm> メモリ管理装置、メモリ管理方法、及びメモリ管理プログラム
US8555022B1 (en) * 2010-01-06 2013-10-08 Netapp, Inc. Assimilation of foreign LUNS into a network storage system
US20110264880A1 (en) * 2010-04-23 2011-10-27 Tatu Ylonen Oy Ltd Object copying with re-copying concurrently written objects
US9213562B2 (en) * 2010-12-17 2015-12-15 Oracle International Corporation Garbage collection safepoint system using non-blocking asynchronous I/O call to copy data when the garbage collection safepoint is not in progress or is completed
US8793452B1 (en) * 2012-03-30 2014-07-29 Emc Corporation Method of guaranteeing replication of data written by a mainframe to a virtual tape

Also Published As

Publication number Publication date
US20140059093A1 (en) 2014-02-27
JP2014044472A (ja) 2014-03-13

Similar Documents

Publication Publication Date Title
JP6044181B2 (ja) ガーベジコレクションのための情報処理方法、プログラム及び装置
US7827374B2 (en) Relocating page tables
US7490214B2 (en) Relocating data from a source page to a target page by marking transaction table entries valid or invalid based on mappings to virtual pages in kernel virtual memory address space
US6862674B2 (en) Methods and apparatus for performing a memory management technique
US7721068B2 (en) Relocation of active DMA pages
JP6408568B2 (ja) 複数のアクセスメソッドのためのラッチフリーのログ構造化ストレージ
US8037279B2 (en) Method and system for cross-domain data sharing
US20110264880A1 (en) Object copying with re-copying concurrently written objects
JP6882662B2 (ja) マイグレーションプログラム、情報処理装置およびマイグレーション方法
KR100404555B1 (ko) 데이터 프로세서 제어형 데이터 저장 시스템, 동적 재동기화 방법, 및 컴퓨터 프로그램을 포함하는 컴퓨터 판독 가능한 기록 매체
JP2007140698A (ja) 計算機システム及びストレージシステムと管理計算機並びにバックアップ管理方法
JP2007299403A (ja) 異機種マルチプロセッサ・システムにおけるガーベッジ・コレクションのためのシステムおよび方法
JP2008033483A (ja) 計算機システム、計算機および計算機動作環境の移動方法
JPWO2006107095A1 (ja) 計算機システム,メモリ管理方法,およびそのプログラム
US8527559B2 (en) Garbage collector with concurrent flipping without read barrier and without verifying copying
KR101779174B1 (ko) 저널링 파일시스템의 데이터 폐기 방법 및 이를 구현하기 위한 메모리 관리 장치
JP2002268933A (ja) クラスタシステム
TWI417724B (zh) 使用替代頁池管理直接記憶器存取寫入頁錯誤之電腦執行方法、裝置、及電腦程式產品
US20090070740A1 (en) System for storing and managing objects
WO2011128507A1 (en) Thread-local hash table based write barrier buffers
JP3872968B2 (ja) コンピュータ・システムにおいてメモリを動的に再割当てするシステムおよび方法
CN109074308A (zh) 适应性的块转换表(btt)
US7660961B2 (en) Concurrent evacuation of the young generation
US8892838B2 (en) Point-in-time copying of virtual storage and point-in-time dumping
WO2011120335A1 (zh) 数据操作的方法、装置及计算机

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20140424

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150512

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160523

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160614

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160812

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20161018

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20161031

R150 Certificate of patent or registration of utility model

Ref document number: 6044181

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150