JP3939975B2 - ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム - Google Patents

ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム Download PDF

Info

Publication number
JP3939975B2
JP3939975B2 JP2001382148A JP2001382148A JP3939975B2 JP 3939975 B2 JP3939975 B2 JP 3939975B2 JP 2001382148 A JP2001382148 A JP 2001382148A JP 2001382148 A JP2001382148 A JP 2001382148A JP 3939975 B2 JP3939975 B2 JP 3939975B2
Authority
JP
Japan
Prior art keywords
generation
heap
memory area
garbage collection
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.)
Expired - Lifetime
Application number
JP2001382148A
Other languages
English (en)
Other versions
JP2003186737A (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.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co 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 Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP2001382148A priority Critical patent/JP3939975B2/ja
Priority to EP02258489A priority patent/EP1320034A3/en
Priority to US10/317,672 priority patent/US6839726B2/en
Priority to CNB021542465A priority patent/CN1280730C/zh
Publication of JP2003186737A publication Critical patent/JP2003186737A/ja
Application granted granted Critical
Publication of JP3939975B2 publication Critical patent/JP3939975B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

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
    • 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
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S707/00Data processing: database and file management or data structures
    • Y10S707/99951File or database maintenance
    • Y10S707/99956File allocation
    • Y10S707/99957Garbage collection

Description

【0001】
【発明の属する技術分野】
本発明は、リアルタイム処理に適したガベージコレクションの技術に関する。
【0002】
【従来の技術】
オペレーティング・システムのメモリ管理機能の1つにガベージコレクションがある。これはアプリケーションプログラムが使用しなくなったメモリ領域を自動的に解放して利用可能なメモリ領域を増やすアルゴリズムである。例えばJava(米国Sun Microsystems社の登録商標)は、このアルゴリズムを実行するガベージコレクション機構を予め備えている。
【0003】
ガベージコレクション機構は、アプリケーションプログラムの実行に際して動的に確保されたメモリオブジェクト(以下、単に「オブジェクト」という。)がどこからも参照されていない状態になっていることを検出してそのオブジェクトを解放し再利用可能状態にする。この一度確保されたオブジェクトを解放して再利用可能な状態にすることを、オブジェクトを回収するともいう。
【0004】
ここで、オブジェクトとは、アプリケーションプログラムが実行時に動的に用いることのできるヒープ領域を細分化した単位をいう。各オブジェクトは、例えばオブジェクト指向プログラミング言語におけるいわゆるオブジェクトインスタンスに対応するひとまとまりの可変長領域であり、各オブジェクトの内容は、データとデータ型との組の集合である部分と、オブジェクトが有効であるか否かを示すフラグ等を含む管理用の情報部分とからなる。なお、データ型は、対応するデータが例えば整数、論理値、ポインタ等のいずれであるかの別を示すものであり、以下、ポインタ型のデータを単に「ポインタ」ともいう。
【0005】
オブジェクトの参照は、そのオブジェクトへのポインタを保持することによりなされ、例えば、オブジェクトAからオブジェクトBを参照する場合には、オブジェクトAはオブジェクトBへのポインタを内容として含む。
ある時点においてアプリケーションプログラムにより参照されている全てのオブジェクトは、1又は複数のルートポインタなるポインタから、直接又は1以上のオブジェクト内のポインタを媒介にして、辿ることができる。制御機構等、アプリケーションプログラムの実行環境によりルートポインタは例えばアプリケーションプログラム全体やその一部を単位として定められるものである。従って、ガベージコレクション機構は、ある時点においてルートポインタから辿れなくなっているオブジェクトを不要なものとして回収対象にする。
【0006】
以下、従来のガベージコレクションの方式である、マークアンドスイープ方式及びリファレンスカウント方式について簡単に説明しておく。
マークアンドスイープ方式は、特開平11−232162号公報に開示されており、ルートポインタから辿れる全てのオブジェクトにマークを付けていく処理を行った後に、全てのオブジェクトを走査して、マークの付いていないオブジェクトを回収する方式である。
【0007】
リファレンスカウント方式は、オブジェクト毎にそのオブジェクトが何箇所から参照されているかを示すカウント値をオブジェクト内の管理用の情報部分に記憶することとし、オブジェクトを指すポインタの変更等により参照関係が変化する度にそれに応じてカウント値を増加又は減少させ、カウント値が0になった時点でそのオブジェクトを回収する方式である。
【0008】
【発明が解決しようとする課題】
上記方式の他にも様々なガベージコレクションの方式が存在するが、いずれの方式も、応答性を要するアプリケーションプログラムへの利用には適さないという欠点がある。それはガベージコレクションがアプリケーションプログラムの実行を長時間中断し、その中断時間及びタイミングの予測が困難なためである。
【0009】
応答性を要するアプリケーションプログラムは、ガベージコレクションによる中断時間も含めて所定時間内に所定の処理を終了することが要求される。
もしガベージコレクションによる中断時間が上記所定時間に対して比較にならない程十分に短ければ、所定時間内に所定の処理を終了することは可能である。ところが実際、従来のガベージコレクションは、ルートポインタからメモリ領域全体に点在するオブジェクトを辿っていく処理やメモリ領域全体を走査して不要なオブジェクトを回収する処理等、メモリ領域全体を対象とした処理であるため中断時間が長くなる場合が多く、所定時間内に所定の処理を終了することはほとんどの場合不可能である。
【0010】
あるいはアプリケーションプログラムの設計時にガベージコレクションによる中断時間及びタイミングを予測することができれば、アプリケーションプログラムを構成する各処理の処理時間を設計変更等で調整することにより、アプリケーションプログラムの応答性を確保できる可能性もある。しかしガベージコレクションによる中断時間及びタイミングの予測は容易ではない。なぜなら中断時間及びタイミングを予測するには、アプリケーションプログラム実行の各時点におけるメモリ領域全体の使用状況を把握することができる必要があるが、アプリケーションプログラムを構成する多数の処理の実行を積み重ねた結果におけるメモリ領域全体の使用状況を把握することは極めて困難だからである。
【0011】
そこで本発明は応答性を要するアプリケーションプログラムにも利用することのできるガベージコレクション方法、この方法を実現するガベージコレクション装置及びガベージコレクションプログラムを提供することを目的とする。
【0012】
【課題を解決するための手段】
上記問題を解決するため、本発明のガベージコレクション装置は、アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を記録する確保手段と、メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動手段と、メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放手段とを備えることを特徴とする。
【0013】
【発明の実施の形態】
以下、本発明の実施の形態について図面を用いて説明する。
<実施の形態1>
図1は、本発明の実施の形態1に係るガベージコレクション装置100の構成図である。
【0014】
ガベージコレクション装置100は、CPU、メモリ等を備えたコンピュータにおいて、メモリに格納された制御プログラムをCPUが実行することにより実現され、オペレーティングシステム上で動作し、Java言語等で作成されたアプリケーションプログラムの実行環境の一部として位置づけられるソフトウェア的な装置である。ガベージコレクション装置100は、アプリケーションプログラムの実行によるメモリ確保やポインタの変更等の各種要求が外部から入力されると、各種要求に対応して処理を行う。
【0015】
図1は、ガベージコレクション装置100の機能構成を示し、フレーム生成部10、世代ヒープ生成部20、フレーム解放部30、世代ヒープ解放部40、世代ヒープ管理部50、ヒープメモリ管理部60、オブジェクト生成部70及び世代間オブジェクト移動部80から構成される。
フレーム生成部10は、アプリケーションプログラムのメソッドの呼び出し毎にメモリ領域内にフレームを生成する。ここでメソッドとは、いわゆるサブルーチンのことであり、例えばC++における関数がこれに相当する。一般にサブルーチンは、ひとまとまりの部分的プログラムであって、他の部分的プログラムから呼び出されて実行されるものであり、また、実行された後に呼び元の部分的プログラムに戻るための命令を含んで構成される。このようなメソッドを実行の際必要とされる作業用のメモリがフレームであり、フレームは世代ヒープ(後述)へのポインタ等を保持する。フレームはメソッドの呼び出し毎に生成され、スタック管理される。
【0016】
世代ヒープ生成部20は、フレームの生成に対応して世代ヒープを生成する。世代ヒープは、メソッドの実行の際に必要とされるローカル変数やオブジェクト等を格納するためのメモリ領域である。フレームが1つ生成される毎に、世代ヒープも1つ生成され、各世代ヒープは生成された時期の古いものから順に昇順に世代番号が付されて識別される。
【0017】
フレーム解放部30は、メソッドの実行が終了すると、そのメソッドに対応して生成されたフレームを解放する。
世代ヒープ解放部40は、フレームの解放に対応して、そのフレームに対応する世代ヒープを解放する。
世代ヒープ管理部50は、世代ヒープ生成部20及び世代ヒープ解放部40により生成及び解放される世代ヒープをスタック管理する。
【0018】
ヒープメモリ管理部60は、世代ヒープ生成部20及び世代ヒープ解放部40による世代ヒープの生成及び解放に対応して、メモリの一領域を世代ヒープ用として確保及び解放する。
オブジェクト生成部70は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、メモリの一領域をオブジェクトのデータ格納用として確保する。各オブジェクトに対応する領域をメモリオブジェクトとも呼ぶ。
【0019】
世代間オブジェクト移動部80は、各世代ヒープにローカル変数及びオブジェクトのメンバ変数の代入を行う。
このメンバ変数の代入において、先に生成された世代ヒープ(以下、旧世代ヒープという。)のオブジェクトのメンバ変数がそれより後に生成された世代ヒープ(以下、新世代ヒープという。)にあるオブジェクトを参照していることを検出すると、その新世代ヒープのオブジェクトを旧世代ヒープへと移動させる処理を行う。世代間オブジェクト移動部80は、この処理を再帰的に行う。「再帰的に」とは、つまり、移動によりオブジェクトの所属する世代ヒープが変更された結果、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照関係が新たに発生する場合があり、その場合に、世代間オブジェクト移動部80が、その参照関係にある新世代ヒープのオブジェクトを旧世代ヒープへ移動させることをいう。
【0020】
次にガベージコレクション装置100の動作の概略を説明する。
図2(a)は、ガベージコレクション装置100の動作の概略を示すフローチャートである。
ステップS21:ガベージコレクション装置100は、アプリケーションプログラムからの各種要求を受け付け、各種要求に応じてステップS22〜ステップS25の処理を行う。
【0021】
ステップS22:アプリケーションプログラムによるフレーム確保要求があると、フレーム生成部10はフレームを生成し、世代ヒープ生成部20は当該フレームに対応する世代ヒープを生成する。
ステップS23:フレーム解放要求があると、世代ヒープ解放部40は、フレームに対応する世代ヒープを解放し、続いてフレームを解放する。
【0022】
ステップS24:オブジェクト確保要求があった場合には、該当するフレームに対応する世代ヒープ内にオブジェクトを確保する。
ステップS25:オブジェクトに値が代入され、その値が他の世代ヒープのオブジェクトへのポインタである場合、オブジェクトの移動処理を行う。
図2(b)は、ステップS25のオブジェクトの移動処理の概略を示すフローチャートである。
【0023】
ステップS26:ガベージコレクション装置100は、n世代の世代ヒープにあるオブジェクトからn世代より新しいm世代の世代ヒープのオブジェクトXにリファレンスが存在する間、ステップS26〜ステップS28の処理を繰り返す。
ステップS27:オブジェクトXをm世代からn世代に移動させる。
【0024】
ステップS28:ステップS26に戻る。
図2(a)において、ステップS22、ステップS23及びステップS24の処理それぞれは、処理内の各ステップ(図4(a)以降のフローチャート参照)が定型的な処理であるため、処理時間が毎回一定であり、各ステップに要する時間を予測して合計することにより全体の処理時間を予測することができる。また処理内の各ステップは単純な操作の処理であるため処理時間が短く、全体の処理時間も短くなっている。
【0025】
特に、従来問題となっていたメモリ解放に相当するステップS23の処理は、フレームの解放時に対応する世代ヒープ内のオブジェクトを一気に解放するという処理であるので、従来のように使用済みのオブジェクトを探索して解放するという時間のかかる操作が不要となっている。一気に解放できることとなったのは、ステップS25の処理があることによる。ステップS25は、異なる世代ヒープ間のオブジェクトに参照関係が発生すると、新世代ヒープのオブジェクトを旧世代ヒープに移動させることにより世代間にまたがる参照関係を無くす処理を行う。これによりフレーム解放時には、対応する世代ヒープ内のオブジェクトが全て使用済みとなっており、各オブジェクトについて使用済みであるか否かを判断する必要なく解放することができる。
【0026】
ステップS25の処理は、移動対象のオブジェクトの数がその都度異なることにより、処理時間が一定ではないが、その処理対象としているのがメモリ全体ではなく所定の世代ヒープに限られているため、処理時間は比較的短い。また、メモリ全体ではなく所定の世代ヒープに限られているため、移動対象のオブジェクトの数を比較的容易に把握することができ、その数から数に比例する処理時間を予測することができる。加えて、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照は特定の命令の場合のみ発生するものであるので、発生頻度が少なく、よってステップS25の処理が実行される回数も少ない。
【0027】
以上からステップS22〜ステップS25の各処理の処理時間は、短時間であるか又は予測することができ、またステップS25の処理は発生頻度が少ないため、ガベージコレクション装置100は応答性を要するアプリケーションプログラムに利用することができる。
図3(a)及び(b)は、生成された世代ヒープに確保されたメモリオブジェクトの移動の一例を示す図である。
【0028】
移動についての説明の前に同図(a)および(b)において世代ヒープが生成される手順の一例を示す。まず、アプリケーションプログラム実行の最初に第一のメソッドが呼び出されると、第一のメソッド用に作業用のフレームが1つ生成され、そのフレームに対応して第一世代の世代ヒープが生成される。
次に第一のメソッドの実行中に第二のメソッドが呼び出されると、第二のメソッド用にフレームが生成され、そのフレームに対応して第二世代の世代ヒープが生成される。このとき第二世代の世代ヒープは第一世代の世代ヒープの上にスタック状に積まれる。さらに第二のメソッドの実行中に第三のメソッドが呼び出されると、第三のメソッド用に作業用のフレームが1つ生成され、そのフレームに対応して第三世代の世代ヒープが生成され、第二世代の世代ヒープの上にスタック上に積まれる。ここで第一、第二及び第三のメソッドに付された序数は、メソッドの呼び出しを区別するためのものであって、メソッド内の命令内容を区別するものではない。各メソッド内の命令内容は、アプリケーションプログラムによって異なることもあれば同じこともある。なおこの例では、1つの実行中のメソッドにつき1回だけメソッドが呼び出されるが、この例に限られず、1つの実行中のメソッドにつき2回以上メソッドが呼び出されることもある。また同図(a)及び(b)において、生成される世代ヒープの数は3つであるが、3つが上限ということではなく、アプリケーションプログラムの内容に応じて生成される世代ヒープの数は異なる。
【0029】
このように生成された世代ヒープにおいて、メソッドの実行中にアプリケーションプログラムによるメンバ変数への代入処理があると、実行中のメソッドに対応する世代ヒープのメモリオブジェクトにそれらメンバ変数の値が代入される。図3(a)及び(b)において、各世代ヒープ内のインスタンスは、メンバ変数の値が代入されたメモリオブジェクトを示す。図中、インスタンスから他のインスタンスへの矢印線は、参照関係を示す。すなわち矢印線の始点のインスタンスが当該矢印線の終点のインスタンスを参照していることを示す。
【0030】
アプリケーションの実行により、メンバ変数の値がメモリオブジェクトに代入され、その結果、図3(a)のように第一世代の世代ヒープにあるインスタンスAから第三世代の世代ヒープにあるインスタンスBへと参照関係が発生すると(図中、点線の矢印により示す)、世代間オブジェクト移動部80は、インスタンスBを第一世代の世代ヒープに移す。この結果、インスタンスBとインスタンスCとの間の参照関係は、移動前には第三世代から第二世代への参照であったものが、移動後には第一世代から第二世代への参照、すなわち旧世代から新世代の参照となる。よって世代間オブジェクト移動部80は、インスタンスBが参照しているインスタンスCも第一世代の世代ヒープに移す。最終的に、世代ヒープの内容は図3(b)のようになる。
【0031】
このようにして、世代間オブジェクト移動部80は、旧世代ヒープから新世代ヒープへの参照関係が発生したら、新世代ヒープにあるメモリオブジェクトを旧世代の世代ヒープに移動させる。
次に、ガベージコレクション装置100の詳細な処理手順を示す。
図4(a)、(b)、(c)及び(d)は、メソッド実行開始の際の処理手順を示す。
【0032】
フレーム生成部10は、アプリケーションプログラムによりメソッドが呼び出されると、図4(a)に示すフレームの生成処理を行う。
ステップS401:フレーム生成部10は、当該メソッドに対応する世代ヒープのアドレス保持用として変数heapを用意する。
ステップS402:フレーム生成部10は、フレームを生成し、そのアドレスを変数frameに代入する。
【0033】
ステップS403:フレーム生成部10は、世代ヒープの生成処理を呼び出すことにより世代ヒープ生成部20に世代ヒープを生成させ、その結果得られる世代ヒープのアドレスを変数heapとして取得する。
ステップS404:最後にフレーム生成部10は、変数heapの値を生成したフレームの「世代ヒープへのポインタ」に格納する。
【0034】
図4(b)は、世代ヒープ生成処理を示す。ステップS403においてフレーム生成部10が世代ヒープ生成処理を呼び出すと、世代ヒープ生成部20は、この世代ヒープ生成処理を行う。
ステップS411:世代ヒープ生成部20は、ヒープメモリ生成処理を呼び出し、ヒープメモリ領域に世代ヒープを確保し、そのアドレスをheapとして取得する。
【0035】
ステップS412:世代ヒープ生成部20は、確保した世代ヒープ内にその世代で必要な個数のローカル変数を割当て、初期化する。
ステップS413:世代ヒープ生成部20は、世代ヒープのプッシュ処理を呼び出し、世代ヒープをスタックに積む。
図4(c)は、ヒープメモリの生成処理を示す。ステップS411において、ヒープメモリの生成処理が呼び出されると、ヒープメモリ管理部60は、図4(c)に示すようにヒープメモリ内に固定サイズのメモリブロックを確保し、そのアドレスをadrに代入してステップS411に返す(ステップS421)。
【0036】
図4(d)は、世代ヒープのプッシュ処理を示す。ステップS413において、世代ヒープのプッシュ処理が呼び出されると、世代ヒープ管理部50は、この世代ヒープのプッシュ処理を行う。
ステップS431:世代ヒープ管理部50は、heapが指す世代ヒープの世代番号にgを代入する。ここでgは、グローバル変数であり、初期値は1、次の世代ヒープの世代番号、すなわちスタックに積まれる世代ヒープの世代番号を示す。
【0037】
ステップS432:世代ヒープ管理部50は、gの値を1増加する。
ステップS433:続いて、世代ヒープの親ポインタにtopの値を代入する。ここでtopは、その時点で生成されている世代ヒープのうち最も世代番号の大きい世代ヒープへのポインタを保持し、初期値はNullポインタである。
ステップS434:最後に世代ヒープ管理部50は、topにheapの値を代入し、topの値を最新の値に更新する(ステップS434)。
【0038】
図5(a)、(b)、(c)及び(d)は、メソッド終了の際の処理手順を示す。
フレーム解放部30は、アプリケーションプログラムのメソッドが終了すると、図5(a)に示すフレーム解放処理を行う。
ステップS501:フレーム解放部30は、世代ヒープの解放処理を呼び出して解放する対象のフレームに対応する世代ヒープを解放する。
【0039】
ステップS502:解放対象のフレームを解放する。
図5(b)は、世代ヒープの解放処理を示す。ステップS501において、世代ヒープの解放処理が呼び出されると、世代ヒープ解放部40は、図5(b)に示すように、世代ヒープのポップ処理を呼び出して、スタックから対象の世代ヒープをはずして世代ヒープを解放する(ステップS511)。
【0040】
図5(c)は、世代ヒープのポップ処理の内容を示す。ステップS511において、世代ヒープのポップ処理が呼び出されると、世代ヒープ管理部50は、この世代ヒープのポップ処理を行う。
ステップS521:まず世代ヒープのアドレス格納用として変数workを用意する。
【0041】
ステップS522:次の世代番号を保持するgの値を1減らす。
ステップS523:次にtopに保持された値をworkに代入する。
ステップS524:topが指す世代ヒープの親ポインタの値をtopに代入する。
ステップS525:最後に、ヒープメモリの解放処理を呼び出し、workが指す世代ヒープのメモリブロックを解放する。
【0042】
図5(d)は、ヒープメモリの解放処理を示す。ステップS525において、ヒープメモリの解放処理が呼び出されると、ヒープメモリ管理部60は、解放対象のメモリブロックを解放する(ステップS531)。
図6(a)は、オブジェクト生成部70が行うオブジェクト生成処理を示す。
ステップS601:オブジェクト生成部70は、世代ヒープのアドレス確保用に変数heapを用意する。
【0043】
ステップS602:次に、図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップS603:続いて、取得したアドレスに位置する世代ヒープの空き領域からオブジェクトの領域を確保し、そのオブジェクトのアドレスをobjに代入する。
【0044】
ステップS604:さらに、objが指すオブジェクトのメンバ変数を割当てて、オブジェクトの領域を初期化する。
図6(b)は、現在の世代ヒープ取得処理を示す。図6(a)のステップS602において、現在の世代ヒープ取得処理が呼び出されると、世代ヒープ管理部50は、図6(b)に示すように、topの値をheapに代入して返す(ステップS611)。
【0045】
図7(a)は、世代間オブジェクト移動部80が行うローカル変数への代入処理を示す。
図7(a)において、世代間オブジェクト移動部80は、アプリケーションプログラムの実行過程でローカル変数への代入が発生すると、代入すべき値valを代入先ローカル変数のアドレスadrに代入する(ステップS701)。
【0046】
図7(b)は、世代間オブジェクト移動部80が行うメンバ変数への代入処理を示す。
ステップS711:世代間オブジェクト移動部80は、アプリケーションプログラムの実行過程でメンバ変数への代入が発生すると、代入すべき値valを代入先メンバ変数のアドレスadrに代入する。
【0047】
ステップS712:次に、代入されたvalが他のオブジェクトへのポインタであるか否かを判定する。
ステップS713:ポインタである場合には世代間オブジェクト移動処理を呼び出す。
図8(a)及び(b)は、世代間オブジェクト移動部80が行う世代間オブジェクト移動処理を示す。
【0048】
ステップS713において世代間オブジェクト移動処理が呼び出されると、世代間オブジェクト移動部80は、図8(a)に示すように、世代間オブジェクト移動処理を行う。
ステップS801:オブジェクトのアドレスを格納するためのスタックstack、オブジェクトのアドレスを格納するための変数obj1、obj2、世代番号を格納するためのg1、g2を初期化する。
【0049】
ステップS802:図7(b)における代入先オブジェクトのアドレスobjをstackにプッシュする。
ステップS803:stackが空でない間、stackからアドレスをポップしてobj1に代入してステップS803〜ステップS811の処理を繰り返す。
【0050】
ステップS804:obj1が指すオブジェクト、すなわちstackからポップしたアドレスが指すオブジェクトが位置している世代ヒープの世代番号をg1に代入する。
ステップS805:obj1が指しているオブジェクトのメンバで、他のオブジェクトを指すアドレスを持つメンバがある間、そのアドレスをobj2に代入してステップS805〜ステップS810を繰り返す。
【0051】
ステップS806:obj2が指しているオブジェクトが位置している世代ヒープの世代番号をg2に代入する。
ステップS807:g1<g2であるか否か、すなわちg1よりg2の世代ヒープの世代が新しいか否かを判定し、g1<g2である場合ステップS808へ、g1<g2でない場合ステップS810へ進む。
【0052】
ステップS808:ステップS807の判定の結果、g1<g2である場合、世代間オブジェクト移動下請け処理を呼び出す。ここでobj2の値をobj1に入力し、obj1が指すオブジェクトが位置する世代ヒープのアドレスをheapに入力する。
ステップS809:obj2をstackにプッシュする。
【0053】
ステップS810:ステップS805に戻る。
ステップS811:ステップS803に戻る。
図8(b)は、世代間オブジェクト移動下請け処理を示す。ステップS808において、世代間オブジェクト移動下請け処理が呼び出されると、世代間オブジェクト移動部80は、objが指すオブジェクトをheapが指す世代ヒープに移動させる。
【0054】
ステップS812:世代間オブジェクト移動部80は、objが指すオブジェクトを、heapが指す世代ヒープに移動する。
以上のように、実施の形態1にかかるガベージコレクション装置100は、メソッド呼び出し毎に世代ヒープを確保する。メソッドの実行中においては、当該メソッドで必要となったオブジェクトを対応する世代ヒープに生成し、オブジェクトに値を代入する際に旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへと参照が発生すると、その新世代ヒープのオブジェクトを旧世代ヒープへ移動させる。そしてメソッドが終了するとともに対応する世代ヒープを解放する。このような構成によって次のような効果を持つ。
(1)各世代ヒープの解放にかかる時間が短く、その時間を予測することができる。
【0055】
メソッドは、他のメソッドの実行中に呼び出されて当該他のメソッドより先に終了する。よってメソッドの実行に対応する各世代ヒープの寿命は、旧世代ヒープの方が新世代ヒープよりも長い。このような寿命の関係から、旧世代ヒープのオブジェクトから参照されている新世代ヒープのオブジェクトは、旧世代ヒープの寿命が終わるまで生きている可能性が高い。逆に、旧世代ヒープのオブジェクトから参照されていない新世代ヒープのオブジェクトは、新世代ヒープの寿命が終わるとともに使用済みとなっている。従って、旧世代ヒープのオブジェクトから参照されている新世代ヒープのオブジェクトを旧世代ヒープに移動させれば、移動後の新世代ヒープには使用済みのオブジェクトのみが残る。このため参照されている新世代ヒープのオブジェクトを旧世代ヒープに移動しておきされすれば、新世代ヒープについては、各オブジェクトが使用済みか否かを調べる必要なくメソッドの終了とともに解放することができる。このように使用済みか否かを調べる必要がないので解放に要する時間は短い。
【0056】
またこの解放は、図5(b)、(c)及び(d)のフローチャートに示す定型的な処理を行うだけなので、解放に要する時間は一定であり、フローチャートの各ステップに要する時間を予測して合計することにより解放に要する時間を予測することができる。
(2)1回の世代間オブジェクト移動処理にかかる時間が短く、その時間を予測することができる。
【0057】
移動対象となるオブジェクトは、参照関係が発生している旧世代ヒープ以前の古い世代ヒープには存在せず、旧世代ヒープより新しい世代ヒープに存在する。このように移動対象のオブジェクトは、メモリ領域全体のうちの局所的な部分に存在するので、その分オブジェクトの移動に要する時間は短くなる。
またオブジェクトの移動に要する時間は、移動させるオブジェクトの合計サイズに比例する。よって1つのオブジェクトに対して参照関係によりぶら下がるオブジェクトの合計サイズの上限を予め定めておけば、移動に要する時間の上限を予測することができる。あるいは、各世代ヒープの上限を定めておけば、移動させるオブジェクトは参照元のオブジェクトが存在する旧世代ヒープよりも新しい各世代ヒープに存在するので、新しい各世代ヒープの合計サイズから、移動に要する時間の上限を予測することができる。
【0058】
加えて、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照は特定の命令を実行した場合にしか発生しないので、世代間オブジェクト移動処理の発生頻度は比較的少ない。よって世代間オブジェクト移動処理によってアプリケーションプログラムの実行が中断される回数は少ない。
上記(1)及び(2)から、ガベージコレクション装置100は、世代ヒープの解放やオブジェクト移動等の主な処理の起動時間が短く、その時間を上限の予測も含めて予測することができるので、応答性を要するアプリケーションプログラムにも利用することができる。
<実施の形態2>
以下、本発明の実施の形態2にかかるガベージコレクション装置について説明する。
【0059】
実施の形態2のガベージコレクション装置は、実施の形態1のガベージコレクション装置100の機能に加えて、オブジェクトの生成時又は移動時に世代ヒープに空きがなく、オブジェクトを生成又は移動することができなくなったときに、当該世代ヒープとそれより新しい世代ヒープについてマークアンドスイープ方式に基づくスカビンジ処理を施す機能を持つ。ここにおいてスカビンジ処理は、世代ヒープ内の使用済みのオブジェクトを回収し、これらを解放することによって空き領域を増やす処理である。なお、ここでマークアンドスイープ方式の代わりに、従来からある他のガベージコレクションのアルゴリズムを用いてもよい。
【0060】
図9は、実施の形態2に係るガベージコレクション装置200の構成図である。
同図において、ガベージコレクション装置200は、フレーム生成部10、世代ヒープ生成部20、フレーム解放部30、世代ヒープ解放部40、世代ヒープ管理部50、ヒープメモリ管理部60、オブジェクト生成部72、世代間オブジェクト移動部82及び世代ヒープスカビンジ部90から構成される。同図において図1と同じ符号の構成要素は実施の形態1と同じものであるので説明を省略し、以下、異なる符号の構成要素を中心に説明する。
【0061】
オブジェクト生成部72は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、メモリの一領域をオブジェクトのデータ格納用として確保する。オブジェクト生成部72は、オブジェクト生成の際、管理用の情報部分に到達フラグを格納するための1ビットの領域を設ける。到達フラグは、オブジェクトがルートポインタから直接又は間接に参照関係があるか否かを示すものである。ただしオブジェクト生成部72は、生成の際に対象の世代ヒープにオブジェクトを確保するのに十分な領域がないことを検出した場合には、世代ヒープスカビンジ部90にスカビンジ処理を実行させ、その結果できた空き領域にオブジェクトを確保する。
【0062】
世代間オブジェクト移動部82は、各世代ヒープにローカル変数又はオブジェクトのメンバ変数の代入を行い、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照関係を検出すると、新世代ヒープのオブジェクトを旧世代ヒープに移動させる処理を行う。このとき、移動先の旧世代ヒープに移動対象のオブジェクトを格納するのに十分な領域がないことを検出すると、世代ヒープスカビンジ部90に当該旧世代ヒープ及びそれより新しい世代ヒープのスカビンジ処理を実行させ、その結果できた旧世代ヒープの空き領域に移動対象のオブジェクトを格納する。
【0063】
世代ヒープスカビンジ部90は、オブジェクト生成部72及び世代間オブジェクト移動部82により世代ヒープに空き領域がないことが検出されると、当該世代ヒープについてスカビンジ処理を行う。
図10は、ガベージコレクション装置200の動作の概略を示すフローチャートである。
【0064】
図10は、図2(a)に対してステップS101の処理が加わっている点が異なっている。すなわちガベージコレクション装置200は、ステップS24においてオブジェクトを生成しようとしたとき、当該世代ヒープ内のメモリ不足を検出すると、当該世代ヒープ内で使用済みであるが未解放のオブジェクトを探索し、探索されたオブジェクトを解放することで空き領域をつくる処理を行う(ステップS101)。
【0065】
以下、ガベージコレクション装置200の詳細な処理手順について説明する。ただし、実施の形態1と同様の処理については説明を省略し、以下、実施の形態1とは異なる処理を中心に説明する。なお、以下のフローチャートにおいて、実施の形態1のフローチャートと同じステップ番号のステップについては同じ処理であることを示す。
【0066】
図11(a)は、オブジェクト生成部72が行うオブジェクトの生成処理を示す。オブジェクト生成部72は、図6(a)に示すオブジェクトの生成処理の代わりに、図11(a)に示す処理を行う。
ステップS1101:オブジェクト生成部72は、オブジェクトのアドレス用にobjを用意し、世代ヒープのアドレス確保用に変数heapを用意する。
【0067】
ステップS602:次に、現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。この処理の詳細は図6(b)と同様である。
ステップS1102:ステップS602において取得したアドレスが指す世代ヒープに、十分の広さの空き領域があるか否かを判定する。この判定は、例えば、空き領域の広さが、オブジェクトのために確保しようとしている領域より大きいか否かにより行えばよい。また所定の値による閾値判定にしてもよい。
【0068】
ステップS1103:ステップS1102の判定の結果、十分な広さの空き領域がない場合には、世代ヒープのスカビンジ処理を呼び出し、世代ヒープスカビンジ部90に当該世代ヒープについてのスカビンジ処理を行わせる。この処理の詳細については後述する。
ステップS603:続いて、世代ヒープの空き領域からオブジェクトのための領域を確保し、そのオブジェクトのアドレスをobjに代入する。
【0069】
ステップS604:さらに、objが指すオブジェクトのメンバ変数を割当てて、オブジェクトの領域を初期化する。
このようにオブジェクト生成部72は、オブジェクトを生成する際に世代ヒープに空きがあるか否かを判定し、空きがなければスカビンジ処理により空き領域を作り出してから、空き領域にオブジェクトを生成する。
【0070】
図11(b)は、世代間オブジェクト移動下請け処理の処理手順を示す。
世代間オブジェクト移動部82は、図7(a)、(b)及び図8(a)に示す処理を行い、図8(b)のステップS808において図8(b)の世代間オブジェクト移動下請け処理を行う代わりに、図11(b)に示す処理を行う。
ステップS1106:世代間オブジェクト移動部82は、heapが指す世代ヒープ、すなわち移動先の世代ヒープに、十分な広さの空き領域があるか否かを判定する。この判定は、ステップS1102と同じでよい。
【0071】
ステップS1107:ステップS1106の判定の結果、十分な広さの空き領域がない場合には、世代ヒープのスカビンジ処理を呼び出し、世代ヒープスカビンジ部90に当該世代ヒープについてのスカビンジ処理を行わせる。この処理の詳細については後述する。
このように世代間オブジェクト移動部82は、オブジェクトを移動させる際に世代ヒープに空きがあるか否かを判定し、空きがなければスカビンジ処理におり空き領域を作り出してから、その空き領域にオブジェクトを移動させる。
【0072】
図11(c)は、世代ヒープのスカビンジ処理の処理手順を示す。
世代ヒープスカビンジ部90は、世代ヒープのマーキング処理を呼び出して実行し(ステップS1104)、続いて世代ヒープのスイーピング処理を呼び出して実行する(ステップS1105)。
ここでマーキング処理は、処理対象の世代ヒープについて、参照関係により辿れる全てのオブジェクトのマークをつけていく処理、すなわち到達フラグを0から1にする処理であり、スイーピング処理はマークが付されていないオブジェクトを回収する処理、すなわち到達フラグが0のオブジェクトを解放する処理である。
【0073】
図12(a)世代ヒープのマーキング処理の処理手順を示す。
ステップS1201:世代ヒープスカビンジ部90は、オブジェクトのアドレスを格納するスタックとして変数stack、世代ヒープのアドレス用として変数work、オブジェクトのアドレス用として変数obj、ptrを用意する。ステップS602:次に、図6(b)に示す、現在の世代ヒープ取得処理を呼び出して、現在の実行中のメソッドに対応する世代ヒープのアドレスを示すworkを取得する。
【0074】
ステップS1203:workの指す世代ヒープ、すなわち現在実行中のメソッドに対応する世代ヒープに含まれる全てのオブジェクトについて、オブジェクトが有する到達フラグに0をセットする。ここですべてのオブジェクトは、オブジェクト生成部72によって到達フラグを持つオブジェクトが生成されている。ステップS1204:workが指す世代ヒープにある親ポインタの内容をworkに代入する。
【0075】
ステップS1205:workがheap(スカビンジ対象の世代ヒープのアドレス)に等しくない間ステップS1203及びステップS1204を繰り返し、この繰り返しによりスカビンジ対象の世代ヒープ以降の新しい世代の世代ヒープについて、それらに含まれるオブジェクトの到達フラグに0をセットする。
ステップS602:続いて、世代ヒープスカビンジ部90は、現在の世代ヒープ取得処理を呼び出して、現在の世代ヒープのアドレスを示すworkを取得する。
【0076】
ステップS1208:workの指す世代ヒープ内のすべてのローカル変数について、その値をobjに代入してステップS1209及びステップS1210を繰り返す。
ステップS1209:objは正しいオブジェクトを指しているか否か、すなわちローカル変数がオブジェクトを指すものであるか否かを判定する。
【0077】
ステップS1210:ステップS1209において、正しいオブジェクトを指していると判定した場合、図12(b)に示す、到達フラグのマーキング処理を呼び出して実行する。
ここで到達フラグのマーキング処理の手順を先に説明しておく。
図12(b)は、到達フラグのマーキング処理の手順を示す。
【0078】
ステップS1220:objが指すオブジェクトの到達フラグが0であるか否かを判定する。
ステップS1221:ステップS1220においてobjが指すオブジェクトの到達フラグが0であると判定した場合、そのオブジェクトの到達フラグに1をセットする。
【0079】
ステップS1222:objをスタックにプッシュする。この処理は、後に、objのオブジェクトからさらに参照関係を辿るのに用いられる。
図12(a)の説明に戻る。
ステップS1212:workが指す世代ヒープにある親ポインタの内容をworkに代入する。
【0080】
ステップS1213:workがheapに等しくない間、ステップS1208〜ステップS1212の処理を繰り返す。この繰り返しにより、スカビンジ処理の対象の世代ヒープ以降の新しい世代の世代ヒープについて、世代ヒープ内のローカル変数から辿ることのできる全てのオブジェクトについて、それらオブジェクトが持つ到達フラグに1をセットする。
【0081】
ステップS1214:stackが空でない間、stackからポップした値をobjに代入してステップS1214とステップS1219の間の処理を繰り返す。
ステップS1215:objの指すオブジェクト内のすべてのインスタンス変数について、その値をptrに代入してステップS1215とステップS1218の間の処理を繰り返す。
【0082】
ステップS1216:ptrは正しいオブジェクトを指しているか否かを判定する。
ステップS1210:ステップS1216において、ptrが正しいオブジェクトを指していると判定した場合、図12(b)に示す到達フラグのマーキング処理を呼び出して実行する。
【0083】
ステップS1214とステップS1219の間の処理の繰り返しにより、到達フラグに1がセットされたオブジェクトから辿ることのできる全てのオブジェクトについて、それらのオブジェクトの到達フラグに1をセットする。
このように図12(a)及び図12(b)の処理を行うことにより、スカビンジ処理の対象の世代ヒープ以降の新しい世代の世代ヒープにあるローカル変数から直接又は間接に辿ることのできる全てのオブジェクトについて、到達フラグに1をセットする。
【0084】
図13は、世代ヒープのスイーピング処理の処理手順を示す。
ステップS602:世代ヒープスカビンジ部90は、図6(b)に示す現在の世代ヒープ取得処理を呼び出して、現在の世代ヒープのアドレスを示すworkを取得する。
ステップS1304:workが指す世代ヒープ内のオブジェクトのうち、到達フラグが0であるオブジェクトを解放する。
【0085】
ステップS1305:workが指す世代ヒープにある親ポインタの内容をworkに代入する。
ステップS1306:workがheapに等しくない間、ステップS1302とステップS1306の間の処理を繰り返す。
ステップS1302〜ステップS1306の繰り返しにより、スカビンジ処理の対象の世代ヒープ以降の新しい世代ヒープにあるローカル変数から直接又は間接に辿ることのできるオブジェクトが残り、どこからも参照されないオブジェクトが解放されて空き領域ができる。
【0086】
以上のように実施の形態2のガベージコレクション装置200は、実施の形態1のガベージコレクション装置100の機能に加えて、世代ヒープに空き領域がないためにオブジェクトを生成又は移動させることができなくなった場合に、当該世代ヒープとそれより新しい世代ヒープについてスカビンジ処理を行って空き領域を作り出してから、オブジェクトを生成又は移動させる。このスカビンジ処理は、メモリ領域全体ではなく、比較的新しい世代の世代ヒープについてのみ行われるものであるので、処理にかかる時間が短い。よってガベージコレクション装置200は、応答性を要するアプリケーションプログラムにも利用することがでいる。
<実施の形態3>
以下、本発明の実施の形態3にかかるガベージコレクション装置について説明する。
【0087】
実施の形態3のガベージコレクション装置は、実施の形態2のガベージコレクション装置200の機能に加えて、図11(c)に示す世代ヒープのスカビンジ処理の後、解放されずに残ったオブジェクトをより古い世代ヒープに移動させる機能を持つ。
図14は、実施の形態3に係るガベージコレクション装置300の構成図である。
【0088】
同図において、ガベージコレクション装置300は、フレーム生成部10、世代ヒープ生成部20、フレーム解放部30、世代ヒープ解放部40、世代ヒープ管理部50、ヒープメモリ管理部60、オブジェクト生成部72、世代ヒープスカビンジ部93及び世代間オブジェクト移動部83から構成される。
以下、図1及び図9と同じ符号の構成要素は同じ機能であるので説明を省略し、異なる符号の構成要素を中心に説明する。
【0089】
世代間オブジェクト移動部83は、ローカル変数及びメンバ変数の代入、オブジェクトの移動及び世代ヒープのスカビンジ処理の呼び出し等、実施の形態2の世代間オブジェクト移動部82と同様の操作に加えて、スカビンジ処理の結果、解放されなかった使用中のオブジェクトを1つ古い世代の世代ヒープに移動させる処理を行う。
【0090】
世代ヒープスカビンジ部93は、実施の形態2の世代ヒープスカビンジ部90と同様の世代ヒープのスカビンジ処理に加えて、当該スカビンジ処理の実行中に世代間オブジェクト移動部83の世代間オブジェクト移動処理を呼び出す。
以下、ガベージコレクション装置300の詳細な処理手順を示す。
ただし、実施の形態1及び2と同様の処理については説明を省略し、以下、異なる処理を中心に説明する。なお、以下のフローチャートにおいて、実施の形態1及び2のフローチャートと同じステップ番号のステップについては同じ処理であることを示す。
【0091】
図15は、世代ヒープスカビンジ部93が行う世代ヒープスカビンジ処理の処理手順を示す。世代ヒープスカビンジ部93は、オブジェクト生成部72によるオブジェクトの生成処理(図11(a)参照)及び世代間オブジェクト移動部83による世代間オブジェクト移動下請け処理(図11(b)参照)の中で世代ヒープのスカビンジ処理が呼び出されると、図11(c)の世代ヒープのスカビンジ処理の代わりに図15に示す処理を行う。
【0092】
ステップS1104:世代ヒープスカビンジ部93は、図12(a)及び(b)に示す世代ヒープのマーキング処理を呼び出して実行する。
ステップS1105:次に、図13に示す世代ヒープのスイーピング機能を呼び出して実行する。
ステップS1501:続いて、スカビンジ処理対象の世代ヒープのアドレスであるheapが指す世代ヒープの親ポインタがNULLであるか否かを判定する。判定の結果、NULLである場合、すなわちheapが指す世代ヒープより古い世代ヒープがない場合には、当該スカビンジ処理を終了する。
【0093】
ステップS1502:一方、判定の結果、NULLポインタでない場合、オブジェクトをより古い世代に移動させる準備として、まず、オブジェクトのアドレス用のobjを用意する。
ステップS1503:続いて、workの指す世代ヒープ内のすべてのオブジェクトについてそのアドレスをobjに代入してステップS1503とステップS1503の間の処理を繰り返す。
【0094】
ステップS1504:objが指すオブジェクトを、当該オブジェクトが所属する世代ヒープにある親ポインタが指す世代ヒープに移動させ、移動先のアドレスをobjに代入する。
ステップS713:図8(a)及び(b)に示す世代間オブジェクト移動処理を実行する。ここで図8(b)の代わりに図11(b)に示す処理を実行してもよい。
【0095】
このようにステップS1502とステップS1505との処理を繰り返すことにより世代ヒープのマーキング処理及びスイーピング処理の結果、解放されなかったオブジェクトが古い世代のオブジェクトに移動する。
この図15に示す世代ヒープのスカビンジ処理は、比較的新しい世代ヒープを対象とした処理であるため処理にかかる時間が短い。また図15に示す世代ヒープのスカビンジ処理が実行されるタイミングは、対象の世代ヒープに対するメソッドの実行中である。よって本実施の形態のガベージコレクション装置300は、その処理によりアプリケーションプログラムを中断する期間が短く、そのタイミングを予測することができるので、応答性を要するアプリケーションプログラムに利用することができる。
<実施の形態4>
以下、本発明の実施の形態4にかかるガベージコレクション装置について説明する。
【0096】
実施の形態4のガベージコレクション装置は、実施の形態1のガベージコレクション装置100の機能に加えて、リファレンスカウント方式によりオブジェクトが何箇所から参照されているかを管理し、オブジェクトがどこからも参照されなくなった時にそのオブジェクトを解放する機能を持つ。
図16は、実施の形態4に係るガベージコレクション装置400の構成図である。
【0097】
同図において、ガベージコレクション装置400は、フレーム生成部10、世代ヒープ生成部20、フレーム解放部30、世代ヒープ解放部40、世代ヒープ管理部50、ヒープメモリ管理部60、オブジェクト生成部74、世代間オブジェクト移動部84、被参照数変更部94及びオブジェクト解放部95から構成される。同図において図1と同じ符号の構成要素は実施の形態1と同じものであるので説明を省略し、以下、異なる符号の構成要素を中心に説明する。
【0098】
オブジェクト生成部74は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、メモリの一領域をオブジェクトのデータ格納用として確保する。このとき、オブジェクト生成部74は、オブジェクト内の管理用の情報部分に被参照数を保持するための領域を設ける。被参照数は、そのオブジェクトが何箇所から参照されているかを示すカウント値(リファレンスカウンタともいう。)である。
【0099】
世代間オブジェクト移動部84は、各世代ヒープにローカル変数及びオブジェクトのメンバ変数の代入を行う。そして、メンバ変数の代入においては、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照関係を検出すると、その新世代ヒープのオブジェクトを旧世代ヒープへと移動させる処理を行う。
【0100】
さらに、世代間オブジェクト移動部84は、ローカル変数又はメンバ変数の代入による参照関係の変化に対応するために、被参照数変更部94に被参照数の変更等の処理を行わせる。
被参照数変更部94は、ローカル変数又はメンバ変数の代入による参照関係の変化、及びオブジェクトの解放による参照関係の変化に対応してオブジェクトの被参照数を変更する処理を行い、その結果、オブジェクトの被参照数が0になった場合には、オブジェクト解放部95にそのオブジェクトを解放させる。
【0101】
オブジェクト解放部95は、被参照数が0になったオブジェクトを解放する処理を行う。また、この解放の際、被参照数変更部94に、解放による参照関係の変化に応じて、被参照数の変更の処理を行わせる。
以下、ガベージコレクション装置400の詳細な処理手順を示す。
ただし、実施の形態1、2及び3と同様の処理については説明を省略し、以下、異なる処理を中心に説明する。
【0102】
図17は、オブジェクト生成部74が行うオブジェクト生成処理を示す。オブジェクト生成部74は、図6(a)の代わりに図17に示す処理を行う。
ステップS601:オブジェクト生成部74は、世代ヒープのアドレス確保用に変数heapを用意する。
ステップS602:次に、図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
【0103】
ステップS603:続いて、取得したアドレスに位置する世代ヒープの空き領域からオブジェクトの領域を確保し、そのアドレスをobjに代入する。
ステップS1801:objが指すオブジェクトの被参照数に0をセットする。
ステップS604:objが指すオブジェクトにメンバ変数を割当てて初期化する。
【0104】
図18(a)は、世代間オブジェクト移動部84が行うローカル変数への代入処理を示す。
ステップS1901:世代間オブジェクト移動部84は、アプリケーションプログラムの実行過程でローカル変数への代入が発生すると、adrが指す変数の内容が他のオブジェクトへのポインタであるか否かを判定する。adrは、代入先フレームに対応する世代ヒープ内の代入先のローカル変数のアドレスであり、ステップS1901は、そのローカル変数に既に格納されている内容がポインタであるか否かを判定している。
【0105】
ステップS1902:判定の結果、ポインタであると判定した場合、被参照数変更部94に被参照数デクリメント処理を実行させる。被参照デクリメント処理は、参照関係の消滅に応じてオブジェクトの被参照数を減じ、その結果、どこからも参照されなくなったオブジェクトを解放する処理である。すなわち、ステップS1901及びステップS1902では、ローカル変数に現在格納されているポインタが新たな代入により消滅し、当該消滅により直接又は間接的に生じる参照関係の消滅に応じて、オブジェクトの被参照数を変更し、又は解放している。ステップS1902の被参照数デクリメント処理については、図19(a)にて詳しく説明する。
【0106】
ステップS701:ステップS1901及びステップS1902において、ローカル変数の現在の値がポインタである場合における当該ポインタによる参照関係が解放されたところで、ローカル変数に新たに代入すべき値であるvalを、当該ローカル変数に代入する。
ステップS1903:続いて、valは他のオブジェクトへのポインタであるか否かを判定する。
【0107】
ステップS1904:判定の結果、ポインタであると判定した場合には、被参照数変更部94に被参照数インクリメント処理を実行させる。被参照数インクリメント処理は、参照関係の新たな発生に応じてオブジェクトの被参照数を増加する処理である。すなわち、ステップS1903及びステップS1904では、新たな代入がポインタであることによる新たな参照関係の発生に応じて、ポインタが指すオブジェクトの被参照数を1増加している。
【0108】
図18(b)は、世代間オブジェクト移動部84が行うローカル変数への代入処理を示す。
ステップS1901:世代間オブジェクト移動部84は、アプリケーションプログラムの実行過程でメンバ変数への代入が発生すると、adrが指す変数の内容が他のオブジェクトへのポインタであるか否かを判定する。adrは、代入先オブジェクトのアドレスobjが指すオブジェクト内の代入先メンバ変数のアドレスであり、ステップS1901は、そのメンバ変数に既に格納されている内容がポインタであるか否かを判定している。
【0109】
ステップS1902:判定の結果、ポインタであると判定した場合、被参照数変更部94に被参照数デクリメント処理を実行させる。
ステップS711:メンバ変数に新たに代入すべき値であるvalを、当該メンバ変数に代入する。
ステップS712:次に、valは他のオブジェクトへのポインタであるか否かを判定する。
【0110】
ステップS1904:判定の結果、ポインタであると判定した場合には、被参照数変更部94に被参照数インクリメント処理を実行させる。
ステップS713:さらに、世代間オブジェクト移動処理を実行する。この処理は、実施形態1又は2における世代間オブジェクト移動処理と同じ処理でよい。
【0111】
図19(a)は、被参照数変更部94が行う被参照数デクリメント処理を示す。
ステップS2001:被参照数変更部94は、オブジェクトのアドレスであるobjが入力されると、objが指すオブジェクトの被参照数の値から1を減じる。ここでobjは、図18(a)のステップS1902の場合であれば、代入先のローカル変数に当該代入の前に格納されているポインタであり、図18(b)のステップS1902の場合であれば、代入先のメンバ変数に当該代入の前に格納されているポインタである。
【0112】
ステップS2002:ステップS2001の処理の結果、objが指すオブジェクトの被参照数が0になったか否かを判定する。
ステップS2003:判定の結果、被参照数が0になった場合には、オブジェクト解放部95にオブジェクトの解放処理を実行させることにより、被参照数が0となったオブジェクトを解放する。
【0113】
図19(b)は、被参照数変更部94が行う被参照数インクリメント処理を示す。
被参照数変更部94は、objが指すオブジェクトの被参照数の値を1増加する。ここでobjは、図18(a)のステップS1904の場合であれば、代入先ローカル変数に新たに代入されるポインタであり、図18(b)のステップS1904の場合であれば、代入先メンバ変数に新たに代入されるポインタである。
【0114】
図20は、オブジェクト解放部95が行うオブジェクト解放処理を示す。
ステップS2101:オブジェクトのアドレス格納用として変数workを用意する。
ステップS2102:objが指しているオブジェクトのメンバで、他のオブジェクトを指しているアドレスが残っている間、それをworkに代入して、ステップS1904の処理を繰り返す。
【0115】
ステップS1904:被参照数デクリメント処理を呼び出して被参照数変更部94に実行させる。
ステップS2105:objが指すオブジェクト領域を解放する。
以上のようにして、実施の形態4のガベージコレクション装置400は、不要になったオブジェクトを即座に解放して空き領域として使用可能な状態にするという利点を有する。
<実施の形態5>
以下、実施の形態5に係るガベージコレクション装置について説明する。
【0116】
実施の形態4のガベージコレクション装置400のリファレンスカウント方式によるガベージコレクションは、オブジェクトのポインタの参照関係がループしている場合に、ルートポインタから辿ることのできなくなっているオブジェクトであるにも拘わらず被参照数が0にならないため、その不要なオブジェクトを解放することができない。そこで実施の形態5のガベージコレクション装置は、図9に示すガベージコレクション装置200と図16に示すガベージコレクション装置400とを組み合わせたような構成として、リファレンスカウント方式によるガベージコレクションとマークアンドスイープ方式によるガベージコレクションとの両方を行うようにしている。
【0117】
すなわち実施の形態5のガベージコレクション装置は、フレーム生成部、世代ヒープ生成部、フレーム解放部、世代ヒープ解放部、世代ヒープ管理部、ヒープメモリ管理部、オブジェクト生成部、世代間オブジェクト移動部、世代ヒープスカビンジ部、被参照数変更部及びオブジェクト解放部から構成される。
上記構成うち、フレーム生成部、世代ヒープ生成部、フレーム解放部、世代ヒープ解放部、世代ヒープ管理部、ヒープメモリ管理部については、ガベージコレクション装置200又は400におけるフレーム生成部10、世代ヒープ生成部20、フレーム解放部30、世代ヒープ解放部40、世代ヒープ管理部50、ヒープメモリ管理部60それぞれと同様である。また被参照数変更部及びオブジェクト解放部については、ガベージコレクション装置400の被参照数変更部94及びオブジェクト解放部95と同様である。世代ヒープスカビンジ部は、ガベージコレクション装置200の世代ヒープスカビンジ部90と同様である。
【0118】
オブジェクト生成部及び世代間オブジェクト移動部は、ガベージコレクション装置200におけるオブジェクト生成部72及び世代間オブジェクト移動部82とガベージコレクション装置400におけるオブジェクト生成部74及び世代間オブジェクト移動部84をそれぞれ組み合わせた機能を持つ。
すなわち実施の形態5のオブジェクト生成部は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、メモリの一領域をオブジェクトのデータ格納用として確保する。このとき、オブジェクト生成部は、オブジェクト内の管理用の情報部分に被参照数を保持するための領域と到達フラグを格納するための領域とを設ける。この生成において、対象の世代ヒープにオブジェクトを確保するのに十分な領域がないことを検出した場合には、世代ヒープスカビンジ部にスカビンジ処理を実行させ、その結果できた空き領域にオブジェクトを確保する。
【0119】
また実施の形態5の世代間オブジェクト移動部は、各世代ヒープにローカル変数及びオブジェクトのメンバ変数の代入を行う。メンバ変数の代入においては、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照関係を検出すると、その新世代ヒープのオブジェクトを旧世代ヒープへと移動させる処理を行う。また、世代間オブジェクト移動部は、ローカル変数又はメンバ変数の代入による参照関係の変化に応じて被参照数変更部に被参照数の変更及びどこからも参照されていないオブジェクトの解放を行わせる。この移動において、移動先の旧世代ヒープに移動対象のオブジェクトを格納するのに十分な領域がないことを検出した場合には、世代ヒープスカビンジ部に当該旧世代ヒープ及びそれより新しい世代ヒープのスカビンジ処理を実行させ、その結果できた旧世代ヒープの空き領域に移動対象のオブジェクトを格納する。
【0120】
図21は、実施の形態5のガベージコレクション装置の動作を示す。
同図において、ステップS21、ステップS22及びステップS23については実施の形態1等と同様である。
ステップS24において、オブジェクト生成部は、世代ヒープに被参照数と到達フラグの領域を持つオブジェクトを生成する。このとき対象の世代ヒープに空き領域がないためにオブジェクトを生成することができない場合には、ステップS1701の処理に移る。ステップS1701において世代ヒープスカビンジ部は、対象の世代ヒープについてマーキング処理を行い、続いてスイーピング処理を行う。
【0121】
またステップS25において、世代間オブジェクト移動部は変数への代入、オブジェクトの移動処理を行い、これらの処理に応じて被参照数変更部は各オブジェクトの被参照数の変更処理及びオブジェクトの解放等を行う。このとき対象の世代ヒープに領域がないためにオブジェクトを移動することができない場合には、ステップS1701の処理に移る。
【0122】
このようにリファレンス方式とマークアンドスイープ方式を組み合わせて、ステップS24及びステップS25においてはリファレンスカウント方式によりオブジェクトの解放を行い、メモリ不足時にはステップS1701においてマークアンドスイープ方式によりループ状の参照関係にあるオブジェクトを解放する。ステップS1701の処理は、メモリ不足時のみ実行されるが、ステップS24及びステップS25においてリファレンスカウント方式によりオブジェクトの解放がなされているのでメモリ不足となる頻度は少なく、またステップS1701の処理は、比較的新しい世代ヒープを対象とした処理であるので、全体を対象とする場合と違って処理にかかる時間は短い。その他、説明を省略しているが実施の形態1と同様の処理部分については実施の形態1と同様に処理時間が短く、その時間を予測することができるので、ガベージコレクション装置は、応答性を要するアプリケーションプログラムにも利用することができる。
<実施の形態6>
実施の形態5のガベージコレクション装置は、ステップS1701の処理の後、実施の形態3のガベージコレクション装置300のように、ステップS1701の処理によって解放されなかったオブジェクトをより古い世代ヒープに移動する構成を加えても良い。
<実施の形態7>
以下、実施の形態7にかかるガベージコレクション装置について説明する。
【0123】
実施の形態1における各ガベージコレクション装置は、メソッド呼び出し毎に生成された世代ヒープ内にオブジェクトを生成するよう構成されていた。これに対し実施の形態7のガベージコレクション装置は、オブジェクト自体を世代ヒープではなく別のメモリ領域(以下、実体メモリと呼ぶ。)に生成し、世代ヒープにオブジェクトへのポインタを生成する点で、実施の形態1とは異なっている。
【0124】
図28(a)及び(b)は、実施の形態7のガベージコレクション装置における世代ヒープを中心とするメモリ構造の一例を示す。
図28(a)において、ガベージコレクション装置は、まず、アプリケーションプログラムの実行により、第一のメソッドが呼び出されると、第一のメソッド用に作業用のフレーム(不図示)を1つ生成し、そのフレームに対応して第一世代の世代ヒープを生成する。そして第一世代の世代ヒープ内にローカル変数(不図示)及びオブジェクトへのポインタのための領域を確保して各領域を初期化する。
【0125】
次に第一のメソッド実行中に第二のメソッドが呼び出されると、先と同様の手順によりフレーム(不図示)及び第二世代の世代ヒープを生成し、第二世代の世代ヒープ内にローカル変数(不図示)及びオブジェクトへのポインタのための領域の確保及び初期化を行う。
さらに第二のメソッド実行中に第三のメソッドが呼び出されると、先と同様の手順によりフレーム(不図示)及び第三世代の世代ヒープを生成し、第三世代の世代ヒープ内にローカル変数(不図示)及びオブジェクトへのポインタのための領域の確保及び初期化を行う。ここで各オブジェクトは、オブジェクトを指すポインタが所属する世代番号を保持するための領域を持ち、同図(a)および(b)においては各オブジェクトの左上隅に番号を付して示す。
【0126】
このように世代ヒープを生成しつつ、各メソッドの実行中にオブジェクトの生成があると、実体メモリの空き領域にオブジェクト用の領域を確保し、そのオブジェクトへのポインタをそのメソッドに対応する世代ヒープに格納する。
そして旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照が発生した場合には、新世代ヒープのポインタを旧世代ヒープにコピーする。
【0127】
以下、このコピーについて具体的に説明する。
図28(a)において、第一世代の世代ヒープにあるポインタ2900は、実態メモリにあるインスタンスAを指し、第三世代の世代ヒープにあるポインタ2901は、実体メモリにあるインスタンスBを指し、第二世代の世代ヒープにあるポインタ2902は、実体メモリにあるインスタンスCを指す。またインスタンスAはインスタンスBを参照し(図中、点線矢印にて示す)、インスタンスBはインスタンスCを参照する。
【0128】
このような参照関係において、インスタンスAからインスタンスBへの参照は、第一世代の世代ヒープのポインタ2900が指すインスタンスAから第三世代の世代ヒープのポインタ2901が指すインスタンスBへの参照であり、すなわち、旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照である。このような参照関係がある場合、新世代ヒープのポインタの値は、旧世代ヒープにコピーされる。つまりインスタンスBを指す第三世代の世代ヒープのポインタ2901の値が第一世代の世代ヒープにコピーされることとなる。図28(b)の第一世代の世代ヒープ中のポインタ2903は、ポインタ2901のコピーであることを示す。またこのとき、インスタンスBが持つ世代番号は、ポインタのコピーに伴いコピー元の世代ヒープの世代番号3からコピー先の世代番号1に変更される。
【0129】
ポインタ2901がポインタ2903にコピーされることにより、インスタンスBからインスタンスCへの参照は、第三世代の世代ヒープのポインタ2901が指すインスタンスBから第二世代の世代ヒープのポインタ2902が指すインスタンスCへの参照だけでなく、また第一世代の世代ヒープのポインタ2903が指すインスタンスBから第二世代の世代ヒープのポインタ2902が指すインスタンスCへの参照となる。このようにインスタンスBを指すポインタのコピーの結果、インスタンスB及びインスタンスCの関係についても、旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照関係となる。従って、第二世代の世代ヒープのポインタ2902の値も第一世代の世代ヒープのポインタ2904にコピーされ、インスタンスCが持つ世代番号は、コピー元のポインタ2902のある世代ヒープの世代番号2からコピー先のポインタ2904のある世代ヒープの世代番号1に変更される。この一連のポインタのコピーの結果、メモリの構造は図28(b)に示す通りとなる。
【0130】
このようなコピーによる方法の場合には、ポインタの移動後に新世代ヒープのポインタを削除する処理を必要としないという利点がある。
続いて、世代ヒープの解放について具体的に説明する。
図29(a)及び(b)は、第三世代の世代ヒープを解放する場合におけるメモリ構造の変化の一例を示す。
【0131】
図28(b)の状態において、第三世代の世代ヒープに対応するメソッドの実行が終了すると、ガベージコレクション装置は、第三世代の世代ヒープにあるポインタが指すオブジェクトの世代番号が3であるか否かを判別する。この判別は、オブジェクトの世代番号は、オブジェクトを指すポインタが所属する世代ヒープの世代番号と一致しているものであるので、世代番号が一致しないオブジェクトを残し、一致するオブジェクトを解放するためである。この判別の結果、インスタンス2905、2906及び2907が、世代番号3のオブジェクトである。よってガベージコレクション装置は、インスタンス2905、2906及び2907を解放し、その結果、メモリ構造は、図29(b)に示すようになる。
【0132】
以下、実施の形態7のガベージコレクション装置の詳細な処理手順について説明する。なお、実施の形態7のガベージコレクション装置の基本的な構成は、図1に示すガベージコレクション装置100の構成図とほぼ同様であるので、図1の構成図を利用して、ガベージコレクション装置100とは異なる部分を中心に説明することとする。
【0133】
図23は、実施の形態7の世代ヒープ生成部20が行う世代ヒープの生成処理の処理手順を示す。
ステップS411:世代ヒープ生成部20は、図4(c)に示すヒープメモリ生成処理を呼び出してヒープメモリ管理部60に実行させることにより、ヒープメモリ領域に世代ヒープを確保し、そのアドレスをheapとして取得する。
【0134】
ステップS2301:続いて、確保した世代ヒープ内にローカル変数を割当て初期化する。
ステップS2302:さらに、heapが指す世代ヒープ内にオブジェクトへのポインタを所定数(例えば1024個)分割当て、各ポインタをNULLで初期化する。
【0135】
ステップS413:最後に、図4(d)に示す世代ヒープのプッシュ処理を呼び出して世代ヒープ管理部50に実行させることにより、世代ヒープをスタックに積む。
このように世代ヒープ生成部20は、メソッド呼び出し毎に、ローカル変数、オブジェクトへのポインタ、1つ世代の古い世代ヒープを指す親ポインタからなる世代ヒープを生成する。
【0136】
図25(a)及び(b)は、実体メモリの生成処理及び実体メモリの解放処理を示す。
ヒープメモリ管理部60は、図4(c)及び図5(d)に示すヒープメモリの生成処理及び解放処理を行う他に、アプリケーションプログラムの実行開始及び終了時に、メモリ上にオブジェクト確保用として大きなサイズのメモリブロックを生成してそのアドレスをentityに代入する処理(ステップS2501)と、entityが指すメモリブロックを解放する処理(ステップS2502)とを行う。
【0137】
図26は、実施の形態7のガベージコレクション装置におけるオブジェクト生成部70が行うオブジェクトの生成処理を示す。
ステップS601:オブジェクト生成部70は、世代ヒープのアドレス確保用に変数heapを用意する。
ステップS2701:entityが指す実態メモリの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをobjに代入する。
【0138】
ステップS602:図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップS2702:heapが指す世代ヒープのオブジェクトへのポインタを収める領域から空き領域を探し、そこにobjの内容を代入する。
ステップS2703:objが指すオブジェクトの世代番号に、heapが指す世代ヒープの世代番号を代入する。
【0139】
ステップS604:objが指すオブジェクトにメンバ変数を割当て初期化する。
図27は、実施の形態7のガベージコレクション装置における世代間オブジェクト移動部80が行う世代間オブジェクト移動下請け処理を示す。世代間オブジェクト移動部80は、世代ヒープにあるローカル変数への代入や実体メモリにあるオブジェクトのメンバ変数への代入を行い、オブジェクト間の参照関係が発生すると、図8(a)に示す世代間オブジェクト移動処理を行う。このとき世代間オブジェクト移動部80は、図8(a)のステップS808において図8(b)を行う代わりに、図27に示す処理を行う。
【0140】
ステップS2801:世代間オブジェクト移動部80は、heapが指す世代ヒープのオブジェクトへのポインタを収める領域から空き領域を探し、そこにobjの内容を代入する。
ステップS2802:heapが指す世代ヒープの世代番号をobjが指すオブジェクトの世代番号に代入する。
【0141】
このようにして世代間オブジェクト移動部80は、オブジェクトへのポインタを世代ヒープ間で移動させた場合には、移動させたポインタに対応するオブジェクトが持つ世代番号に、ポインタが所属する世代ヒープの世代番号を代入する。図24は、実施の形態7の世代ヒープ解放部40が行う世代ヒープの解放処理を示す。アプリケーションプログラム中のメソッドが終了してフレーム解放部30により図5(a)に示す処理が実行されてステップS501の世代ヒープの解放処理が呼び出されると、世代ヒープ解放部40は、図24に示す処理を行う。
【0142】
ステップS2401:世代ヒープ解放部40は、ヒープメモリへのポインタ用の変数heapと、オブジェクトへのポインタ用の変数objと、世代番号用の変数gを用意する。
ステップS602:次に、図6(b)に示す現在の世代ヒープ取得処理を呼び出して世代ヒープ管理部50に実行させることにより、現在実行中のメソッドに対応する世代ヒープのアドレスであるheapを取得する。
【0143】
ステップS2402:gにheapが指す世代ヒープの世代番号を代入する。ステップS2403:heapが指す世代ヒープにあるポインタのうち、オブジェクトを指すポインタが残っている間、それをobjに代入して、そのポインタにはNULLを代入し、ステップS2403とステップS2406との間の処理を繰り返す。
【0144】
ステップS2004:objが指すオブジェクトの世代番号が、ステップS2402で代入されたgであるか否かを判定する。
ステップS2405:判定の結果、objが指すオブジェクトの世代番号とgとが一致する場合、objが指すオブジェクトの領域を解放する。
一方、判定の結果、一致しない場合には何もしない。つまりオブジェクトが持つ世代番号と解放対象の世代ヒープの世代番号とが一致しない場合には当該オブジェクトを解放しない。当該オブジェクトは、当該オブジェクトが持つ世代番号の世代ヒープにあるポインタにより指されているからである。
【0145】
ステップS511:図5(c)に示す世代ヒープのポップ処理を呼び出すことにより、スタックから対象の世代ヒープをはずして世代ヒープを解放する。
このように実施の形態7のガベージコレクション装置は、メソッドの実行中にオブジェクトの生成があると、オブジェクトを実体メモリに生成し、当該オブジェクトへのポインタをメソッドに対応する世代ヒープに生成する。そしてオブジェクトのメンバ変数への値の代入によって、旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照関係が発生したら、新世代ヒープのポインタを旧世代ヒープにコピーする。さらにメソッドが終了すると、対応するフレーム及び世代ヒープを解放する。この解放においては、世代ヒープのポインタにNULLを代入し、その世代ヒープのポインタが指すオブジェクトを、他の世代ヒープから指されているオブジェクトを除いて、解放する。
<実施の形態8>
以下、実施の形態8にかかるガベージコレクション装置について説明する。
【0146】
実施の形態8にかかるガベージコレクション装置は、実施の形態7のガベージコレクション装置と同様に、世代ヒープ内にオブジェクトへのポインタを生成し、オブジェクト自体は実体メモリに生成する。実施の形態8が実施の形態7と異なる点は、実施の形態8のガベージコレクション装置においては、各オブジェクトが世代番号の代わりに当該オブジェクトを指すポインタのアドレスを逆ポインタとして持つ点と世代間でオブジェクトをコピーする代わりにオブジェクトを移動させる点である。その他は、実施の形態7とほぼ同様である。以下、異なる点を中心に説明する。
【0147】
図22(a)は、実施の形態8のガベージコレクション装置における世代ヒープを中心とするメモリ構造の一例を示す。
図22(a)において、ガベージコレクション装置は、まず、アプリケーションプログラムの実行により、第一のメソッドが呼び出されると、第一のメソッド用に作業用のフレーム(不図示)を1つ生成し、そのフレームに対応して第一世代の世代ヒープを生成する。そして第一世代の世代ヒープ内にローカル変数(不図示)及びオブジェクトへのポインタのための領域を確保して各領域を初期化する。
【0148】
次に第一のメソッド実行中に第二のメソッドが呼び出されると、先と同様の手順によりフレーム(不図示)及び第二世代の世代ヒープを生成し、第二世代の世代ヒープ内にローカル変数(不図示)及びオブジェクトへのポインタのための領域の確保及び初期化を行う。
さらに第二のメソッド実行中に第三のメソッドが呼び出されると、先と同様の手順によりフレーム(不図示)及び第三世代の世代ヒープを生成し、第三世代の世代ヒープ内にローカル変数(不図示)及びオブジェクトへのポインタのための領域の確保及び初期化を行う。
【0149】
このように世代ヒープを生成しながら、各メソッドの実行中にオブジェクトの生成があると、実体メモリの空き領域にオブジェクト用の領域を確保し、そのオブジェクトへのポインタをそのメソッドに対応する世代ヒープに格納する。
そして旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照が発生した場合には、新世代ヒープのポインタを旧世代ヒープへと移動させる。
【0150】
以下、この移動について具体的に説明する。
図22(a)において、第一世代の世代ヒープにあるポインタ2200は、実体メモリにあるインスタンスAを指し、第三世代の世代ヒープにあるポインタ2201は、実態メモリにあるインスタンスBを指し、第二世代の世代ヒープにあるポインタ2202は、実体メモリにあるインスタンスCを指す。またインスタンスAはインスタンスBを参照し(図中、点線矢印にて示す)、インスタンスBはインスタンスCを参照する。
【0151】
このような参照関係において、インスタンスAからインスタンスBへの参照は、第一世代の世代ヒープのポインタ2200が指すインスタンスAから第三世代の世代ヒープのポインタ2201が指すインスタンスBへの参照であり、すなわち、旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照である。このような参照関係がある場合、新世代ヒープのポインタは旧世代ヒープに移される。つまり第三世代の世代ヒープのポインタ2201は、第一世代の世代ヒープに移されることとなる。
【0152】
ポインタ2201の移動により、インスタンスBからインスタンスCへの参照は、第一世代の世代ヒープのポインタ2201が指すインスタンスBから第二世代の世代ヒープのポインタ2202が指すインスタンスCへの参照となり、つまりこれも旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照となる。従って、第二世代の世代ヒープのポインタ2202も、第一世代の世代ヒープに移され、その結果、世代ヒープの構造は図22(b)に示す通りとなる。
【0153】
このように実施の形態8のガベージコレクション装置においては、実体メモリにあるオブジェクトの位置は移動しないが、世代ヒープにあるオブジェクトへのポインタを世代ヒープ間で移動することによって、間接的にオブジェクトの属する世代を変更している。そしてメソッドの実行が終了したときには、メソッドに対応するフレームの解放とともに、対応する世代ヒープを一気に解放する。このような解放の仕方により、従来のように使用済みのオブジェクトを探索して、探索された使用済みのオブジェクトを解放するという時間のかかる操作を行わないので短時間で処理することができる。
【0154】
以下、実施の形態8のガベージコレクション装置の詳細な処理手順について説明する。なお、実施の形態8のガベージコレクション装置の基本的な構成は、図1に示すガベージコレクション装置100の構成図とほぼ同様であり、また各構成要素の処理手順は実施の形態7のガベージコレクション装置とほぼ同様であるので、以下、図1の構成図を利用して、ガベージコレクション装置100及び実施の形態7のガベージコレクション装置とは異なる部分を中心に説明することとする。
【0155】
図31は、実施の形態8におけるガベージコレクション装置のオブジェクト生成部70が行うオブジェクト生成処理の処理手順を示す。
ステップS601:オブジェクト生成部70は、世代ヒープのアドレス確保用に変数heapを用意する。
ステップS2701:entityが指す実態メモリの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをobjに代入する。ここで実体メモリは、実施の形態7と同様に図25(a)及び(b)に示す実態メモリの生成処理及び実体メモリの解放処理により生成及び解放されるものである。
【0156】
ステップS602:図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスをheapに取得する。ステップS3101:heapが指すヒープメモリのオブジェクトへのポインタを収める領域から空きを探し、そこにobjの内容を代入し、objが指すオブジェクトの逆ポインタにその領域のアドレスを代入する。
【0157】
ステップS604:objが指すオブジェクトのメンバ変数を割当て、初期化する。
図32は、実施の形態8のガベージコレクション装置における世代間オブジェクト移動部80が行う世代間オブジェクト移動下請け処理を示す。世代間オブジェクト移動部80は、世代ヒープにあるローカル変数への代入や実体メモリにあるオブジェクトのメンバ変数への代入を行い、オブジェクト間の参照関係が発生すると、図8(a)に示す世代間オブジェクト移動処理を行う。このとき世代間オブジェクト移動部80は、図8(a)のステップS808において図8(b)を行う代わりに、図32に示す処理を行う。
【0158】
ステップS3201:objが指すオブジェクトの逆ポインタが指す領域にNULLを代入する。
ステップS3202:heapが指すヒープメモリのオブジェクトへのポインタを収める領域から空きを探し、そこにobjの内容を代入し、objが指すオブジェクトの逆ポインタにその領域のアドレスを代入する。
【0159】
このように世代間オブジェクト移動部80は、それまでのオブジェクトを指していたポインタにNULLを代入することで、新世代ヒープのポインタとオブジェクトとの関係を解除し、旧世代ヒープにオブジェクトへのポインタを新たに生成し、オブジェクトにはその逆ポインタを生成する。
図30は、世代ヒープ解放部40が行う世代ヒープの解放処理の処理手順を示す。実施の形態8におけるガベージコレクション装置の世代ヒープ解放部40は、図5(a)のフレーム解放処理中のステップS501において世代ヒープの解放処理が呼び出されると、図30の処理を行う。
【0160】
ステップS3001:世代ヒープ解放部40は、ヒープメモリのアドレス用の変数heap、オブジェクトへの間接ポインタ用に変数ptr、オブジェクトへの直接ポインタ用に変数objを用意する。
ステップS602:次に、図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
【0161】
ステップS3002:続いて、heapが指しているヒープメモリのオブジェクトへのポインタで、オブジェクトを指しているアドレスが残っている間、そのポインタのアドレスをptrに代入し、ステップS3002とステップS3006との間の処理を繰り返す。
ステップS3003:objにptrが指している領域の内容を代入する。
【0162】
ステップS3004:objが指すオブジェクトの逆ポインタがptrと一致するか否かを判定する。
ステップS3005:判定の結果、一致する場合には、objが指すオブジェクト領域を解放し、一致しない場合には何もしない。
ステップS511:最後に、図5(c)に示す世代ヒープのポップ処理を呼び出し、世代ヒープが積まれたスタックから世代ヒープを1つはずして解放する。
<その他の実施の形態>
実施の形態1から6においてオブジェクト間の参照は、オブジェクトが他のオブジェクトへのポインタを保持することによって他のオブジェクトを直接参照する方式であった。この方式の代わりに、ハンドルメモリというハンドルを保持する領域を設け、ハンドルを介してオブジェクト間のあらゆる参照関係を構築する方式にしてもよい。例えば、オブジェクトAからオブジェクトBへの参照は、実施の形態1から6の場合、オブジェクトAがオブジェクトBを指すポインタを保持することにより表される。これに対し、ハンドルを介する方式の場合は、オブジェクトAがハンドルを指すポインタを保持し、当該ハンドルはオブジェクトBを指すポインタを保持する。このような方式によりオブジェクトBを他の世代ヒープへ移動させた場合、オブジェクトAが保持するポインタは変更せず、ハンドルが保持するポインタを変更することになる。
【0163】
以下、この方式を用いる場合における実施形態1から6の変更点及び追加点を示す。
図33(a)及び(b)は、実施の形態1から6のガベージコレクション装置に追加すべき処理を示す。図33(a)に示すようにガベージコレクション装置は、アプリケーションプログラムが実行開始されると、大きなサイズのメモリブロックを確保することによりハンドル保持用のハンドルメモリを生成し、そのアドレスをentityに代入する(ステップS3301)。また図33(b)に示すようにアプリケーションプログラムが実行終了すると、entityが指すハンドルメモリを解放する(ステップS3302)。
【0164】
図34は、実施の形態1のオブジェクト生成部が図6(a)の代わりに行うべきオブジェクト生成処理を示す。
ステップS601:オブジェクト生成部は、世代ヒープのアドレス確保用に変数heapを用意する。
ステップS602:次に、図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
【0165】
ステップS3401:ハンドルメモリの空き領域からハンドルを割当て、そのアドレスをobjに代入する。
ステップS3402:heapが指す世代ヒープの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをobjがさすハンドルの「対応するオブジェクト」領域に代入し、オブジェクトの「対応するハンドル」領域にobjの内容を代入する。
【0166】
ステップS604:さらに、objが指すオブジェクトのメンバ変数を割当てて、オブジェクトの領域を初期化する。
図37は、実施の形態2及び3のオブジェクト生成部が図11(a)の代わりに行うべきオブジェクト生成処理を示す。
ステップS1101:オブジェクト生成部は、オブジェクトのアドレス用にobjを用意し、世代ヒープのアドレス確保用に変数heapを用意する。
【0167】
ステップS602:次に、図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップS1102:ステップS602において取得したアドレスが指す世代ヒープに、十分の広さの空き領域があるか否かを判定する。
ステップS1103:ステップS1102の判定の結果、十分な広さの空き領域がない場合には、世代ヒープのスカビンジ処理を呼び出し、世代ヒープスカビンジ部に当該世代ヒープについてのスカビンジ処理を行わせる。
【0168】
ステップS3701:ハンドルメモリの空き領域からハンドルを割当て、そのアドレスにobjを代入する。
ステップS3702:heapが指す世代ヒープの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをobjがさすハンドルの「対応するオブジェクト」領域に代入し、オブジェクトの「対応するハンドル」領域にobjの内容を代入する。
【0169】
ステップS604:objが指すオブジェクトのメンバ変数を割当て、オブジェクトの領域を初期化する。
図38は、実施の形態4のオブジェクト生成部が図17の代わりに行うべきオブジェクト生成処理を示す。
ステップS601:オブジェクト生成部は、世代ヒープのアドレス確保用に変数heapを用意する。
【0170】
ステップS602:次に、図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップS3801:ハンドルメモリの空き領域からハンドルを割当て、そのアドレスにobjを代入する。
ステップS3802:heapが指す世代ヒープの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをobjがさすハンドルの「対応するオブジェクト」領域に代入し、オブジェクトの「対応するハンドル」領域にobjの内容を代入する。
【0171】
ステップS1801:objが指すオブジェクトの被参照数に0をセットする。
ステップS604:objが指すオブジェクトのメンバ変数を割当て、オブジェクトの領域を初期化する。
図40は、実施の形態5及び6のオブジェクト生成部が行うべきオブジェクト生成処理を示す。
【0172】
ステップS601:オブジェクト生成部は、世代ヒープのアドレス確保用に変数heapを用意する。
ステップS602:次に、図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップS1102:ステップS602において取得したアドレスが指す世代ヒープに、十分の広さの空き領域があるか否かを判定する。
【0173】
ステップS1103:ステップS1102の判定の結果、十分な広さの空き領域がない場合には、世代ヒープのスカビンジ処理を呼び出し、世代ヒープスカビンジ部に当該世代ヒープについてのスカビンジ処理を行わせる。
ステップS4005:heapが指す世代ヒープの空き領域からオブジェクトを割当て、そのアドレスをobjに代入する。
【0174】
ステップS4006:ハンドルメモリの空き領域からハンドルを割当て、そのアドレスにobjを代入する。
ステップS4007:heapが指す世代ヒープの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをobjがさすハンドルの「対応するオブジェクト」領域に代入し、オブジェクトの「対応するハンドル」領域にobjの内容を代入する。
【0175】
ステップS1801:objが指すオブジェクトの被参照数に0をセットする。
ステップS604:objが指すオブジェクトのメンバ変数を割当て、オブジェクトの領域を初期化する。
図36は、実施の形態1及び4の世代間オブジェクト移動部が図8(b)の代わりに行うべき世代間オブジェクト移動下請け処理を示す。
【0176】
ステップS3601:objが指すハンドルに対応するオブジェクトを、heapが指す世代ヒープに移動する。
ステップS3602:objが指しているハンドルの「対応するオブジェクト」領域に、移動した先のオブジェクトのアドレスを代入する。
図39は、実施の形態4から6のオブジェクト解放部が図20の代わりに行うべきオブジェクト解放処理を示す。
【0177】
ステップS2101:オブジェクト解放部は、オブジェクトのアドレス格納用として変数workを用意する。
ステップS2102:objが指しているオブジェクトのメンバで、他のオブジェクトを指しているアドレスが残っている間、それをworkに代入して、ステップS1904の処理を繰り返す。
【0178】
ステップS1904:被参照数デクリメント処理を呼び出して被参照数変更部に実行させる。
ステップS3901:objが指すオブジェクトの「対応するハンドル」領域が指すハンドルを解放する。
ステップS2105:objが指すオブジェクト領域を解放する。
【0179】
図35は、実施の形態1から6の世代ヒープ解放部が図5(b)の代わりに行うべき世代ヒープの解放処理を示す。
ステップS3501:世代ヒープ解放部は、ヒープメモリへのポインタとして変数heapを用意し、オブジェクトへのポインタとして変数objを用意する。
【0180】
ステップS602:図6(b)に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップS3503:gにheapが指す世代ヒープの世代番号を代入する。ステップS3504:heapが指しているヒープメモリのすべてのオブジェクトについて、そのアドレスをobjに代入して、ステップS3505を繰り返す。
【0181】
ステップS3505:objが指すオブジェクトの「対応するハンドル」が指すハンドルを解放する。
ステップS511:図5(c)に示す世代ヒープのポップ処理を呼び出して、スタックから対象の世代ヒープをはずして世代ヒープを解放する。
このようにハンドルを介して参照関係を表す方式においては、オブジェクトを世代ヒープ間で移動させたとき、当該オブジェクトに対応するハンドルが持つポインタを変更するのみでよい。これに対し、実施の形態1から6のハンドルを介さずにオブジェクト間で直接参照する方式の場合、オブジェクトを移動した際、当該オブジェクトを指していたポインタをすべて変更しなければならない。よってハンドルを介して参照関係を表す方式においては、1つのオブジェクトの移動につき、オブジェクトの実際の移動にかかる時間と対応するハンドル内のポインタの変更にかかる時間とをあわせた時間がかかる。この時間は一定であるので、移動対象のオブジェクトの数を予め把握することができれば、1つのオブジェクトの移動に要する時間と移動対象のオブジェクトの数とを掛け合わせた時間が処理時間となり、正確に処理時間を予測することができることとなる。そして処理時間を予測できるガベージコレクション装置は、応答性を要するアプリケーションプログラムに利用することができる。
【0182】
以上、各実施形態について説明したが上記実施形態の他に実施形態同士で組み合わせ可能なものを組み合わせて実施してもよい。
各実施形態におけるガベージコレクション装置の動作手順を汎用のコンピュータ又はプログラム実行機能を有する機器等に実行させるためのコンピュータプログラムとし、記録媒体に記録し又は各種通信路等を介して流通させ頒布することもできる。このような記録媒体にはICカード、光ディスク、フレキシブルディスク、ROM等がある。
【0183】
各実施形態におけるガベージコレクション装置の動作手順を方法として実施してもよい。
【0184】
【発明の効果】
本発明のガベージコレクション装置は、アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を記録する確保手段と、メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動手段と、メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放手段とを備える。
【0185】
このような構成により、古いメソッド用メモリ領域から参照されている新しいメソッド用メモリ領域のオブジェクトを古いメソッド用メモリ領域に移動させるので、新しいメソッド用メモリ領域について、その中の各オブジェクトが使用済みか否かを把握する必要なく、メソッドの終了と同時に一気に解放することができる。このように使用済みか否かの把握に要する時間が不要となるので解放にかかる時間は短い。またこの解放は定型的な処理を行うだけであるため、解放に要する時間は常に一定であり、解放の処理の各ステップに要する予測時間の合計から解放に要する時間を予測することができる。
【0186】
また移動対象のオブジェクトはメモリ領域全体に多数存在するのではなく、比較的新しいメソッド用メモリ領域、すなわちメモリ領域全体の局所的な部分に存在するので、その分数が少なく、移動に要する時間は短くなる。また移動に要する時間は、オブジェクトの合計サイズに比例するので、1つのオブジェクトに対して参照関係によりぶら下がるオブジェクトの合計サイズの上限を予め定めておけば、移動に要する時間の上限を予測することができる。あるいは、各メソッド用メモリ領域の上限を定めておけば、移動させるオブジェクトは参照元のオブジェクトが存在する古いメソッド用メモリ領域よりも新しいメソッド用メモリ領域に存在するので、新しい各メソッド用メモリ領域の合計サイズから、移動に要する時間の上限を予測することができる。
【0187】
加えて、古いメソッド用メモリ領域から新しいメソッド用メモリ領域のオブジェクトへの参照は特定の命令を実行した場合にしか発生しないので、世代間のオブジェクトの移動は発生頻度が比較的少ない。よって移動によりアプリケーションプログラムの実行が中断される回数は少なく、全体として中断される時間も短くなる。
【0188】
以上のことから、ガベージコレクション装置は、メソッド用メモリ領域の解放やオブジェクトの移動等の主な処理の起動時間が短く、その時間を上限の予測も含めて予測することができるので、応答性を要するアプリケーションプログラムにも利用することができる。
【図面の簡単な説明】
【図1】本発明の実施の形態1に係るガベージコレクション装置100の構成図である。
【図2】(a)は、ガベージコレクション装置100の動作の概略を示すフローチャートである。
(b)は、ステップS25のオブジェクトの移動処理の概略を示すフローチャートである。
【図3】(a)及び(b)は、生成された世代ヒープに確保されたメモリオブジェクトの移動の一例を示す図である。
【図4】(a)は、フレームの生成処理を示す。
(b)は、世代ヒープ生成処理を示す。
(c)は、ヒープメモリの生成処理を示す。
(d)は、世代ヒープのプッシュ処理を示す。
【図5】(a)は、フレーム解放処理を示す。
(b)は、世代ヒープの解放処理を示す。
(c)は、世代ヒープのポップ処理を示す。
(d)は、ヒープメモリの解放処理を示す。
【図6】(a)は、オブジェクト生成処理を示す。
(b)は、現在の世代ヒープ取得処理を示す。
【図7】(a)は、世代間オブジェクト移動部80が行うローカル変数への代入処理を示す。
(b)は、世代間オブジェクト移動部80が行うメンバ変数への代入処理を示す。
【図8】(a)は、世代間オブジェクト移動部80が行う世代間オブジェクト移動処理を示す。
(b)は、世代間オブジェクト移動部80が行う世代間オブジェクト移動下請け処理を示す。
【図9】実施の形態2に係るガベージコレクション装置200の構成図である。
【図10】ガベージコレクション装置200の動作の概略を示すフローチャートである。
【図11】(a)は、オブジェクト生成部72が行うオブジェクトの生成処理を示す。
(b)は、世代間オブジェクト移動下請け処理の処理手順を示す。
(c)は、世代ヒープのスカビンジ処理の処理手順を示す。
【図12】(a)は、世代ヒープのマーキング処理の処理手順を示す。
(b)は、到達フラグのマーキング処理の手順を示す。
【図13】世代ヒープのスイーピング処理の処理手順を示す。
【図14】実施の形態3に係るガベージコレクション装置300の構成図である。
【図15】世代ヒープスカビンジ部93が行う世代ヒープスカビンジ処理の処理手順を示す。
【図16】実施の形態4に係るガベージコレクション装置400の構成図である。
【図17】オブジェクト生成部74が行うオブジェクト生成処理を示す。
【図18】(a)は、世代間オブジェクト移動部84が行うローカル変数への代入処理を示す。
(b)は、世代間オブジェクト移動部84が行うメンバ変数への代入処理を示す。
【図19】(a)は、被参照数変更部94が行う被参照数デクリメント処理を示す。
(b)は、被参照数変更部94が行う被参照数インクリメント処理を示す。
【図20】オブジェクト解放部95が行うオブジェクト解放処理を示す。
【図21】ガベージコレクション装置400の動作の概略を示すフローチャートである。
【図22】(a)は、実施の形態8のガベージコレクション装置における世代ヒープを中心とするメモリ構造の一例を示す。
(b)は、図22(a)の例におけるポインタ移動後のメモリ構造の例を示す。
【図23】実施の形態7の世代ヒープ生成部20が行う世代ヒープの生成処理の処理手順を示す。
【図24】実施の形態7の世代ヒープ解放部40が行う世代ヒープの解放処理を示す。
【図25】(a)は、実体メモリの生成処理を示す。
(b)は、実体メモリの解放処理を示す。
【図26】実施の形態7のガベージコレクション装置におけるオブジェクト生成部70が行うオブジェクトの生成処理を示す。
【図27】実施の形態7のガベージコレクション装置における世代間オブジェクト移動部80が行う世代間オブジェクト移動下請け処理を示す。
【図28】(a)は、実施の形態7のガベージコレクション装置における世代ヒープを中心とするメモリ構造の一例を示す。
(b)は、図28(a)の例におけるポインタコピー後のメモリ構造の例を示す。
【図29】(a)は、第三世代の世代ヒープを解放する場合におけるメモリ構造の変化の例を示す。
(b)は、図29(a)の例におけるオブジェクト解放後のメモリ構造の例を示す。
【図30】世代ヒープ解放部40が行う世代ヒープの解放処理の処理手順を示す。
【図31】実施の形態8におけるガベージコレクション装置のオブジェクト生成部70が行うオブジェクト生成処理の処理手順を示す。
【図32】実施の形態8のガベージコレクション装置における世代間オブジェクト移動部80が行う世代間オブジェクト移動下請け処理を示す。
【図33】(a)及び(b)は、実施の形態1から6のガベージコレクション装置に追加すべきハンドルメモリの生成処理及び解放処理を示す。
【図34】実施の形態1のオブジェクト生成部が図6(a)の代わりに行うべきオブジェクト生成処理を示す。
【図35】実施の形態1から6の世代ヒープ解放部が図5(b)の代わりに行うべき世代ヒープの解放処理を示す。
【図36】実施の形態1及び4の世代間オブジェクト移動部が図8(b)の代わりに行うべき世代間オブジェクト移動下請け処理を示す。
【図37】実施の形態2及び3のオブジェクト生成部が図11(a)の代わりに行うべきオブジェクト生成処理を示す。
【図38】実施の形態4のオブジェクト生成部が図17の代わりに行うべきオブジェクト生成処理を示す。
【図39】実施の形態4から6のオブジェクト解放部が図20の代わりに行うべきオブジェクト解放処理を示す。
【図40】実施の形態5及び6のオブジェクト生成部が行うべきオブジェクト生成処理を示す。
【符号の説明】
10 フレーム生成部
20 世代ヒープ生成部
30 フレーム解放部
40 世代ヒープ解放部
50 世代ヒープ管理部
60 ヒープメモリ管理部
70 オブジェクト生成部
72 オブジェクト生成部
74 オブジェクト生成部
80 世代間オブジェクト移動部
82 世代間オブジェクト移動部
83 世代間オブジェクト移動部
84 世代間オブジェクト移動部
90 世代ヒープスカビンジ部
93 世代ヒープスカビンジ部
94 被参照数変更部
95 オブジェクト解放部
100 ガベージコレクション装置
200 ガベージコレクション装置
300 ガベージコレクション装置
400 ガベージコレクション装置

Claims (14)

  1. アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を記録する確保手段と、
    メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動手段と、
    メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放手段と
    を備えることを特徴とするガベージコレクション装置。
  2. 前記ガベージコレクション装置は、さらに、
    実行中のメソッドに対応するメソッド用メモリ領域又は前記移動手段におけるオブジェクトの移動先のメソッド用メモリ領域のメモリ不足を検出した場合に、前記メソッド用メモリ領域についてどこからも参照されていないオブジェクトを探索し、探索したオブジェクトを解放するガベージコレクション手段
    を備えることを特徴とする請求項1に記載のガベージコレクション装置。
  3. 前記ガベージコレクション手段は、マークアンドスイープ方式により前記探索及び前記解放を行う
    ことを特徴とする請求項2に記載のガベージコレクション装置。
  4. 前記ガベージコレクション装置は、さらに、
    アプリケーションプログラムの実行によるオブジェクト間の参照状態の変更に応じて各オブジェクトが保持するリファレンスカウンタを変更し、リファレンスカウンタが0に変更されたオブジェクトを解放するオブジェクト解放手段
    を備えることを特徴とする請求項1から3のいずれかに記載のガベージコレクション装置。
  5. 前記移動手段は、さらに、
    前記ガベージコレクション手段による処理後の前記メソッド用メモリ領域において解放されずに残ったオブジェクトを、前記メソッド用メモリ領域より先に確保されたメソッド用メモリ領域に移動させる
    ことを特徴とする請求項2から4のいずれかに記載のガベージコレクション装置。
  6. 前記ガベージコレクション装置において、2つのオブジェクト間の参照状態は、一方のオブジェクトがハンドル領域に設けられたハンドルへのポインタを保持し、ハンドルが他の一方のオブジェクトへのポインタを保持することにより、ハンドルを介して間接的に示される
    ことを特徴とする請求項1から5のいずれかに記載のガベージコレクション装置。
  7. アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を記録する確保手段と、
    メソッド用メモリ領域中にある第一のオブジェクトポインタが指すオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域にある第二のオブジェクトポインタが指すオブジェクトから参照されている場合に、前記第一のオブジェクトポインタを前記先に確保されたメソッド用メモリ領域に移動させる移動手段と、
    メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域とどこからも参照されなくなったオブジェクトとを解放する解放手段と
    を備えることを特徴とするガベージコレクション装置。
  8. 前記移動手段は、前記第一のオブジェクトポインタを前記先に確保されたメソッド用メモリ領域に移動させる代わりにコピーする
    ことを特徴とする請求項7記載のガベージコレクション装置。
  9. 前記各オブジェクトは、当該オブジェクトを指すオブジェクトポインタの属するメソッド用メモリ領域を特定する情報を保持し、
    前記解放手段は、前記オブジェクトの解放については、解放対象のメソッド用メモリ領域を特定する情報を保持するオブジェクトを解放する
    ことを特徴とする請求項7に記載のガベージコレクション装置。
  10. 前記各オブジェクトは、当該オブジェクトを指すオブジェクトポインタのアドレスを示す逆ポインタを保持し、
    前記解放手段は、前記オブジェクトの解放については、解放対象のメソッド用メモリに属するオブジェクトポインタのアドレスを逆ポインタとして保持するオブジェクトを解放する
    ことを特徴とする請求項7に記載のガベージコレクション装置。
  11. アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を所定の記憶領域に記録する確保ステップと、
    メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動ステップと、メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放ステップと
    からなることを特徴とするガベージコレクション方法。
  12. アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を所定の記憶領域に記録する確保ステップと、
    メソッド用メモリ領域中にある第一のオブジェクトポインタが指すオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域にある第二のオブジェクトポインタが指すオブジェクトから参照されている場合に、前記第一のオブジェクトポインタを前記先に確保されたメソッド用メモリ領域に移動させる移動ステップと、
    メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域とどこからも参照されなくなったオブジェクトとを解放する解放ステップと
    からなることを特徴とするガベージコレクション方法。
  13. アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を所定の記憶領域に記録する確保ステップと、
    メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動ステップと、メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放ステップと
    からなる処理をコンピュータに実行させることを特徴とするコンピュータ実行可能なガベージコレクションプログラム。
  14. アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を所定の記憶領域に記録する確保ステップと、
    メソッド用メモリ領域中にある第一のオブジェクトポインタが指すオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域にある第二のオブジェクトポインタが指すオブジェクトから参照されている場合に、前記第一のオブジェクトポインタを前記先に確保されたメソッド用メモリ領域に移動させる移動ステップと、
    メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域とどこからも参照されなくなったオブジェクトとを解放する解放ステップと
    からなる処理をコンピュータに実行させることを特徴とするコンピュータ実行可能なガベージコレクションプログラム。
JP2001382148A 2001-12-14 2001-12-14 ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム Expired - Lifetime JP3939975B2 (ja)

Priority Applications (4)

Application Number Priority Date Filing Date Title
JP2001382148A JP3939975B2 (ja) 2001-12-14 2001-12-14 ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム
EP02258489A EP1320034A3 (en) 2001-12-14 2002-12-10 Apparatus, method and program for implementing garbage collection suitable for real-time processing
US10/317,672 US6839726B2 (en) 2001-12-14 2002-12-12 Apparatus, method, and program for implementing garbage collection suitable for real-time processing
CNB021542465A CN1280730C (zh) 2001-12-14 2002-12-13 不用存储单元收集装置及不用存储单元收集方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2001382148A JP3939975B2 (ja) 2001-12-14 2001-12-14 ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム

Publications (2)

Publication Number Publication Date
JP2003186737A JP2003186737A (ja) 2003-07-04
JP3939975B2 true JP3939975B2 (ja) 2007-07-04

Family

ID=19187420

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2001382148A Expired - Lifetime JP3939975B2 (ja) 2001-12-14 2001-12-14 ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム

Country Status (4)

Country Link
US (1) US6839726B2 (ja)
EP (1) EP1320034A3 (ja)
JP (1) JP3939975B2 (ja)
CN (1) CN1280730C (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8397045B2 (en) 2009-12-25 2013-03-12 International Business Machines Corporation Memory management device, memory management method, and memory management program

Families Citing this family (38)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7127709B2 (en) * 2002-09-25 2006-10-24 Microsoft Corporation System and method for jointly managing dynamically generated code and data
US7730449B2 (en) * 2003-03-19 2010-06-01 Toshiba Corporation Auto reference counting pointer for C++ objects with ability to re-cast and lookup from a free pointer
US8108628B2 (en) * 2003-08-04 2012-01-31 Azul Systems, Inc. Processor instruction used to perform a matrix test to generate a memory-related trap
US20050081190A1 (en) * 2003-09-30 2005-04-14 International Business Machines Corporation Autonomic memory leak detection and remediation
CN101505221B (zh) * 2005-03-10 2011-12-07 日本电信电话株式会社 网络引导系统及单位存储单元的访问方法
US7962707B2 (en) * 2005-07-06 2011-06-14 Honeywell International Inc. Apparatus and method for deterministic garbage collection of a heap memory
US20070088908A1 (en) * 2005-10-17 2007-04-19 Phison Electronics Corp. Method for arranging heap memory
US7827373B2 (en) * 2005-10-31 2010-11-02 Honeywell International Inc. System and method for managing a short-term heap memory
US8099726B2 (en) * 2005-12-07 2012-01-17 Microsoft Corporation Implementing strong atomicity in software transactional memory
US8799882B2 (en) * 2005-12-07 2014-08-05 Microsoft Corporation Compiler support for optimizing decomposed software transactional memory operations
US7672983B2 (en) * 2005-12-19 2010-03-02 Sun Microsystems, Inc. Method and apparatus for tracking activity of a garbage collector with a plurality of threads that operate concurrently with an application program
US7631024B2 (en) * 2006-01-03 2009-12-08 Sun Microsystems, Inc. Method and apparatus for facilitating mark-sweep garbage collection with reference counting
US9361137B2 (en) 2006-03-10 2016-06-07 International Business Machines Corporation Managing application parameters based on parameter types
US9727604B2 (en) 2006-03-10 2017-08-08 International Business Machines Corporation Generating code for an integrated data system
US7467278B2 (en) * 2006-05-08 2008-12-16 International Business Machines Corporation Memory tuning for garbage collection and central processing (CPU) utilization optimization
JP2007328692A (ja) * 2006-06-09 2007-12-20 Canon Inc 代数演算方法及びその装置、プログラム
US20090307292A1 (en) * 2006-09-26 2009-12-10 Xiaofeng Li Dynamically changing a garbage collector in a managed runtime system
US8825718B2 (en) * 2006-12-28 2014-09-02 Oracle America, Inc. Methods and apparatus for marking objects for garbage collection in an object-based memory system
US8219518B2 (en) 2007-01-09 2012-07-10 International Business Machines Corporation Method and apparatus for modelling data exchange in a data flow of an extract, transform, and load (ETL) process
US8001336B2 (en) * 2007-03-02 2011-08-16 International Business Machines Corporation Deterministic memory management in a computing environment
JP5064134B2 (ja) * 2007-08-03 2012-10-31 株式会社日立製作所 メモリ管理方法およびその方法を用いるコンピュータ
JP5133649B2 (ja) * 2007-10-16 2013-01-30 京セラドキュメントソリューションズ株式会社 電子機器およびメモリ管理プログラム
US8082399B2 (en) * 2008-07-31 2011-12-20 International Business Machines Corporation Cache bounded reference counting
JP5153539B2 (ja) * 2008-09-22 2013-02-27 株式会社日立製作所 メモリ管理方法およびその方法を用いるコンピュータ
JP5380695B2 (ja) * 2010-02-23 2014-01-08 株式会社日立製作所 メモリ管理方法、計算機システム及びメモリ管理プログラム
WO2011104889A1 (ja) * 2010-02-25 2011-09-01 株式会社日立製作所 計算機システム、メモリ管理方法及びメモリ管理プログラム
US8327109B2 (en) * 2010-03-02 2012-12-04 Advanced Micro Devices, Inc. GPU support for garbage collection
US20120216015A1 (en) * 2011-02-22 2012-08-23 Mitra Sumanranjan S System and method to concurrently execute a plurality of object oriented platform independent programs by utilizing memory accessible by both a processor and a co-processor
US20140337597A1 (en) * 2012-03-02 2014-11-13 Hitachi, Ltd. Computer, program, and memory management method
JP5564540B2 (ja) * 2012-08-08 2014-07-30 株式会社日立製作所 メモリ管理方法、コンピュータ及びプログラム
JP5809612B2 (ja) * 2012-09-10 2015-11-11 日本電信電話株式会社 仮想マシン停止時間予測装置およびプログラム停止時間予測値計算方法
US8874535B2 (en) * 2012-10-16 2014-10-28 International Business Machines Corporation Performance of RCU-based searches and updates of cyclic data structures
CN105339905B (zh) * 2013-04-09 2018-11-06 伊姆西公司 具有对大容量固态存储器资源的独立直接访问的多处理器系统
US9361224B2 (en) 2013-09-04 2016-06-07 Red Hat, Inc. Non-intrusive storage of garbage collector-specific management data
JP5756549B2 (ja) * 2014-06-16 2015-07-29 株式会社日立製作所 記憶領域管理方法、計算機システム及びプログラム
US9852046B1 (en) * 2015-05-07 2017-12-26 Cadence Design Systems, Inc. Method and system for automated debugging memory allocation and memory release
CN108140100B (zh) * 2015-10-28 2021-10-08 赫尔实验室有限公司 维护对象的安全标签和引用计数的系统、方法和介质
US20190253357A1 (en) * 2018-10-15 2019-08-15 Intel Corporation Load balancing based on packet processing loads

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6098089A (en) * 1997-04-23 2000-08-01 Sun Microsystems, Inc. Generation isolation system and method for garbage collection
US5845298A (en) * 1997-04-23 1998-12-01 Sun Microsystems, Inc. Write barrier system and method for trapping garbage collection page boundary crossing pointer stores
US5953736A (en) * 1997-04-23 1999-09-14 Sun Microsystems, Inc. Write barrier system and method including pointer-specific instruction variant replacement mechanism
US5930807A (en) 1997-04-23 1999-07-27 Sun Microsystems Apparatus and method for fast filtering read and write barrier operations in garbage collection system
US5873104A (en) * 1997-06-26 1999-02-16 Sun Microsystems, Inc. Bounded-pause time garbage collection system and method including write barrier associated with source and target instances of a partially relocated object
US6105040A (en) * 1997-06-30 2000-08-15 Sun Microsystems, Inc. Method and apparatus for managing stored objects
US6081665A (en) * 1997-12-19 2000-06-27 Newmonics Inc. Method for efficient soft real-time execution of portable byte code computer programs
US6308185B1 (en) * 1998-03-06 2001-10-23 Sun Microsystems, Inc. Methods and apparatus for generational dynamic management of computer memory
US6317756B1 (en) 1998-10-07 2001-11-13 International Business Machines Corporation On-the-fly garbage collector
US6931423B2 (en) * 1999-02-11 2005-08-16 Oracle International Corp. Write-barrier maintenance in a garbage collector
US6769116B1 (en) * 1999-10-21 2004-07-27 Oracle International Corporation Diagnostic technique for debugging memory corruption
US6226653B1 (en) 2000-01-10 2001-05-01 International Business Machines Corporation Method and apparatus for performing generational garbage collection using remembered set counter

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8397045B2 (en) 2009-12-25 2013-03-12 International Business Machines Corporation Memory management device, memory management method, and memory management program

Also Published As

Publication number Publication date
CN1432919A (zh) 2003-07-30
EP1320034A3 (en) 2007-11-21
US20030140071A1 (en) 2003-07-24
US6839726B2 (en) 2005-01-04
CN1280730C (zh) 2006-10-18
EP1320034A2 (en) 2003-06-18
JP2003186737A (ja) 2003-07-04

Similar Documents

Publication Publication Date Title
JP3939975B2 (ja) ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム
EP1084472B1 (en) Memory reclamation method
KR100732869B1 (ko) 메모리 재이용 방법
US7111294B2 (en) Thread-specific heaps
EP0993634B1 (en) Method and apparatus for managing hashed objects
JP2002506550A (ja) 部分的に再配置されたオブジェクトのソース及び目標インスタンスに関する書込みバリアを含む有界休止時間ガーベッジコレクションシステム及び方法
JP4756231B2 (ja) 掃除用のガーベッジコレクションの効果を高めるための方法、コンピュータ読み取り可能媒体、コンピュータシステム、及び、メモリ
Brownbridge Cyclic reference counting for combinator machines
JP4265610B2 (ja) プログラム制御装置、プログラム制御方法、およびプログラム記録媒体
KR20010023063A (ko) 불필요한 정보 수집기들의 저장된 데이터 오브젝트를 마킹하기 위한 방법 및 장치
JP2002506549A (ja) 部分的に再配置されたオブジェクトのソースインスタンスに関連する書き込みバリアを含む有界休止時間ガーベッジコレクションシステム及びその方法
WO2002057913A2 (en) Method and apparatus for storing long-lived objects in a virtual machine
JP4333676B2 (ja) プログラム制御装置、プログラム制御方法、およびプログラム記録媒体
JP5051961B2 (ja) モジュール式ガーベッジコレクタを実現するための方法および装置
JP3826626B2 (ja) プログラム制御装置、プログラム制御方法、およびプログラム記録媒体
JP4345748B2 (ja) メモリ割当装置、メモリ割当方法、およびプログラム記録媒体
Jones et al. A fast analysis for thread-local garbage collection with dynamic class loading
Acar et al. Coupling memory and computation for locality management
US6636866B1 (en) System and method for object representation in an object-oriented programming language
JP4041347B2 (ja) ガベージコレクション装置及びガベージコレクション方法
EP0430668B1 (en) Method and system for reclaiming unreferenced computer memory space
Sagonas et al. Efficient memory management for concurrent programs that use message passing
WO2000000885A2 (en) Feedback-based memory allocation optimization in a garbage collection memory management scheme
Moreau et al. Gc2: a generational conservative garbage collector for the ATerm library
Schatzl et al. Optimized memory management for class metadata in a JVM

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20040819

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20061027

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: 20070327

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20070329

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110406

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120406

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130406

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130406

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140406

Year of fee payment: 7