(57)【特許請求の範囲】
【請求項１】
アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を記録する確保手段と、
メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動手段と、
メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放手段と
を備えることを特徴とするガベージコレクション装置。
【請求項２】
前記ガベージコレクション装置は、さらに、
実行中のメソッドに対応するメソッド用メモリ領域又は前記移動手段におけるオブジェクトの移動先のメソッド用メモリ領域のメモリ不足を検出した場合に、前記メソッド用メモリ領域についてどこからも参照されていないオブジェクトを探索し、探索したオブジェクトを解放するガベージコレクション手段
を備えることを特徴とする請求項１に記載のガベージコレクション装置。
【請求項３】
前記ガベージコレクション手段は、マークアンドスイープ方式により前記探索及び前記解放を行う
ことを特徴とする請求項２に記載のガベージコレクション装置。
【請求項４】
前記ガベージコレクション装置は、さらに、
アプリケーションプログラムの実行によるオブジェクト間の参照状態の変更に応じて各オブジェクトが保持するリファレンスカウンタを変更し、リファレンスカウンタが０に変更されたオブジェクトを解放するオブジェクト解放手段
を備えることを特徴とする請求項１から３のいずれかに記載のガベージコレクション装置。
【請求項５】
前記移動手段は、さらに、
前記ガベージコレクション手段による処理後の前記メソッド用メモリ領域において解放されずに残ったオブジェクトを、前記メソッド用メモリ領域より先に確保されたメソッド用メモリ領域に移動させる
ことを特徴とする請求項２から４のいずれかに記載のガベージコレクション装置。
【請求項６】
前記ガベージコレクション装置において、２つのオブジェクト間の参照状態は、一方のオブジェクトがハンドル領域に設けられたハンドルへのポインタを保持し、ハンドルが他の一方のオブジェクトへのポインタを保持することにより、ハンドルを介して間接的に示される
ことを特徴とする請求項１から５のいずれかに記載のガベージコレクション装置。
【請求項７】
アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を記録する確保手段と、
メソッド用メモリ領域中にある第一のオブジェクトポインタが指すオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域にある第二のオブジェクトポインタが指すオブジェクトから参照されている場合に、前記第一のオブジェクトポインタを前記先に確保されたメソッド用メモリ領域に移動させる移動手段と、
メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域とどこからも参照されなくなったオブジェクトとを解放する解放手段と
を備えることを特徴とするガベージコレクション装置。
【請求項８】
前記移動手段は、前記第一のオブジェクトポインタを前記先に確保されたメソッド用メモリ領域に移動させる代わりにコピーする
ことを特徴とする請求項７記載のガベージコレクション装置。
【請求項９】
前記各オブジェクトは、当該オブジェクトを指すオブジェクトポインタの属するメソッド用メモリ領域を特定する情報を保持し、
前記解放手段は、前記オブジェクトの解放については、解放対象のメソッド用メモリ領域を特定する情報を保持するオブジェクトを解放する
ことを特徴とする請求項７に記載のガベージコレクション装置。
【請求項１０】
前記各オブジェクトは、当該オブジェクトを指すオブジェクトポインタのアドレスを示す逆ポインタを保持し、
前記解放手段は、前記オブジェクトの解放については、解放対象のメソッド用メモリに属するオブジェクトポインタのアドレスを逆ポインタとして保持するオブジェクトを解放する
ことを特徴とする請求項７に記載のガベージコレクション装置。
【請求項１１】
アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を所定の記憶領域に記録する確保ステップと、
メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動ステップと、メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放ステップと
からなることを特徴とするガベージコレクション方法。
【請求項１２】
アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を所定の記憶領域に記録する確保ステップと、
メソッド用メモリ領域中にある第一のオブジェクトポインタが指すオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域にある第二のオブジェクトポインタが指すオブジェクトから参照されている場合に、前記第一のオブジェクトポインタを前記先に確保されたメソッド用メモリ領域に移動させる移動ステップと、
メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域とどこからも参照されなくなったオブジェクトとを解放する解放ステップと
からなることを特徴とするガベージコレクション方法。
【請求項１３】
アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を所定の記憶領域に記録する確保ステップと、
メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動ステップと、メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放ステップと
からなる処理をコンピュータに実行させることを特徴とするコンピュータ実行可能なガベージコレクションプログラム。
【請求項１４】
アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を所定の記憶領域に記録する確保ステップと、
メソッド用メモリ領域中にある第一のオブジェクトポインタが指すオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域にある第二のオブジェクトポインタが指すオブジェクトから参照されている場合に、前記第一のオブジェクトポインタを前記先に確保されたメソッド用メモリ領域に移動させる移動ステップと、
メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域とどこからも参照されなくなったオブジェクトとを解放する解放ステップと
からなる処理をコンピュータに実行させることを特徴とするコンピュータ実行可能なガベージコレクションプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、リアルタイム処理に適したガベージコレクションの技術に関する。
【０００２】
【従来の技術】
オペレーティング・システムのメモリ管理機能の１つにガベージコレクションがある。これはアプリケーションプログラムが使用しなくなったメモリ領域を自動的に解放して利用可能なメモリ領域を増やすアルゴリズムである。例えばＪａｖａ（米国Ｓｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ社の登録商標）は、このアルゴリズムを実行するガベージコレクション機構を予め備えている。
【０００３】
ガベージコレクション機構は、アプリケーションプログラムの実行に際して動的に確保されたメモリオブジェクト（以下、単に「オブジェクト」という。）がどこからも参照されていない状態になっていることを検出してそのオブジェクトを解放し再利用可能状態にする。この一度確保されたオブジェクトを解放して再利用可能な状態にすることを、オブジェクトを回収するともいう。
【０００４】
ここで、オブジェクトとは、アプリケーションプログラムが実行時に動的に用いることのできるヒープ領域を細分化した単位をいう。各オブジェクトは、例えばオブジェクト指向プログラミング言語におけるいわゆるオブジェクトインスタンスに対応するひとまとまりの可変長領域であり、各オブジェクトの内容は、データとデータ型との組の集合である部分と、オブジェクトが有効であるか否かを示すフラグ等を含む管理用の情報部分とからなる。なお、データ型は、対応するデータが例えば整数、論理値、ポインタ等のいずれであるかの別を示すものであり、以下、ポインタ型のデータを単に「ポインタ」ともいう。
【０００５】
オブジェクトの参照は、そのオブジェクトへのポインタを保持することによりなされ、例えば、オブジェクトＡからオブジェクトＢを参照する場合には、オブジェクトＡはオブジェクトＢへのポインタを内容として含む。
ある時点においてアプリケーションプログラムにより参照されている全てのオブジェクトは、１又は複数のルートポインタなるポインタから、直接又は１以上のオブジェクト内のポインタを媒介にして、辿ることができる。制御機構等、アプリケーションプログラムの実行環境によりルートポインタは例えばアプリケーションプログラム全体やその一部を単位として定められるものである。従って、ガベージコレクション機構は、ある時点においてルートポインタから辿れなくなっているオブジェクトを不要なものとして回収対象にする。
【０００６】
以下、従来のガベージコレクションの方式である、マークアンドスイープ方式及びリファレンスカウント方式について簡単に説明しておく。
マークアンドスイープ方式は、特開平１１−２３２１６２号公報に開示されており、ルートポインタから辿れる全てのオブジェクトにマークを付けていく処理を行った後に、全てのオブジェクトを走査して、マークの付いていないオブジェクトを回収する方式である。
【０００７】
リファレンスカウント方式は、オブジェクト毎にそのオブジェクトが何箇所から参照されているかを示すカウント値をオブジェクト内の管理用の情報部分に記憶することとし、オブジェクトを指すポインタの変更等により参照関係が変化する度にそれに応じてカウント値を増加又は減少させ、カウント値が０になった時点でそのオブジェクトを回収する方式である。
【０００８】
【発明が解決しようとする課題】
上記方式の他にも様々なガベージコレクションの方式が存在するが、いずれの方式も、応答性を要するアプリケーションプログラムへの利用には適さないという欠点がある。それはガベージコレクションがアプリケーションプログラムの実行を長時間中断し、その中断時間及びタイミングの予測が困難なためである。
【０００９】
応答性を要するアプリケーションプログラムは、ガベージコレクションによる中断時間も含めて所定時間内に所定の処理を終了することが要求される。
もしガベージコレクションによる中断時間が上記所定時間に対して比較にならない程十分に短ければ、所定時間内に所定の処理を終了することは可能である。ところが実際、従来のガベージコレクションは、ルートポインタからメモリ領域全体に点在するオブジェクトを辿っていく処理やメモリ領域全体を走査して不要なオブジェクトを回収する処理等、メモリ領域全体を対象とした処理であるため中断時間が長くなる場合が多く、所定時間内に所定の処理を終了することはほとんどの場合不可能である。
【００１０】
あるいはアプリケーションプログラムの設計時にガベージコレクションによる中断時間及びタイミングを予測することができれば、アプリケーションプログラムを構成する各処理の処理時間を設計変更等で調整することにより、アプリケーションプログラムの応答性を確保できる可能性もある。しかしガベージコレクションによる中断時間及びタイミングの予測は容易ではない。なぜなら中断時間及びタイミングを予測するには、アプリケーションプログラム実行の各時点におけるメモリ領域全体の使用状況を把握することができる必要があるが、アプリケーションプログラムを構成する多数の処理の実行を積み重ねた結果におけるメモリ領域全体の使用状況を把握することは極めて困難だからである。
【００１１】
そこで本発明は応答性を要するアプリケーションプログラムにも利用することのできるガベージコレクション方法、この方法を実現するガベージコレクション装置及びガベージコレクションプログラムを提供することを目的とする。
【００１２】
【課題を解決するための手段】
上記問題を解決するため、本発明のガベージコレクション装置は、アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を記録する確保手段と、メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動手段と、メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放手段とを備えることを特徴とする。
【００１３】
【発明の実施の形態】
以下、本発明の実施の形態について図面を用いて説明する。
＜実施の形態１＞
図１は、本発明の実施の形態１に係るガベージコレクション装置１００の構成図である。
【００１４】
ガベージコレクション装置１００は、ＣＰＵ、メモリ等を備えたコンピュータにおいて、メモリに格納された制御プログラムをＣＰＵが実行することにより実現され、オペレーティングシステム上で動作し、Ｊａｖａ言語等で作成されたアプリケーションプログラムの実行環境の一部として位置づけられるソフトウェア的な装置である。ガベージコレクション装置１００は、アプリケーションプログラムの実行によるメモリ確保やポインタの変更等の各種要求が外部から入力されると、各種要求に対応して処理を行う。
【００１５】
図１は、ガベージコレクション装置１００の機能構成を示し、フレーム生成部１０、世代ヒープ生成部２０、フレーム解放部３０、世代ヒープ解放部４０、世代ヒープ管理部５０、ヒープメモリ管理部６０、オブジェクト生成部７０及び世代間オブジェクト移動部８０から構成される。
フレーム生成部１０は、アプリケーションプログラムのメソッドの呼び出し毎にメモリ領域内にフレームを生成する。ここでメソッドとは、いわゆるサブルーチンのことであり、例えばＣ＋＋における関数がこれに相当する。一般にサブルーチンは、ひとまとまりの部分的プログラムであって、他の部分的プログラムから呼び出されて実行されるものであり、また、実行された後に呼び元の部分的プログラムに戻るための命令を含んで構成される。このようなメソッドを実行の際必要とされる作業用のメモリがフレームであり、フレームは世代ヒープ（後述）へのポインタ等を保持する。フレームはメソッドの呼び出し毎に生成され、スタック管理される。
【００１６】
世代ヒープ生成部２０は、フレームの生成に対応して世代ヒープを生成する。世代ヒープは、メソッドの実行の際に必要とされるローカル変数やオブジェクト等を格納するためのメモリ領域である。フレームが１つ生成される毎に、世代ヒープも１つ生成され、各世代ヒープは生成された時期の古いものから順に昇順に世代番号が付されて識別される。
【００１７】
フレーム解放部３０は、メソッドの実行が終了すると、そのメソッドに対応して生成されたフレームを解放する。
世代ヒープ解放部４０は、フレームの解放に対応して、そのフレームに対応する世代ヒープを解放する。
世代ヒープ管理部５０は、世代ヒープ生成部２０及び世代ヒープ解放部４０により生成及び解放される世代ヒープをスタック管理する。
【００１８】
ヒープメモリ管理部６０は、世代ヒープ生成部２０及び世代ヒープ解放部４０による世代ヒープの生成及び解放に対応して、メモリの一領域を世代ヒープ用として確保及び解放する。
オブジェクト生成部７０は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、メモリの一領域をオブジェクトのデータ格納用として確保する。各オブジェクトに対応する領域をメモリオブジェクトとも呼ぶ。
【００１９】
世代間オブジェクト移動部８０は、各世代ヒープにローカル変数及びオブジェクトのメンバ変数の代入を行う。
このメンバ変数の代入において、先に生成された世代ヒープ（以下、旧世代ヒープという。）のオブジェクトのメンバ変数がそれより後に生成された世代ヒープ（以下、新世代ヒープという。）にあるオブジェクトを参照していることを検出すると、その新世代ヒープのオブジェクトを旧世代ヒープへと移動させる処理を行う。世代間オブジェクト移動部８０は、この処理を再帰的に行う。「再帰的に」とは、つまり、移動によりオブジェクトの所属する世代ヒープが変更された結果、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照関係が新たに発生する場合があり、その場合に、世代間オブジェクト移動部８０が、その参照関係にある新世代ヒープのオブジェクトを旧世代ヒープへ移動させることをいう。
【００２０】
次にガベージコレクション装置１００の動作の概略を説明する。
図２（ａ）は、ガベージコレクション装置１００の動作の概略を示すフローチャートである。
ステップＳ２１：ガベージコレクション装置１００は、アプリケーションプログラムからの各種要求を受け付け、各種要求に応じてステップＳ２２〜ステップＳ２５の処理を行う。
【００２１】
ステップＳ２２：アプリケーションプログラムによるフレーム確保要求があると、フレーム生成部１０はフレームを生成し、世代ヒープ生成部２０は当該フレームに対応する世代ヒープを生成する。
ステップＳ２３：フレーム解放要求があると、世代ヒープ解放部４０は、フレームに対応する世代ヒープを解放し、続いてフレームを解放する。
【００２２】
ステップＳ２４：オブジェクト確保要求があった場合には、該当するフレームに対応する世代ヒープ内にオブジェクトを確保する。
ステップＳ２５：オブジェクトに値が代入され、その値が他の世代ヒープのオブジェクトへのポインタである場合、オブジェクトの移動処理を行う。
図２（ｂ）は、ステップＳ２５のオブジェクトの移動処理の概略を示すフローチャートである。
【００２３】
ステップＳ２６：ガベージコレクション装置１００は、ｎ世代の世代ヒープにあるオブジェクトからｎ世代より新しいｍ世代の世代ヒープのオブジェクトＸにリファレンスが存在する間、ステップＳ２６〜ステップＳ２８の処理を繰り返す。
ステップＳ２７：オブジェクトＸをｍ世代からｎ世代に移動させる。
【００２４】
ステップＳ２８：ステップＳ２６に戻る。
図２（ａ）において、ステップＳ２２、ステップＳ２３及びステップＳ２４の処理それぞれは、処理内の各ステップ（図４（ａ）以降のフローチャート参照）が定型的な処理であるため、処理時間が毎回一定であり、各ステップに要する時間を予測して合計することにより全体の処理時間を予測することができる。また処理内の各ステップは単純な操作の処理であるため処理時間が短く、全体の処理時間も短くなっている。
【００２５】
特に、従来問題となっていたメモリ解放に相当するステップＳ２３の処理は、フレームの解放時に対応する世代ヒープ内のオブジェクトを一気に解放するという処理であるので、従来のように使用済みのオブジェクトを探索して解放するという時間のかかる操作が不要となっている。一気に解放できることとなったのは、ステップＳ２５の処理があることによる。ステップＳ２５は、異なる世代ヒープ間のオブジェクトに参照関係が発生すると、新世代ヒープのオブジェクトを旧世代ヒープに移動させることにより世代間にまたがる参照関係を無くす処理を行う。これによりフレーム解放時には、対応する世代ヒープ内のオブジェクトが全て使用済みとなっており、各オブジェクトについて使用済みであるか否かを判断する必要なく解放することができる。
【００２６】
ステップＳ２５の処理は、移動対象のオブジェクトの数がその都度異なることにより、処理時間が一定ではないが、その処理対象としているのがメモリ全体ではなく所定の世代ヒープに限られているため、処理時間は比較的短い。また、メモリ全体ではなく所定の世代ヒープに限られているため、移動対象のオブジェクトの数を比較的容易に把握することができ、その数から数に比例する処理時間を予測することができる。加えて、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照は特定の命令の場合のみ発生するものであるので、発生頻度が少なく、よってステップＳ２５の処理が実行される回数も少ない。
【００２７】
以上からステップＳ２２〜ステップＳ２５の各処理の処理時間は、短時間であるか又は予測することができ、またステップＳ２５の処理は発生頻度が少ないため、ガベージコレクション装置１００は応答性を要するアプリケーションプログラムに利用することができる。
図３（ａ）及び（ｂ）は、生成された世代ヒープに確保されたメモリオブジェクトの移動の一例を示す図である。
【００２８】
移動についての説明の前に同図（ａ）および（ｂ）において世代ヒープが生成される手順の一例を示す。まず、アプリケーションプログラム実行の最初に第一のメソッドが呼び出されると、第一のメソッド用に作業用のフレームが１つ生成され、そのフレームに対応して第一世代の世代ヒープが生成される。
次に第一のメソッドの実行中に第二のメソッドが呼び出されると、第二のメソッド用にフレームが生成され、そのフレームに対応して第二世代の世代ヒープが生成される。このとき第二世代の世代ヒープは第一世代の世代ヒープの上にスタック状に積まれる。さらに第二のメソッドの実行中に第三のメソッドが呼び出されると、第三のメソッド用に作業用のフレームが１つ生成され、そのフレームに対応して第三世代の世代ヒープが生成され、第二世代の世代ヒープの上にスタック上に積まれる。ここで第一、第二及び第三のメソッドに付された序数は、メソッドの呼び出しを区別するためのものであって、メソッド内の命令内容を区別するものではない。各メソッド内の命令内容は、アプリケーションプログラムによって異なることもあれば同じこともある。なおこの例では、１つの実行中のメソッドにつき１回だけメソッドが呼び出されるが、この例に限られず、１つの実行中のメソッドにつき２回以上メソッドが呼び出されることもある。また同図（ａ）及び（ｂ）において、生成される世代ヒープの数は３つであるが、３つが上限ということではなく、アプリケーションプログラムの内容に応じて生成される世代ヒープの数は異なる。
【００２９】
このように生成された世代ヒープにおいて、メソッドの実行中にアプリケーションプログラムによるメンバ変数への代入処理があると、実行中のメソッドに対応する世代ヒープのメモリオブジェクトにそれらメンバ変数の値が代入される。図３（ａ）及び（ｂ）において、各世代ヒープ内のインスタンスは、メンバ変数の値が代入されたメモリオブジェクトを示す。図中、インスタンスから他のインスタンスへの矢印線は、参照関係を示す。すなわち矢印線の始点のインスタンスが当該矢印線の終点のインスタンスを参照していることを示す。
【００３０】
アプリケーションの実行により、メンバ変数の値がメモリオブジェクトに代入され、その結果、図３（ａ）のように第一世代の世代ヒープにあるインスタンスＡから第三世代の世代ヒープにあるインスタンスＢへと参照関係が発生すると（図中、点線の矢印により示す）、世代間オブジェクト移動部８０は、インスタンスＢを第一世代の世代ヒープに移す。この結果、インスタンスＢとインスタンスＣとの間の参照関係は、移動前には第三世代から第二世代への参照であったものが、移動後には第一世代から第二世代への参照、すなわち旧世代から新世代の参照となる。よって世代間オブジェクト移動部８０は、インスタンスＢが参照しているインスタンスＣも第一世代の世代ヒープに移す。最終的に、世代ヒープの内容は図３（ｂ）のようになる。
【００３１】
このようにして、世代間オブジェクト移動部８０は、旧世代ヒープから新世代ヒープへの参照関係が発生したら、新世代ヒープにあるメモリオブジェクトを旧世代の世代ヒープに移動させる。
次に、ガベージコレクション装置１００の詳細な処理手順を示す。
図４（ａ）、（ｂ）、（ｃ）及び（ｄ）は、メソッド実行開始の際の処理手順を示す。
【００３２】
フレーム生成部１０は、アプリケーションプログラムによりメソッドが呼び出されると、図４（ａ）に示すフレームの生成処理を行う。
ステップＳ４０１：フレーム生成部１０は、当該メソッドに対応する世代ヒープのアドレス保持用として変数ｈｅａｐを用意する。
ステップＳ４０２：フレーム生成部１０は、フレームを生成し、そのアドレスを変数ｆｒａｍｅに代入する。
【００３３】
ステップＳ４０３：フレーム生成部１０は、世代ヒープの生成処理を呼び出すことにより世代ヒープ生成部２０に世代ヒープを生成させ、その結果得られる世代ヒープのアドレスを変数ｈｅａｐとして取得する。
ステップＳ４０４：最後にフレーム生成部１０は、変数ｈｅａｐの値を生成したフレームの「世代ヒープへのポインタ」に格納する。
【００３４】
図４（ｂ）は、世代ヒープ生成処理を示す。ステップＳ４０３においてフレーム生成部１０が世代ヒープ生成処理を呼び出すと、世代ヒープ生成部２０は、この世代ヒープ生成処理を行う。
ステップＳ４１１：世代ヒープ生成部２０は、ヒープメモリ生成処理を呼び出し、ヒープメモリ領域に世代ヒープを確保し、そのアドレスをｈｅａｐとして取得する。
【００３５】
ステップＳ４１２：世代ヒープ生成部２０は、確保した世代ヒープ内にその世代で必要な個数のローカル変数を割当て、初期化する。
ステップＳ４１３：世代ヒープ生成部２０は、世代ヒープのプッシュ処理を呼び出し、世代ヒープをスタックに積む。
図４（ｃ）は、ヒープメモリの生成処理を示す。ステップＳ４１１において、ヒープメモリの生成処理が呼び出されると、ヒープメモリ管理部６０は、図４（ｃ）に示すようにヒープメモリ内に固定サイズのメモリブロックを確保し、そのアドレスをａｄｒに代入してステップＳ４１１に返す（ステップＳ４２１）。
【００３６】
図４（ｄ）は、世代ヒープのプッシュ処理を示す。ステップＳ４１３において、世代ヒープのプッシュ処理が呼び出されると、世代ヒープ管理部５０は、この世代ヒープのプッシュ処理を行う。
ステップＳ４３１：世代ヒープ管理部５０は、ｈｅａｐが指す世代ヒープの世代番号にｇを代入する。ここでｇは、グローバル変数であり、初期値は１、次の世代ヒープの世代番号、すなわちスタックに積まれる世代ヒープの世代番号を示す。
【００３７】
ステップＳ４３２：世代ヒープ管理部５０は、ｇの値を１増加する。
ステップＳ４３３：続いて、世代ヒープの親ポインタにｔｏｐの値を代入する。ここでｔｏｐは、その時点で生成されている世代ヒープのうち最も世代番号の大きい世代ヒープへのポインタを保持し、初期値はＮｕｌｌポインタである。
ステップＳ４３４：最後に世代ヒープ管理部５０は、ｔｏｐにｈｅａｐの値を代入し、ｔｏｐの値を最新の値に更新する（ステップＳ４３４）。
【００３８】
図５（ａ）、（ｂ）、（ｃ）及び（ｄ）は、メソッド終了の際の処理手順を示す。
フレーム解放部３０は、アプリケーションプログラムのメソッドが終了すると、図５（ａ）に示すフレーム解放処理を行う。
ステップＳ５０１：フレーム解放部３０は、世代ヒープの解放処理を呼び出して解放する対象のフレームに対応する世代ヒープを解放する。
【００３９】
ステップＳ５０２：解放対象のフレームを解放する。
図５（ｂ）は、世代ヒープの解放処理を示す。ステップＳ５０１において、世代ヒープの解放処理が呼び出されると、世代ヒープ解放部４０は、図５（ｂ）に示すように、世代ヒープのポップ処理を呼び出して、スタックから対象の世代ヒープをはずして世代ヒープを解放する（ステップＳ５１１）。
【００４０】
図５（ｃ）は、世代ヒープのポップ処理の内容を示す。ステップＳ５１１において、世代ヒープのポップ処理が呼び出されると、世代ヒープ管理部５０は、この世代ヒープのポップ処理を行う。
ステップＳ５２１：まず世代ヒープのアドレス格納用として変数ｗｏｒｋを用意する。
【００４１】
ステップＳ５２２：次の世代番号を保持するｇの値を１減らす。
ステップＳ５２３：次にｔｏｐに保持された値をｗｏｒｋに代入する。
ステップＳ５２４：ｔｏｐが指す世代ヒープの親ポインタの値をｔｏｐに代入する。
ステップＳ５２５：最後に、ヒープメモリの解放処理を呼び出し、ｗｏｒｋが指す世代ヒープのメモリブロックを解放する。
【００４２】
図５（ｄ）は、ヒープメモリの解放処理を示す。ステップＳ５２５において、ヒープメモリの解放処理が呼び出されると、ヒープメモリ管理部６０は、解放対象のメモリブロックを解放する（ステップＳ５３１）。
図６（ａ）は、オブジェクト生成部７０が行うオブジェクト生成処理を示す。
ステップＳ６０１：オブジェクト生成部７０は、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
【００４３】
ステップＳ６０２：次に、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップＳ６０３：続いて、取得したアドレスに位置する世代ヒープの空き領域からオブジェクトの領域を確保し、そのオブジェクトのアドレスをｏｂｊに代入する。
【００４４】
ステップＳ６０４：さらに、ｏｂｊが指すオブジェクトのメンバ変数を割当てて、オブジェクトの領域を初期化する。
図６（ｂ）は、現在の世代ヒープ取得処理を示す。図６（ａ）のステップＳ６０２において、現在の世代ヒープ取得処理が呼び出されると、世代ヒープ管理部５０は、図６（ｂ）に示すように、ｔｏｐの値をｈｅａｐに代入して返す（ステップＳ６１１）。
【００４５】
図７（ａ）は、世代間オブジェクト移動部８０が行うローカル変数への代入処理を示す。
図７（ａ）において、世代間オブジェクト移動部８０は、アプリケーションプログラムの実行過程でローカル変数への代入が発生すると、代入すべき値ｖａｌを代入先ローカル変数のアドレスａｄｒに代入する（ステップＳ７０１）。
【００４６】
図７（ｂ）は、世代間オブジェクト移動部８０が行うメンバ変数への代入処理を示す。
ステップＳ７１１：世代間オブジェクト移動部８０は、アプリケーションプログラムの実行過程でメンバ変数への代入が発生すると、代入すべき値ｖａｌを代入先メンバ変数のアドレスａｄｒに代入する。
【００４７】
ステップＳ７１２：次に、代入されたｖａｌが他のオブジェクトへのポインタであるか否かを判定する。
ステップＳ７１３：ポインタである場合には世代間オブジェクト移動処理を呼び出す。
図８（ａ）及び（ｂ）は、世代間オブジェクト移動部８０が行う世代間オブジェクト移動処理を示す。
【００４８】
ステップＳ７１３において世代間オブジェクト移動処理が呼び出されると、世代間オブジェクト移動部８０は、図８（ａ）に示すように、世代間オブジェクト移動処理を行う。
ステップＳ８０１：オブジェクトのアドレスを格納するためのスタックｓｔａｃｋ、オブジェクトのアドレスを格納するための変数ｏｂｊ１、ｏｂｊ２、世代番号を格納するためのｇ１、ｇ２を初期化する。
【００４９】
ステップＳ８０２：図７（ｂ）における代入先オブジェクトのアドレスｏｂｊをｓｔａｃｋにプッシュする。
ステップＳ８０３：ｓｔａｃｋが空でない間、ｓｔａｃｋからアドレスをポップしてｏｂｊ１に代入してステップＳ８０３〜ステップＳ８１１の処理を繰り返す。
【００５０】
ステップＳ８０４：ｏｂｊ１が指すオブジェクト、すなわちｓｔａｃｋからポップしたアドレスが指すオブジェクトが位置している世代ヒープの世代番号をｇ１に代入する。
ステップＳ８０５：ｏｂｊ１が指しているオブジェクトのメンバで、他のオブジェクトを指すアドレスを持つメンバがある間、そのアドレスをｏｂｊ２に代入してステップＳ８０５〜ステップＳ８１０を繰り返す。
【００５１】
ステップＳ８０６：ｏｂｊ２が指しているオブジェクトが位置している世代ヒープの世代番号をｇ２に代入する。
ステップＳ８０７：ｇ１＜ｇ２であるか否か、すなわちｇ１よりｇ２の世代ヒープの世代が新しいか否かを判定し、ｇ１＜ｇ２である場合ステップＳ８０８へ、ｇ１＜ｇ２でない場合ステップＳ８１０へ進む。
【００５２】
ステップＳ８０８：ステップＳ８０７の判定の結果、ｇ１＜ｇ２である場合、世代間オブジェクト移動下請け処理を呼び出す。ここでｏｂｊ２の値をｏｂｊ１に入力し、ｏｂｊ１が指すオブジェクトが位置する世代ヒープのアドレスをｈｅａｐに入力する。
ステップＳ８０９：ｏｂｊ２をｓｔａｃｋにプッシュする。
【００５３】
ステップＳ８１０：ステップＳ８０５に戻る。
ステップＳ８１１：ステップＳ８０３に戻る。
図８（ｂ）は、世代間オブジェクト移動下請け処理を示す。ステップＳ８０８において、世代間オブジェクト移動下請け処理が呼び出されると、世代間オブジェクト移動部８０は、ｏｂｊが指すオブジェクトをｈｅａｐが指す世代ヒープに移動させる。
【００５４】
ステップＳ８１２：世代間オブジェクト移動部８０は、ｏｂｊが指すオブジェクトを、ｈｅａｐが指す世代ヒープに移動する。
以上のように、実施の形態１にかかるガベージコレクション装置１００は、メソッド呼び出し毎に世代ヒープを確保する。メソッドの実行中においては、当該メソッドで必要となったオブジェクトを対応する世代ヒープに生成し、オブジェクトに値を代入する際に旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへと参照が発生すると、その新世代ヒープのオブジェクトを旧世代ヒープへ移動させる。そしてメソッドが終了するとともに対応する世代ヒープを解放する。このような構成によって次のような効果を持つ。
（１）各世代ヒープの解放にかかる時間が短く、その時間を予測することができる。
【００５５】
メソッドは、他のメソッドの実行中に呼び出されて当該他のメソッドより先に終了する。よってメソッドの実行に対応する各世代ヒープの寿命は、旧世代ヒープの方が新世代ヒープよりも長い。このような寿命の関係から、旧世代ヒープのオブジェクトから参照されている新世代ヒープのオブジェクトは、旧世代ヒープの寿命が終わるまで生きている可能性が高い。逆に、旧世代ヒープのオブジェクトから参照されていない新世代ヒープのオブジェクトは、新世代ヒープの寿命が終わるとともに使用済みとなっている。従って、旧世代ヒープのオブジェクトから参照されている新世代ヒープのオブジェクトを旧世代ヒープに移動させれば、移動後の新世代ヒープには使用済みのオブジェクトのみが残る。このため参照されている新世代ヒープのオブジェクトを旧世代ヒープに移動しておきされすれば、新世代ヒープについては、各オブジェクトが使用済みか否かを調べる必要なくメソッドの終了とともに解放することができる。このように使用済みか否かを調べる必要がないので解放に要する時間は短い。
【００５６】
またこの解放は、図５（ｂ）、（ｃ）及び（ｄ）のフローチャートに示す定型的な処理を行うだけなので、解放に要する時間は一定であり、フローチャートの各ステップに要する時間を予測して合計することにより解放に要する時間を予測することができる。
（２）１回の世代間オブジェクト移動処理にかかる時間が短く、その時間を予測することができる。
【００５７】
移動対象となるオブジェクトは、参照関係が発生している旧世代ヒープ以前の古い世代ヒープには存在せず、旧世代ヒープより新しい世代ヒープに存在する。このように移動対象のオブジェクトは、メモリ領域全体のうちの局所的な部分に存在するので、その分オブジェクトの移動に要する時間は短くなる。
またオブジェクトの移動に要する時間は、移動させるオブジェクトの合計サイズに比例する。よって１つのオブジェクトに対して参照関係によりぶら下がるオブジェクトの合計サイズの上限を予め定めておけば、移動に要する時間の上限を予測することができる。あるいは、各世代ヒープの上限を定めておけば、移動させるオブジェクトは参照元のオブジェクトが存在する旧世代ヒープよりも新しい各世代ヒープに存在するので、新しい各世代ヒープの合計サイズから、移動に要する時間の上限を予測することができる。
【００５８】
加えて、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照は特定の命令を実行した場合にしか発生しないので、世代間オブジェクト移動処理の発生頻度は比較的少ない。よって世代間オブジェクト移動処理によってアプリケーションプログラムの実行が中断される回数は少ない。
上記（１）及び（２）から、ガベージコレクション装置１００は、世代ヒープの解放やオブジェクト移動等の主な処理の起動時間が短く、その時間を上限の予測も含めて予測することができるので、応答性を要するアプリケーションプログラムにも利用することができる。
＜実施の形態２＞
以下、本発明の実施の形態２にかかるガベージコレクション装置について説明する。
【００５９】
実施の形態２のガベージコレクション装置は、実施の形態１のガベージコレクション装置１００の機能に加えて、オブジェクトの生成時又は移動時に世代ヒープに空きがなく、オブジェクトを生成又は移動することができなくなったときに、当該世代ヒープとそれより新しい世代ヒープについてマークアンドスイープ方式に基づくスカビンジ処理を施す機能を持つ。ここにおいてスカビンジ処理は、世代ヒープ内の使用済みのオブジェクトを回収し、これらを解放することによって空き領域を増やす処理である。なお、ここでマークアンドスイープ方式の代わりに、従来からある他のガベージコレクションのアルゴリズムを用いてもよい。
【００６０】
図９は、実施の形態２に係るガベージコレクション装置２００の構成図である。
同図において、ガベージコレクション装置２００は、フレーム生成部１０、世代ヒープ生成部２０、フレーム解放部３０、世代ヒープ解放部４０、世代ヒープ管理部５０、ヒープメモリ管理部６０、オブジェクト生成部７２、世代間オブジェクト移動部８２及び世代ヒープスカビンジ部９０から構成される。同図において図１と同じ符号の構成要素は実施の形態１と同じものであるので説明を省略し、以下、異なる符号の構成要素を中心に説明する。
【００６１】
オブジェクト生成部７２は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、メモリの一領域をオブジェクトのデータ格納用として確保する。オブジェクト生成部７２は、オブジェクト生成の際、管理用の情報部分に到達フラグを格納するための１ビットの領域を設ける。到達フラグは、オブジェクトがルートポインタから直接又は間接に参照関係があるか否かを示すものである。ただしオブジェクト生成部７２は、生成の際に対象の世代ヒープにオブジェクトを確保するのに十分な領域がないことを検出した場合には、世代ヒープスカビンジ部９０にスカビンジ処理を実行させ、その結果できた空き領域にオブジェクトを確保する。
【００６２】
世代間オブジェクト移動部８２は、各世代ヒープにローカル変数又はオブジェクトのメンバ変数の代入を行い、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照関係を検出すると、新世代ヒープのオブジェクトを旧世代ヒープに移動させる処理を行う。このとき、移動先の旧世代ヒープに移動対象のオブジェクトを格納するのに十分な領域がないことを検出すると、世代ヒープスカビンジ部９０に当該旧世代ヒープ及びそれより新しい世代ヒープのスカビンジ処理を実行させ、その結果できた旧世代ヒープの空き領域に移動対象のオブジェクトを格納する。
【００６３】
世代ヒープスカビンジ部９０は、オブジェクト生成部７２及び世代間オブジェクト移動部８２により世代ヒープに空き領域がないことが検出されると、当該世代ヒープについてスカビンジ処理を行う。
図１０は、ガベージコレクション装置２００の動作の概略を示すフローチャートである。
【００６４】
図１０は、図２（ａ）に対してステップＳ１０１の処理が加わっている点が異なっている。すなわちガベージコレクション装置２００は、ステップＳ２４においてオブジェクトを生成しようとしたとき、当該世代ヒープ内のメモリ不足を検出すると、当該世代ヒープ内で使用済みであるが未解放のオブジェクトを探索し、探索されたオブジェクトを解放することで空き領域をつくる処理を行う（ステップＳ１０１）。
【００６５】
以下、ガベージコレクション装置２００の詳細な処理手順について説明する。ただし、実施の形態１と同様の処理については説明を省略し、以下、実施の形態１とは異なる処理を中心に説明する。なお、以下のフローチャートにおいて、実施の形態１のフローチャートと同じステップ番号のステップについては同じ処理であることを示す。
【００６６】
図１１（ａ）は、オブジェクト生成部７２が行うオブジェクトの生成処理を示す。オブジェクト生成部７２は、図６（ａ）に示すオブジェクトの生成処理の代わりに、図１１（ａ）に示す処理を行う。
ステップＳ１１０１：オブジェクト生成部７２は、オブジェクトのアドレス用にｏｂｊを用意し、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
【００６７】
ステップＳ６０２：次に、現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。この処理の詳細は図６（ｂ）と同様である。
ステップＳ１１０２：ステップＳ６０２において取得したアドレスが指す世代ヒープに、十分の広さの空き領域があるか否かを判定する。この判定は、例えば、空き領域の広さが、オブジェクトのために確保しようとしている領域より大きいか否かにより行えばよい。また所定の値による閾値判定にしてもよい。
【００６８】
ステップＳ１１０３：ステップＳ１１０２の判定の結果、十分な広さの空き領域がない場合には、世代ヒープのスカビンジ処理を呼び出し、世代ヒープスカビンジ部９０に当該世代ヒープについてのスカビンジ処理を行わせる。この処理の詳細については後述する。
ステップＳ６０３：続いて、世代ヒープの空き領域からオブジェクトのための領域を確保し、そのオブジェクトのアドレスをｏｂｊに代入する。
【００６９】
ステップＳ６０４：さらに、ｏｂｊが指すオブジェクトのメンバ変数を割当てて、オブジェクトの領域を初期化する。
このようにオブジェクト生成部７２は、オブジェクトを生成する際に世代ヒープに空きがあるか否かを判定し、空きがなければスカビンジ処理により空き領域を作り出してから、空き領域にオブジェクトを生成する。
【００７０】
図１１（ｂ）は、世代間オブジェクト移動下請け処理の処理手順を示す。
世代間オブジェクト移動部８２は、図７（ａ）、（ｂ）及び図８（ａ）に示す処理を行い、図８（ｂ）のステップＳ８０８において図８（ｂ）の世代間オブジェクト移動下請け処理を行う代わりに、図１１（ｂ）に示す処理を行う。
ステップＳ１１０６：世代間オブジェクト移動部８２は、ｈｅａｐが指す世代ヒープ、すなわち移動先の世代ヒープに、十分な広さの空き領域があるか否かを判定する。この判定は、ステップＳ１１０２と同じでよい。
【００７１】
ステップＳ１１０７：ステップＳ１１０６の判定の結果、十分な広さの空き領域がない場合には、世代ヒープのスカビンジ処理を呼び出し、世代ヒープスカビンジ部９０に当該世代ヒープについてのスカビンジ処理を行わせる。この処理の詳細については後述する。
このように世代間オブジェクト移動部８２は、オブジェクトを移動させる際に世代ヒープに空きがあるか否かを判定し、空きがなければスカビンジ処理におり空き領域を作り出してから、その空き領域にオブジェクトを移動させる。
【００７２】
図１１（ｃ）は、世代ヒープのスカビンジ処理の処理手順を示す。
世代ヒープスカビンジ部９０は、世代ヒープのマーキング処理を呼び出して実行し（ステップＳ１１０４）、続いて世代ヒープのスイーピング処理を呼び出して実行する（ステップＳ１１０５）。
ここでマーキング処理は、処理対象の世代ヒープについて、参照関係により辿れる全てのオブジェクトのマークをつけていく処理、すなわち到達フラグを０から１にする処理であり、スイーピング処理はマークが付されていないオブジェクトを回収する処理、すなわち到達フラグが０のオブジェクトを解放する処理である。
【００７３】
図１２（ａ）世代ヒープのマーキング処理の処理手順を示す。
ステップＳ１２０１：世代ヒープスカビンジ部９０は、オブジェクトのアドレスを格納するスタックとして変数ｓｔａｃｋ、世代ヒープのアドレス用として変数ｗｏｒｋ、オブジェクトのアドレス用として変数ｏｂｊ、ｐｔｒを用意する。ステップＳ６０２：次に、図６（ｂ）に示す、現在の世代ヒープ取得処理を呼び出して、現在の実行中のメソッドに対応する世代ヒープのアドレスを示すｗｏｒｋを取得する。
【００７４】
ステップＳ１２０３：ｗｏｒｋの指す世代ヒープ、すなわち現在実行中のメソッドに対応する世代ヒープに含まれる全てのオブジェクトについて、オブジェクトが有する到達フラグに０をセットする。ここですべてのオブジェクトは、オブジェクト生成部７２によって到達フラグを持つオブジェクトが生成されている。ステップＳ１２０４：ｗｏｒｋが指す世代ヒープにある親ポインタの内容をｗｏｒｋに代入する。
【００７５】
ステップＳ１２０５：ｗｏｒｋがｈｅａｐ（スカビンジ対象の世代ヒープのアドレス）に等しくない間ステップＳ１２０３及びステップＳ１２０４を繰り返し、この繰り返しによりスカビンジ対象の世代ヒープ以降の新しい世代の世代ヒープについて、それらに含まれるオブジェクトの到達フラグに０をセットする。
ステップＳ６０２：続いて、世代ヒープスカビンジ部９０は、現在の世代ヒープ取得処理を呼び出して、現在の世代ヒープのアドレスを示すｗｏｒｋを取得する。
【００７６】
ステップＳ１２０８：ｗｏｒｋの指す世代ヒープ内のすべてのローカル変数について、その値をｏｂｊに代入してステップＳ１２０９及びステップＳ１２１０を繰り返す。
ステップＳ１２０９：ｏｂｊは正しいオブジェクトを指しているか否か、すなわちローカル変数がオブジェクトを指すものであるか否かを判定する。
【００７７】
ステップＳ１２１０：ステップＳ１２０９において、正しいオブジェクトを指していると判定した場合、図１２（ｂ）に示す、到達フラグのマーキング処理を呼び出して実行する。
ここで到達フラグのマーキング処理の手順を先に説明しておく。
図１２（ｂ）は、到達フラグのマーキング処理の手順を示す。
【００７８】
ステップＳ１２２０：ｏｂｊが指すオブジェクトの到達フラグが０であるか否かを判定する。
ステップＳ１２２１：ステップＳ１２２０においてｏｂｊが指すオブジェクトの到達フラグが０であると判定した場合、そのオブジェクトの到達フラグに１をセットする。
【００７９】
ステップＳ１２２２：ｏｂｊをスタックにプッシュする。この処理は、後に、ｏｂｊのオブジェクトからさらに参照関係を辿るのに用いられる。
図１２（ａ）の説明に戻る。
ステップＳ１２１２：ｗｏｒｋが指す世代ヒープにある親ポインタの内容をｗｏｒｋに代入する。
【００８０】
ステップＳ１２１３：ｗｏｒｋがｈｅａｐに等しくない間、ステップＳ１２０８〜ステップＳ１２１２の処理を繰り返す。この繰り返しにより、スカビンジ処理の対象の世代ヒープ以降の新しい世代の世代ヒープについて、世代ヒープ内のローカル変数から辿ることのできる全てのオブジェクトについて、それらオブジェクトが持つ到達フラグに１をセットする。
【００８１】
ステップＳ１２１４：ｓｔａｃｋが空でない間、ｓｔａｃｋからポップした値をｏｂｊに代入してステップＳ１２１４とステップＳ１２１９の間の処理を繰り返す。
ステップＳ１２１５：ｏｂｊの指すオブジェクト内のすべてのインスタンス変数について、その値をｐｔｒに代入してステップＳ１２１５とステップＳ１２１８の間の処理を繰り返す。
【００８２】
ステップＳ１２１６：ｐｔｒは正しいオブジェクトを指しているか否かを判定する。
ステップＳ１２１０：ステップＳ１２１６において、ｐｔｒが正しいオブジェクトを指していると判定した場合、図１２（ｂ）に示す到達フラグのマーキング処理を呼び出して実行する。
【００８３】
ステップＳ１２１４とステップＳ１２１９の間の処理の繰り返しにより、到達フラグに１がセットされたオブジェクトから辿ることのできる全てのオブジェクトについて、それらのオブジェクトの到達フラグに１をセットする。
このように図１２（ａ）及び図１２（ｂ）の処理を行うことにより、スカビンジ処理の対象の世代ヒープ以降の新しい世代の世代ヒープにあるローカル変数から直接又は間接に辿ることのできる全てのオブジェクトについて、到達フラグに１をセットする。
【００８４】
図１３は、世代ヒープのスイーピング処理の処理手順を示す。
ステップＳ６０２：世代ヒープスカビンジ部９０は、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出して、現在の世代ヒープのアドレスを示すｗｏｒｋを取得する。
ステップＳ１３０４：ｗｏｒｋが指す世代ヒープ内のオブジェクトのうち、到達フラグが０であるオブジェクトを解放する。
【００８５】
ステップＳ１３０５：ｗｏｒｋが指す世代ヒープにある親ポインタの内容をｗｏｒｋに代入する。
ステップＳ１３０６：ｗｏｒｋがｈｅａｐに等しくない間、ステップＳ１３０２とステップＳ１３０６の間の処理を繰り返す。
ステップＳ１３０２〜ステップＳ１３０６の繰り返しにより、スカビンジ処理の対象の世代ヒープ以降の新しい世代ヒープにあるローカル変数から直接又は間接に辿ることのできるオブジェクトが残り、どこからも参照されないオブジェクトが解放されて空き領域ができる。
【００８６】
以上のように実施の形態２のガベージコレクション装置２００は、実施の形態１のガベージコレクション装置１００の機能に加えて、世代ヒープに空き領域がないためにオブジェクトを生成又は移動させることができなくなった場合に、当該世代ヒープとそれより新しい世代ヒープについてスカビンジ処理を行って空き領域を作り出してから、オブジェクトを生成又は移動させる。このスカビンジ処理は、メモリ領域全体ではなく、比較的新しい世代の世代ヒープについてのみ行われるものであるので、処理にかかる時間が短い。よってガベージコレクション装置２００は、応答性を要するアプリケーションプログラムにも利用することがでいる。
＜実施の形態３＞
以下、本発明の実施の形態３にかかるガベージコレクション装置について説明する。
【００８７】
実施の形態３のガベージコレクション装置は、実施の形態２のガベージコレクション装置２００の機能に加えて、図１１（ｃ）に示す世代ヒープのスカビンジ処理の後、解放されずに残ったオブジェクトをより古い世代ヒープに移動させる機能を持つ。
図１４は、実施の形態３に係るガベージコレクション装置３００の構成図である。
【００８８】
同図において、ガベージコレクション装置３００は、フレーム生成部１０、世代ヒープ生成部２０、フレーム解放部３０、世代ヒープ解放部４０、世代ヒープ管理部５０、ヒープメモリ管理部６０、オブジェクト生成部７２、世代ヒープスカビンジ部９３及び世代間オブジェクト移動部８３から構成される。
以下、図１及び図９と同じ符号の構成要素は同じ機能であるので説明を省略し、異なる符号の構成要素を中心に説明する。
【００８９】
世代間オブジェクト移動部８３は、ローカル変数及びメンバ変数の代入、オブジェクトの移動及び世代ヒープのスカビンジ処理の呼び出し等、実施の形態２の世代間オブジェクト移動部８２と同様の操作に加えて、スカビンジ処理の結果、解放されなかった使用中のオブジェクトを１つ古い世代の世代ヒープに移動させる処理を行う。
【００９０】
世代ヒープスカビンジ部９３は、実施の形態２の世代ヒープスカビンジ部９０と同様の世代ヒープのスカビンジ処理に加えて、当該スカビンジ処理の実行中に世代間オブジェクト移動部８３の世代間オブジェクト移動処理を呼び出す。
以下、ガベージコレクション装置３００の詳細な処理手順を示す。
ただし、実施の形態１及び２と同様の処理については説明を省略し、以下、異なる処理を中心に説明する。なお、以下のフローチャートにおいて、実施の形態１及び２のフローチャートと同じステップ番号のステップについては同じ処理であることを示す。
【００９１】
図１５は、世代ヒープスカビンジ部９３が行う世代ヒープスカビンジ処理の処理手順を示す。世代ヒープスカビンジ部９３は、オブジェクト生成部７２によるオブジェクトの生成処理（図１１（ａ）参照）及び世代間オブジェクト移動部８３による世代間オブジェクト移動下請け処理（図１１（ｂ）参照）の中で世代ヒープのスカビンジ処理が呼び出されると、図１１（ｃ）の世代ヒープのスカビンジ処理の代わりに図１５に示す処理を行う。
【００９２】
ステップＳ１１０４：世代ヒープスカビンジ部９３は、図１２（ａ）及び（ｂ）に示す世代ヒープのマーキング処理を呼び出して実行する。
ステップＳ１１０５：次に、図１３に示す世代ヒープのスイーピング機能を呼び出して実行する。
ステップＳ１５０１：続いて、スカビンジ処理対象の世代ヒープのアドレスであるｈｅａｐが指す世代ヒープの親ポインタがＮＵＬＬであるか否かを判定する。判定の結果、ＮＵＬＬである場合、すなわちｈｅａｐが指す世代ヒープより古い世代ヒープがない場合には、当該スカビンジ処理を終了する。
【００９３】
ステップＳ１５０２：一方、判定の結果、ＮＵＬＬポインタでない場合、オブジェクトをより古い世代に移動させる準備として、まず、オブジェクトのアドレス用のｏｂｊを用意する。
ステップＳ１５０３：続いて、ｗｏｒｋの指す世代ヒープ内のすべてのオブジェクトについてそのアドレスをｏｂｊに代入してステップＳ１５０３とステップＳ１５０３の間の処理を繰り返す。
【００９４】
ステップＳ１５０４：ｏｂｊが指すオブジェクトを、当該オブジェクトが所属する世代ヒープにある親ポインタが指す世代ヒープに移動させ、移動先のアドレスをｏｂｊに代入する。
ステップＳ７１３：図８（ａ）及び（ｂ）に示す世代間オブジェクト移動処理を実行する。ここで図８（ｂ）の代わりに図１１（ｂ）に示す処理を実行してもよい。
【００９５】
このようにステップＳ１５０２とステップＳ１５０５との処理を繰り返すことにより世代ヒープのマーキング処理及びスイーピング処理の結果、解放されなかったオブジェクトが古い世代のオブジェクトに移動する。
この図１５に示す世代ヒープのスカビンジ処理は、比較的新しい世代ヒープを対象とした処理であるため処理にかかる時間が短い。また図１５に示す世代ヒープのスカビンジ処理が実行されるタイミングは、対象の世代ヒープに対するメソッドの実行中である。よって本実施の形態のガベージコレクション装置３００は、その処理によりアプリケーションプログラムを中断する期間が短く、そのタイミングを予測することができるので、応答性を要するアプリケーションプログラムに利用することができる。
＜実施の形態４＞
以下、本発明の実施の形態４にかかるガベージコレクション装置について説明する。
【００９６】
実施の形態４のガベージコレクション装置は、実施の形態１のガベージコレクション装置１００の機能に加えて、リファレンスカウント方式によりオブジェクトが何箇所から参照されているかを管理し、オブジェクトがどこからも参照されなくなった時にそのオブジェクトを解放する機能を持つ。
図１６は、実施の形態４に係るガベージコレクション装置４００の構成図である。
【００９７】
同図において、ガベージコレクション装置４００は、フレーム生成部１０、世代ヒープ生成部２０、フレーム解放部３０、世代ヒープ解放部４０、世代ヒープ管理部５０、ヒープメモリ管理部６０、オブジェクト生成部７４、世代間オブジェクト移動部８４、被参照数変更部９４及びオブジェクト解放部９５から構成される。同図において図１と同じ符号の構成要素は実施の形態１と同じものであるので説明を省略し、以下、異なる符号の構成要素を中心に説明する。
【００９８】
オブジェクト生成部７４は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、メモリの一領域をオブジェクトのデータ格納用として確保する。このとき、オブジェクト生成部７４は、オブジェクト内の管理用の情報部分に被参照数を保持するための領域を設ける。被参照数は、そのオブジェクトが何箇所から参照されているかを示すカウント値（リファレンスカウンタともいう。）である。
【００９９】
世代間オブジェクト移動部８４は、各世代ヒープにローカル変数及びオブジェクトのメンバ変数の代入を行う。そして、メンバ変数の代入においては、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照関係を検出すると、その新世代ヒープのオブジェクトを旧世代ヒープへと移動させる処理を行う。
【０１００】
さらに、世代間オブジェクト移動部８４は、ローカル変数又はメンバ変数の代入による参照関係の変化に対応するために、被参照数変更部９４に被参照数の変更等の処理を行わせる。
被参照数変更部９４は、ローカル変数又はメンバ変数の代入による参照関係の変化、及びオブジェクトの解放による参照関係の変化に対応してオブジェクトの被参照数を変更する処理を行い、その結果、オブジェクトの被参照数が０になった場合には、オブジェクト解放部９５にそのオブジェクトを解放させる。
【０１０１】
オブジェクト解放部９５は、被参照数が０になったオブジェクトを解放する処理を行う。また、この解放の際、被参照数変更部９４に、解放による参照関係の変化に応じて、被参照数の変更の処理を行わせる。
以下、ガベージコレクション装置４００の詳細な処理手順を示す。
ただし、実施の形態１、２及び３と同様の処理については説明を省略し、以下、異なる処理を中心に説明する。
【０１０２】
図１７は、オブジェクト生成部７４が行うオブジェクト生成処理を示す。オブジェクト生成部７４は、図６（ａ）の代わりに図１７に示す処理を行う。
ステップＳ６０１：オブジェクト生成部７４は、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
ステップＳ６０２：次に、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
【０１０３】
ステップＳ６０３：続いて、取得したアドレスに位置する世代ヒープの空き領域からオブジェクトの領域を確保し、そのアドレスをｏｂｊに代入する。
ステップＳ１８０１：ｏｂｊが指すオブジェクトの被参照数に０をセットする。
ステップＳ６０４：ｏｂｊが指すオブジェクトにメンバ変数を割当てて初期化する。
【０１０４】
図１８（ａ）は、世代間オブジェクト移動部８４が行うローカル変数への代入処理を示す。
ステップＳ１９０１：世代間オブジェクト移動部８４は、アプリケーションプログラムの実行過程でローカル変数への代入が発生すると、ａｄｒが指す変数の内容が他のオブジェクトへのポインタであるか否かを判定する。ａｄｒは、代入先フレームに対応する世代ヒープ内の代入先のローカル変数のアドレスであり、ステップＳ１９０１は、そのローカル変数に既に格納されている内容がポインタであるか否かを判定している。
【０１０５】
ステップＳ１９０２：判定の結果、ポインタであると判定した場合、被参照数変更部９４に被参照数デクリメント処理を実行させる。被参照デクリメント処理は、参照関係の消滅に応じてオブジェクトの被参照数を減じ、その結果、どこからも参照されなくなったオブジェクトを解放する処理である。すなわち、ステップＳ１９０１及びステップＳ１９０２では、ローカル変数に現在格納されているポインタが新たな代入により消滅し、当該消滅により直接又は間接的に生じる参照関係の消滅に応じて、オブジェクトの被参照数を変更し、又は解放している。ステップＳ１９０２の被参照数デクリメント処理については、図１９（ａ）にて詳しく説明する。
【０１０６】
ステップＳ７０１：ステップＳ１９０１及びステップＳ１９０２において、ローカル変数の現在の値がポインタである場合における当該ポインタによる参照関係が解放されたところで、ローカル変数に新たに代入すべき値であるｖａｌを、当該ローカル変数に代入する。
ステップＳ１９０３：続いて、ｖａｌは他のオブジェクトへのポインタであるか否かを判定する。
【０１０７】
ステップＳ１９０４：判定の結果、ポインタであると判定した場合には、被参照数変更部９４に被参照数インクリメント処理を実行させる。被参照数インクリメント処理は、参照関係の新たな発生に応じてオブジェクトの被参照数を増加する処理である。すなわち、ステップＳ１９０３及びステップＳ１９０４では、新たな代入がポインタであることによる新たな参照関係の発生に応じて、ポインタが指すオブジェクトの被参照数を１増加している。
【０１０８】
図１８（ｂ）は、世代間オブジェクト移動部８４が行うローカル変数への代入処理を示す。
ステップＳ１９０１：世代間オブジェクト移動部８４は、アプリケーションプログラムの実行過程でメンバ変数への代入が発生すると、ａｄｒが指す変数の内容が他のオブジェクトへのポインタであるか否かを判定する。ａｄｒは、代入先オブジェクトのアドレスｏｂｊが指すオブジェクト内の代入先メンバ変数のアドレスであり、ステップＳ１９０１は、そのメンバ変数に既に格納されている内容がポインタであるか否かを判定している。
【０１０９】
ステップＳ１９０２：判定の結果、ポインタであると判定した場合、被参照数変更部９４に被参照数デクリメント処理を実行させる。
ステップＳ７１１：メンバ変数に新たに代入すべき値であるｖａｌを、当該メンバ変数に代入する。
ステップＳ７１２：次に、ｖａｌは他のオブジェクトへのポインタであるか否かを判定する。
【０１１０】
ステップＳ１９０４：判定の結果、ポインタであると判定した場合には、被参照数変更部９４に被参照数インクリメント処理を実行させる。
ステップＳ７１３：さらに、世代間オブジェクト移動処理を実行する。この処理は、実施形態１又は２における世代間オブジェクト移動処理と同じ処理でよい。
【０１１１】
図１９（ａ）は、被参照数変更部９４が行う被参照数デクリメント処理を示す。
ステップＳ２００１：被参照数変更部９４は、オブジェクトのアドレスであるｏｂｊが入力されると、ｏｂｊが指すオブジェクトの被参照数の値から１を減じる。ここでｏｂｊは、図１８（ａ）のステップＳ１９０２の場合であれば、代入先のローカル変数に当該代入の前に格納されているポインタであり、図１８（ｂ）のステップＳ１９０２の場合であれば、代入先のメンバ変数に当該代入の前に格納されているポインタである。
【０１１２】
ステップＳ２００２：ステップＳ２００１の処理の結果、ｏｂｊが指すオブジェクトの被参照数が０になったか否かを判定する。
ステップＳ２００３：判定の結果、被参照数が０になった場合には、オブジェクト解放部９５にオブジェクトの解放処理を実行させることにより、被参照数が０となったオブジェクトを解放する。
【０１１３】
図１９（ｂ）は、被参照数変更部９４が行う被参照数インクリメント処理を示す。
被参照数変更部９４は、ｏｂｊが指すオブジェクトの被参照数の値を１増加する。ここでｏｂｊは、図１８（ａ）のステップＳ１９０４の場合であれば、代入先ローカル変数に新たに代入されるポインタであり、図１８（ｂ）のステップＳ１９０４の場合であれば、代入先メンバ変数に新たに代入されるポインタである。
【０１１４】
図２０は、オブジェクト解放部９５が行うオブジェクト解放処理を示す。
ステップＳ２１０１：オブジェクトのアドレス格納用として変数ｗｏｒｋを用意する。
ステップＳ２１０２：ｏｂｊが指しているオブジェクトのメンバで、他のオブジェクトを指しているアドレスが残っている間、それをｗｏｒｋに代入して、ステップＳ１９０４の処理を繰り返す。
【０１１５】
ステップＳ１９０４：被参照数デクリメント処理を呼び出して被参照数変更部９４に実行させる。
ステップＳ２１０５：ｏｂｊが指すオブジェクト領域を解放する。
以上のようにして、実施の形態４のガベージコレクション装置４００は、不要になったオブジェクトを即座に解放して空き領域として使用可能な状態にするという利点を有する。
＜実施の形態５＞
以下、実施の形態５に係るガベージコレクション装置について説明する。
【０１１６】
実施の形態４のガベージコレクション装置４００のリファレンスカウント方式によるガベージコレクションは、オブジェクトのポインタの参照関係がループしている場合に、ルートポインタから辿ることのできなくなっているオブジェクトであるにも拘わらず被参照数が０にならないため、その不要なオブジェクトを解放することができない。そこで実施の形態５のガベージコレクション装置は、図９に示すガベージコレクション装置２００と図１６に示すガベージコレクション装置４００とを組み合わせたような構成として、リファレンスカウント方式によるガベージコレクションとマークアンドスイープ方式によるガベージコレクションとの両方を行うようにしている。
【０１１７】
すなわち実施の形態５のガベージコレクション装置は、フレーム生成部、世代ヒープ生成部、フレーム解放部、世代ヒープ解放部、世代ヒープ管理部、ヒープメモリ管理部、オブジェクト生成部、世代間オブジェクト移動部、世代ヒープスカビンジ部、被参照数変更部及びオブジェクト解放部から構成される。
上記構成うち、フレーム生成部、世代ヒープ生成部、フレーム解放部、世代ヒープ解放部、世代ヒープ管理部、ヒープメモリ管理部については、ガベージコレクション装置２００又は４００におけるフレーム生成部１０、世代ヒープ生成部２０、フレーム解放部３０、世代ヒープ解放部４０、世代ヒープ管理部５０、ヒープメモリ管理部６０それぞれと同様である。また被参照数変更部及びオブジェクト解放部については、ガベージコレクション装置４００の被参照数変更部９４及びオブジェクト解放部９５と同様である。世代ヒープスカビンジ部は、ガベージコレクション装置２００の世代ヒープスカビンジ部９０と同様である。
【０１１８】
オブジェクト生成部及び世代間オブジェクト移動部は、ガベージコレクション装置２００におけるオブジェクト生成部７２及び世代間オブジェクト移動部８２とガベージコレクション装置４００におけるオブジェクト生成部７４及び世代間オブジェクト移動部８４をそれぞれ組み合わせた機能を持つ。
すなわち実施の形態５のオブジェクト生成部は、アプリケーションプログラムの実行時におけるオブジェクトの生成に対応して、メモリの一領域をオブジェクトのデータ格納用として確保する。このとき、オブジェクト生成部は、オブジェクト内の管理用の情報部分に被参照数を保持するための領域と到達フラグを格納するための領域とを設ける。この生成において、対象の世代ヒープにオブジェクトを確保するのに十分な領域がないことを検出した場合には、世代ヒープスカビンジ部にスカビンジ処理を実行させ、その結果できた空き領域にオブジェクトを確保する。
【０１１９】
また実施の形態５の世代間オブジェクト移動部は、各世代ヒープにローカル変数及びオブジェクトのメンバ変数の代入を行う。メンバ変数の代入においては、旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照関係を検出すると、その新世代ヒープのオブジェクトを旧世代ヒープへと移動させる処理を行う。また、世代間オブジェクト移動部は、ローカル変数又はメンバ変数の代入による参照関係の変化に応じて被参照数変更部に被参照数の変更及びどこからも参照されていないオブジェクトの解放を行わせる。この移動において、移動先の旧世代ヒープに移動対象のオブジェクトを格納するのに十分な領域がないことを検出した場合には、世代ヒープスカビンジ部に当該旧世代ヒープ及びそれより新しい世代ヒープのスカビンジ処理を実行させ、その結果できた旧世代ヒープの空き領域に移動対象のオブジェクトを格納する。
【０１２０】
図２１は、実施の形態５のガベージコレクション装置の動作を示す。
同図において、ステップＳ２１、ステップＳ２２及びステップＳ２３については実施の形態１等と同様である。
ステップＳ２４において、オブジェクト生成部は、世代ヒープに被参照数と到達フラグの領域を持つオブジェクトを生成する。このとき対象の世代ヒープに空き領域がないためにオブジェクトを生成することができない場合には、ステップＳ１７０１の処理に移る。ステップＳ１７０１において世代ヒープスカビンジ部は、対象の世代ヒープについてマーキング処理を行い、続いてスイーピング処理を行う。
【０１２１】
またステップＳ２５において、世代間オブジェクト移動部は変数への代入、オブジェクトの移動処理を行い、これらの処理に応じて被参照数変更部は各オブジェクトの被参照数の変更処理及びオブジェクトの解放等を行う。このとき対象の世代ヒープに領域がないためにオブジェクトを移動することができない場合には、ステップＳ１７０１の処理に移る。
【０１２２】
このようにリファレンス方式とマークアンドスイープ方式を組み合わせて、ステップＳ２４及びステップＳ２５においてはリファレンスカウント方式によりオブジェクトの解放を行い、メモリ不足時にはステップＳ１７０１においてマークアンドスイープ方式によりループ状の参照関係にあるオブジェクトを解放する。ステップＳ１７０１の処理は、メモリ不足時のみ実行されるが、ステップＳ２４及びステップＳ２５においてリファレンスカウント方式によりオブジェクトの解放がなされているのでメモリ不足となる頻度は少なく、またステップＳ１７０１の処理は、比較的新しい世代ヒープを対象とした処理であるので、全体を対象とする場合と違って処理にかかる時間は短い。その他、説明を省略しているが実施の形態１と同様の処理部分については実施の形態１と同様に処理時間が短く、その時間を予測することができるので、ガベージコレクション装置は、応答性を要するアプリケーションプログラムにも利用することができる。
＜実施の形態６＞
実施の形態５のガベージコレクション装置は、ステップＳ１７０１の処理の後、実施の形態３のガベージコレクション装置３００のように、ステップＳ１７０１の処理によって解放されなかったオブジェクトをより古い世代ヒープに移動する構成を加えても良い。
＜実施の形態７＞
以下、実施の形態７にかかるガベージコレクション装置について説明する。
【０１２３】
実施の形態１における各ガベージコレクション装置は、メソッド呼び出し毎に生成された世代ヒープ内にオブジェクトを生成するよう構成されていた。これに対し実施の形態７のガベージコレクション装置は、オブジェクト自体を世代ヒープではなく別のメモリ領域（以下、実体メモリと呼ぶ。）に生成し、世代ヒープにオブジェクトへのポインタを生成する点で、実施の形態１とは異なっている。
【０１２４】
図２８（ａ）及び（ｂ）は、実施の形態７のガベージコレクション装置における世代ヒープを中心とするメモリ構造の一例を示す。
図２８（ａ）において、ガベージコレクション装置は、まず、アプリケーションプログラムの実行により、第一のメソッドが呼び出されると、第一のメソッド用に作業用のフレーム（不図示）を１つ生成し、そのフレームに対応して第一世代の世代ヒープを生成する。そして第一世代の世代ヒープ内にローカル変数（不図示）及びオブジェクトへのポインタのための領域を確保して各領域を初期化する。
【０１２５】
次に第一のメソッド実行中に第二のメソッドが呼び出されると、先と同様の手順によりフレーム（不図示）及び第二世代の世代ヒープを生成し、第二世代の世代ヒープ内にローカル変数（不図示）及びオブジェクトへのポインタのための領域の確保及び初期化を行う。
さらに第二のメソッド実行中に第三のメソッドが呼び出されると、先と同様の手順によりフレーム（不図示）及び第三世代の世代ヒープを生成し、第三世代の世代ヒープ内にローカル変数（不図示）及びオブジェクトへのポインタのための領域の確保及び初期化を行う。ここで各オブジェクトは、オブジェクトを指すポインタが所属する世代番号を保持するための領域を持ち、同図（ａ）および（ｂ）においては各オブジェクトの左上隅に番号を付して示す。
【０１２６】
このように世代ヒープを生成しつつ、各メソッドの実行中にオブジェクトの生成があると、実体メモリの空き領域にオブジェクト用の領域を確保し、そのオブジェクトへのポインタをそのメソッドに対応する世代ヒープに格納する。
そして旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照が発生した場合には、新世代ヒープのポインタを旧世代ヒープにコピーする。
【０１２７】
以下、このコピーについて具体的に説明する。
図２８（ａ）において、第一世代の世代ヒープにあるポインタ２９００は、実態メモリにあるインスタンスＡを指し、第三世代の世代ヒープにあるポインタ２９０１は、実体メモリにあるインスタンスＢを指し、第二世代の世代ヒープにあるポインタ２９０２は、実体メモリにあるインスタンスＣを指す。またインスタンスＡはインスタンスＢを参照し（図中、点線矢印にて示す）、インスタンスＢはインスタンスＣを参照する。
【０１２８】
このような参照関係において、インスタンスＡからインスタンスＢへの参照は、第一世代の世代ヒープのポインタ２９００が指すインスタンスＡから第三世代の世代ヒープのポインタ２９０１が指すインスタンスＢへの参照であり、すなわち、旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照である。このような参照関係がある場合、新世代ヒープのポインタの値は、旧世代ヒープにコピーされる。つまりインスタンスＢを指す第三世代の世代ヒープのポインタ２９０１の値が第一世代の世代ヒープにコピーされることとなる。図２８（ｂ）の第一世代の世代ヒープ中のポインタ２９０３は、ポインタ２９０１のコピーであることを示す。またこのとき、インスタンスＢが持つ世代番号は、ポインタのコピーに伴いコピー元の世代ヒープの世代番号３からコピー先の世代番号１に変更される。
【０１２９】
ポインタ２９０１がポインタ２９０３にコピーされることにより、インスタンスＢからインスタンスＣへの参照は、第三世代の世代ヒープのポインタ２９０１が指すインスタンスＢから第二世代の世代ヒープのポインタ２９０２が指すインスタンスＣへの参照だけでなく、また第一世代の世代ヒープのポインタ２９０３が指すインスタンスＢから第二世代の世代ヒープのポインタ２９０２が指すインスタンスＣへの参照となる。このようにインスタンスＢを指すポインタのコピーの結果、インスタンスＢ及びインスタンスＣの関係についても、旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照関係となる。従って、第二世代の世代ヒープのポインタ２９０２の値も第一世代の世代ヒープのポインタ２９０４にコピーされ、インスタンスＣが持つ世代番号は、コピー元のポインタ２９０２のある世代ヒープの世代番号２からコピー先のポインタ２９０４のある世代ヒープの世代番号１に変更される。この一連のポインタのコピーの結果、メモリの構造は図２８（ｂ）に示す通りとなる。
【０１３０】
このようなコピーによる方法の場合には、ポインタの移動後に新世代ヒープのポインタを削除する処理を必要としないという利点がある。
続いて、世代ヒープの解放について具体的に説明する。
図２９（ａ）及び（ｂ）は、第三世代の世代ヒープを解放する場合におけるメモリ構造の変化の一例を示す。
【０１３１】
図２８（ｂ）の状態において、第三世代の世代ヒープに対応するメソッドの実行が終了すると、ガベージコレクション装置は、第三世代の世代ヒープにあるポインタが指すオブジェクトの世代番号が３であるか否かを判別する。この判別は、オブジェクトの世代番号は、オブジェクトを指すポインタが所属する世代ヒープの世代番号と一致しているものであるので、世代番号が一致しないオブジェクトを残し、一致するオブジェクトを解放するためである。この判別の結果、インスタンス２９０５、２９０６及び２９０７が、世代番号３のオブジェクトである。よってガベージコレクション装置は、インスタンス２９０５、２９０６及び２９０７を解放し、その結果、メモリ構造は、図２９（ｂ）に示すようになる。
【０１３２】
以下、実施の形態７のガベージコレクション装置の詳細な処理手順について説明する。なお、実施の形態７のガベージコレクション装置の基本的な構成は、図１に示すガベージコレクション装置１００の構成図とほぼ同様であるので、図１の構成図を利用して、ガベージコレクション装置１００とは異なる部分を中心に説明することとする。
【０１３３】
図２３は、実施の形態７の世代ヒープ生成部２０が行う世代ヒープの生成処理の処理手順を示す。
ステップＳ４１１：世代ヒープ生成部２０は、図４（ｃ）に示すヒープメモリ生成処理を呼び出してヒープメモリ管理部６０に実行させることにより、ヒープメモリ領域に世代ヒープを確保し、そのアドレスをｈｅａｐとして取得する。
【０１３４】
ステップＳ２３０１：続いて、確保した世代ヒープ内にローカル変数を割当て初期化する。
ステップＳ２３０２：さらに、ｈｅａｐが指す世代ヒープ内にオブジェクトへのポインタを所定数（例えば１０２４個）分割当て、各ポインタをＮＵＬＬで初期化する。
【０１３５】
ステップＳ４１３：最後に、図４（ｄ）に示す世代ヒープのプッシュ処理を呼び出して世代ヒープ管理部５０に実行させることにより、世代ヒープをスタックに積む。
このように世代ヒープ生成部２０は、メソッド呼び出し毎に、ローカル変数、オブジェクトへのポインタ、１つ世代の古い世代ヒープを指す親ポインタからなる世代ヒープを生成する。
【０１３６】
図２５（ａ）及び（ｂ）は、実体メモリの生成処理及び実体メモリの解放処理を示す。
ヒープメモリ管理部６０は、図４（ｃ）及び図５（ｄ）に示すヒープメモリの生成処理及び解放処理を行う他に、アプリケーションプログラムの実行開始及び終了時に、メモリ上にオブジェクト確保用として大きなサイズのメモリブロックを生成してそのアドレスをｅｎｔｉｔｙに代入する処理（ステップＳ２５０１）と、ｅｎｔｉｔｙが指すメモリブロックを解放する処理（ステップＳ２５０２）とを行う。
【０１３７】
図２６は、実施の形態７のガベージコレクション装置におけるオブジェクト生成部７０が行うオブジェクトの生成処理を示す。
ステップＳ６０１：オブジェクト生成部７０は、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
ステップＳ２７０１：ｅｎｔｉｔｙが指す実態メモリの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをｏｂｊに代入する。
【０１３８】
ステップＳ６０２：図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップＳ２７０２：ｈｅａｐが指す世代ヒープのオブジェクトへのポインタを収める領域から空き領域を探し、そこにｏｂｊの内容を代入する。
ステップＳ２７０３：ｏｂｊが指すオブジェクトの世代番号に、ｈｅａｐが指す世代ヒープの世代番号を代入する。
【０１３９】
ステップＳ６０４：ｏｂｊが指すオブジェクトにメンバ変数を割当て初期化する。
図２７は、実施の形態７のガベージコレクション装置における世代間オブジェクト移動部８０が行う世代間オブジェクト移動下請け処理を示す。世代間オブジェクト移動部８０は、世代ヒープにあるローカル変数への代入や実体メモリにあるオブジェクトのメンバ変数への代入を行い、オブジェクト間の参照関係が発生すると、図８（ａ）に示す世代間オブジェクト移動処理を行う。このとき世代間オブジェクト移動部８０は、図８（ａ）のステップＳ８０８において図８（ｂ）を行う代わりに、図２７に示す処理を行う。
【０１４０】
ステップＳ２８０１：世代間オブジェクト移動部８０は、ｈｅａｐが指す世代ヒープのオブジェクトへのポインタを収める領域から空き領域を探し、そこにｏｂｊの内容を代入する。
ステップＳ２８０２：ｈｅａｐが指す世代ヒープの世代番号をｏｂｊが指すオブジェクトの世代番号に代入する。
【０１４１】
このようにして世代間オブジェクト移動部８０は、オブジェクトへのポインタを世代ヒープ間で移動させた場合には、移動させたポインタに対応するオブジェクトが持つ世代番号に、ポインタが所属する世代ヒープの世代番号を代入する。図２４は、実施の形態７の世代ヒープ解放部４０が行う世代ヒープの解放処理を示す。アプリケーションプログラム中のメソッドが終了してフレーム解放部３０により図５（ａ）に示す処理が実行されてステップＳ５０１の世代ヒープの解放処理が呼び出されると、世代ヒープ解放部４０は、図２４に示す処理を行う。
【０１４２】
ステップＳ２４０１：世代ヒープ解放部４０は、ヒープメモリへのポインタ用の変数ｈｅａｐと、オブジェクトへのポインタ用の変数ｏｂｊと、世代番号用の変数ｇを用意する。
ステップＳ６０２：次に、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出して世代ヒープ管理部５０に実行させることにより、現在実行中のメソッドに対応する世代ヒープのアドレスであるｈｅａｐを取得する。
【０１４３】
ステップＳ２４０２：ｇにｈｅａｐが指す世代ヒープの世代番号を代入する。ステップＳ２４０３：ｈｅａｐが指す世代ヒープにあるポインタのうち、オブジェクトを指すポインタが残っている間、それをｏｂｊに代入して、そのポインタにはＮＵＬＬを代入し、ステップＳ２４０３とステップＳ２４０６との間の処理を繰り返す。
【０１４４】
ステップＳ２００４：ｏｂｊが指すオブジェクトの世代番号が、ステップＳ２４０２で代入されたｇであるか否かを判定する。
ステップＳ２４０５：判定の結果、ｏｂｊが指すオブジェクトの世代番号とｇとが一致する場合、ｏｂｊが指すオブジェクトの領域を解放する。
一方、判定の結果、一致しない場合には何もしない。つまりオブジェクトが持つ世代番号と解放対象の世代ヒープの世代番号とが一致しない場合には当該オブジェクトを解放しない。当該オブジェクトは、当該オブジェクトが持つ世代番号の世代ヒープにあるポインタにより指されているからである。
【０１４５】
ステップＳ５１１：図５（ｃ）に示す世代ヒープのポップ処理を呼び出すことにより、スタックから対象の世代ヒープをはずして世代ヒープを解放する。
このように実施の形態７のガベージコレクション装置は、メソッドの実行中にオブジェクトの生成があると、オブジェクトを実体メモリに生成し、当該オブジェクトへのポインタをメソッドに対応する世代ヒープに生成する。そしてオブジェクトのメンバ変数への値の代入によって、旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照関係が発生したら、新世代ヒープのポインタを旧世代ヒープにコピーする。さらにメソッドが終了すると、対応するフレーム及び世代ヒープを解放する。この解放においては、世代ヒープのポインタにＮＵＬＬを代入し、その世代ヒープのポインタが指すオブジェクトを、他の世代ヒープから指されているオブジェクトを除いて、解放する。
＜実施の形態８＞
以下、実施の形態８にかかるガベージコレクション装置について説明する。
【０１４６】
実施の形態８にかかるガベージコレクション装置は、実施の形態７のガベージコレクション装置と同様に、世代ヒープ内にオブジェクトへのポインタを生成し、オブジェクト自体は実体メモリに生成する。実施の形態８が実施の形態７と異なる点は、実施の形態８のガベージコレクション装置においては、各オブジェクトが世代番号の代わりに当該オブジェクトを指すポインタのアドレスを逆ポインタとして持つ点と世代間でオブジェクトをコピーする代わりにオブジェクトを移動させる点である。その他は、実施の形態７とほぼ同様である。以下、異なる点を中心に説明する。
【０１４７】
図２２（ａ）は、実施の形態８のガベージコレクション装置における世代ヒープを中心とするメモリ構造の一例を示す。
図２２（ａ）において、ガベージコレクション装置は、まず、アプリケーションプログラムの実行により、第一のメソッドが呼び出されると、第一のメソッド用に作業用のフレーム（不図示）を１つ生成し、そのフレームに対応して第一世代の世代ヒープを生成する。そして第一世代の世代ヒープ内にローカル変数（不図示）及びオブジェクトへのポインタのための領域を確保して各領域を初期化する。
【０１４８】
次に第一のメソッド実行中に第二のメソッドが呼び出されると、先と同様の手順によりフレーム（不図示）及び第二世代の世代ヒープを生成し、第二世代の世代ヒープ内にローカル変数（不図示）及びオブジェクトへのポインタのための領域の確保及び初期化を行う。
さらに第二のメソッド実行中に第三のメソッドが呼び出されると、先と同様の手順によりフレーム（不図示）及び第三世代の世代ヒープを生成し、第三世代の世代ヒープ内にローカル変数（不図示）及びオブジェクトへのポインタのための領域の確保及び初期化を行う。
【０１４９】
このように世代ヒープを生成しながら、各メソッドの実行中にオブジェクトの生成があると、実体メモリの空き領域にオブジェクト用の領域を確保し、そのオブジェクトへのポインタをそのメソッドに対応する世代ヒープに格納する。
そして旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照が発生した場合には、新世代ヒープのポインタを旧世代ヒープへと移動させる。
【０１５０】
以下、この移動について具体的に説明する。
図２２（ａ）において、第一世代の世代ヒープにあるポインタ２２００は、実体メモリにあるインスタンスＡを指し、第三世代の世代ヒープにあるポインタ２２０１は、実態メモリにあるインスタンスＢを指し、第二世代の世代ヒープにあるポインタ２２０２は、実体メモリにあるインスタンスＣを指す。またインスタンスＡはインスタンスＢを参照し（図中、点線矢印にて示す）、インスタンスＢはインスタンスＣを参照する。
【０１５１】
このような参照関係において、インスタンスＡからインスタンスＢへの参照は、第一世代の世代ヒープのポインタ２２００が指すインスタンスＡから第三世代の世代ヒープのポインタ２２０１が指すインスタンスＢへの参照であり、すなわち、旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照である。このような参照関係がある場合、新世代ヒープのポインタは旧世代ヒープに移される。つまり第三世代の世代ヒープのポインタ２２０１は、第一世代の世代ヒープに移されることとなる。
【０１５２】
ポインタ２２０１の移動により、インスタンスＢからインスタンスＣへの参照は、第一世代の世代ヒープのポインタ２２０１が指すインスタンスＢから第二世代の世代ヒープのポインタ２２０２が指すインスタンスＣへの参照となり、つまりこれも旧世代ヒープのポインタが指すオブジェクトから新世代ヒープのポインタが指すオブジェクトへの参照となる。従って、第二世代の世代ヒープのポインタ２２０２も、第一世代の世代ヒープに移され、その結果、世代ヒープの構造は図２２（ｂ）に示す通りとなる。
【０１５３】
このように実施の形態８のガベージコレクション装置においては、実体メモリにあるオブジェクトの位置は移動しないが、世代ヒープにあるオブジェクトへのポインタを世代ヒープ間で移動することによって、間接的にオブジェクトの属する世代を変更している。そしてメソッドの実行が終了したときには、メソッドに対応するフレームの解放とともに、対応する世代ヒープを一気に解放する。このような解放の仕方により、従来のように使用済みのオブジェクトを探索して、探索された使用済みのオブジェクトを解放するという時間のかかる操作を行わないので短時間で処理することができる。
【０１５４】
以下、実施の形態８のガベージコレクション装置の詳細な処理手順について説明する。なお、実施の形態８のガベージコレクション装置の基本的な構成は、図１に示すガベージコレクション装置１００の構成図とほぼ同様であり、また各構成要素の処理手順は実施の形態７のガベージコレクション装置とほぼ同様であるので、以下、図１の構成図を利用して、ガベージコレクション装置１００及び実施の形態７のガベージコレクション装置とは異なる部分を中心に説明することとする。
【０１５５】
図３１は、実施の形態８におけるガベージコレクション装置のオブジェクト生成部７０が行うオブジェクト生成処理の処理手順を示す。
ステップＳ６０１：オブジェクト生成部７０は、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
ステップＳ２７０１：ｅｎｔｉｔｙが指す実態メモリの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをｏｂｊに代入する。ここで実体メモリは、実施の形態７と同様に図２５（ａ）及び（ｂ）に示す実態メモリの生成処理及び実体メモリの解放処理により生成及び解放されるものである。
【０１５６】
ステップＳ６０２：図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスをｈｅａｐに取得する。ステップＳ３１０１：ｈｅａｐが指すヒープメモリのオブジェクトへのポインタを収める領域から空きを探し、そこにｏｂｊの内容を代入し、ｏｂｊが指すオブジェクトの逆ポインタにその領域のアドレスを代入する。
【０１５７】
ステップＳ６０４：ｏｂｊが指すオブジェクトのメンバ変数を割当て、初期化する。
図３２は、実施の形態８のガベージコレクション装置における世代間オブジェクト移動部８０が行う世代間オブジェクト移動下請け処理を示す。世代間オブジェクト移動部８０は、世代ヒープにあるローカル変数への代入や実体メモリにあるオブジェクトのメンバ変数への代入を行い、オブジェクト間の参照関係が発生すると、図８（ａ）に示す世代間オブジェクト移動処理を行う。このとき世代間オブジェクト移動部８０は、図８（ａ）のステップＳ８０８において図８（ｂ）を行う代わりに、図３２に示す処理を行う。
【０１５８】
ステップＳ３２０１：ｏｂｊが指すオブジェクトの逆ポインタが指す領域にＮＵＬＬを代入する。
ステップＳ３２０２：ｈｅａｐが指すヒープメモリのオブジェクトへのポインタを収める領域から空きを探し、そこにｏｂｊの内容を代入し、ｏｂｊが指すオブジェクトの逆ポインタにその領域のアドレスを代入する。
【０１５９】
このように世代間オブジェクト移動部８０は、それまでのオブジェクトを指していたポインタにＮＵＬＬを代入することで、新世代ヒープのポインタとオブジェクトとの関係を解除し、旧世代ヒープにオブジェクトへのポインタを新たに生成し、オブジェクトにはその逆ポインタを生成する。
図３０は、世代ヒープ解放部４０が行う世代ヒープの解放処理の処理手順を示す。実施の形態８におけるガベージコレクション装置の世代ヒープ解放部４０は、図５（ａ）のフレーム解放処理中のステップＳ５０１において世代ヒープの解放処理が呼び出されると、図３０の処理を行う。
【０１６０】
ステップＳ３００１：世代ヒープ解放部４０は、ヒープメモリのアドレス用の変数ｈｅａｐ、オブジェクトへの間接ポインタ用に変数ｐｔｒ、オブジェクトへの直接ポインタ用に変数ｏｂｊを用意する。
ステップＳ６０２：次に、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
【０１６１】
ステップＳ３００２：続いて、ｈｅａｐが指しているヒープメモリのオブジェクトへのポインタで、オブジェクトを指しているアドレスが残っている間、そのポインタのアドレスをｐｔｒに代入し、ステップＳ３００２とステップＳ３００６との間の処理を繰り返す。
ステップＳ３００３：ｏｂｊにｐｔｒが指している領域の内容を代入する。
【０１６２】
ステップＳ３００４：ｏｂｊが指すオブジェクトの逆ポインタがｐｔｒと一致するか否かを判定する。
ステップＳ３００５：判定の結果、一致する場合には、ｏｂｊが指すオブジェクト領域を解放し、一致しない場合には何もしない。
ステップＳ５１１：最後に、図５（ｃ）に示す世代ヒープのポップ処理を呼び出し、世代ヒープが積まれたスタックから世代ヒープを１つはずして解放する。
＜その他の実施の形態＞
実施の形態１から６においてオブジェクト間の参照は、オブジェクトが他のオブジェクトへのポインタを保持することによって他のオブジェクトを直接参照する方式であった。この方式の代わりに、ハンドルメモリというハンドルを保持する領域を設け、ハンドルを介してオブジェクト間のあらゆる参照関係を構築する方式にしてもよい。例えば、オブジェクトＡからオブジェクトＢへの参照は、実施の形態１から６の場合、オブジェクトＡがオブジェクトＢを指すポインタを保持することにより表される。これに対し、ハンドルを介する方式の場合は、オブジェクトＡがハンドルを指すポインタを保持し、当該ハンドルはオブジェクトＢを指すポインタを保持する。このような方式によりオブジェクトＢを他の世代ヒープへ移動させた場合、オブジェクトＡが保持するポインタは変更せず、ハンドルが保持するポインタを変更することになる。
【０１６３】
以下、この方式を用いる場合における実施形態１から６の変更点及び追加点を示す。
図３３（ａ）及び（ｂ）は、実施の形態１から６のガベージコレクション装置に追加すべき処理を示す。図３３（ａ）に示すようにガベージコレクション装置は、アプリケーションプログラムが実行開始されると、大きなサイズのメモリブロックを確保することによりハンドル保持用のハンドルメモリを生成し、そのアドレスをｅｎｔｉｔｙに代入する（ステップＳ３３０１）。また図３３（ｂ）に示すようにアプリケーションプログラムが実行終了すると、ｅｎｔｉｔｙが指すハンドルメモリを解放する（ステップＳ３３０２）。
【０１６４】
図３４は、実施の形態１のオブジェクト生成部が図６（ａ）の代わりに行うべきオブジェクト生成処理を示す。
ステップＳ６０１：オブジェクト生成部は、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
ステップＳ６０２：次に、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
【０１６５】
ステップＳ３４０１：ハンドルメモリの空き領域からハンドルを割当て、そのアドレスをｏｂｊに代入する。
ステップＳ３４０２：ｈｅａｐが指す世代ヒープの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをｏｂｊがさすハンドルの「対応するオブジェクト」領域に代入し、オブジェクトの「対応するハンドル」領域にｏｂｊの内容を代入する。
【０１６６】
ステップＳ６０４：さらに、ｏｂｊが指すオブジェクトのメンバ変数を割当てて、オブジェクトの領域を初期化する。
図３７は、実施の形態２及び３のオブジェクト生成部が図１１（ａ）の代わりに行うべきオブジェクト生成処理を示す。
ステップＳ１１０１：オブジェクト生成部は、オブジェクトのアドレス用にｏｂｊを用意し、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
【０１６７】
ステップＳ６０２：次に、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップＳ１１０２：ステップＳ６０２において取得したアドレスが指す世代ヒープに、十分の広さの空き領域があるか否かを判定する。
ステップＳ１１０３：ステップＳ１１０２の判定の結果、十分な広さの空き領域がない場合には、世代ヒープのスカビンジ処理を呼び出し、世代ヒープスカビンジ部に当該世代ヒープについてのスカビンジ処理を行わせる。
【０１６８】
ステップＳ３７０１：ハンドルメモリの空き領域からハンドルを割当て、そのアドレスにｏｂｊを代入する。
ステップＳ３７０２：ｈｅａｐが指す世代ヒープの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをｏｂｊがさすハンドルの「対応するオブジェクト」領域に代入し、オブジェクトの「対応するハンドル」領域にｏｂｊの内容を代入する。
【０１６９】
ステップＳ６０４：ｏｂｊが指すオブジェクトのメンバ変数を割当て、オブジェクトの領域を初期化する。
図３８は、実施の形態４のオブジェクト生成部が図１７の代わりに行うべきオブジェクト生成処理を示す。
ステップＳ６０１：オブジェクト生成部は、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
【０１７０】
ステップＳ６０２：次に、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップＳ３８０１：ハンドルメモリの空き領域からハンドルを割当て、そのアドレスにｏｂｊを代入する。
ステップＳ３８０２：ｈｅａｐが指す世代ヒープの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをｏｂｊがさすハンドルの「対応するオブジェクト」領域に代入し、オブジェクトの「対応するハンドル」領域にｏｂｊの内容を代入する。
【０１７１】
ステップＳ１８０１：ｏｂｊが指すオブジェクトの被参照数に０をセットする。
ステップＳ６０４：ｏｂｊが指すオブジェクトのメンバ変数を割当て、オブジェクトの領域を初期化する。
図４０は、実施の形態５及び６のオブジェクト生成部が行うべきオブジェクト生成処理を示す。
【０１７２】
ステップＳ６０１：オブジェクト生成部は、世代ヒープのアドレス確保用に変数ｈｅａｐを用意する。
ステップＳ６０２：次に、図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップＳ１１０２：ステップＳ６０２において取得したアドレスが指す世代ヒープに、十分の広さの空き領域があるか否かを判定する。
【０１７３】
ステップＳ１１０３：ステップＳ１１０２の判定の結果、十分な広さの空き領域がない場合には、世代ヒープのスカビンジ処理を呼び出し、世代ヒープスカビンジ部に当該世代ヒープについてのスカビンジ処理を行わせる。
ステップＳ４００５：ｈｅａｐが指す世代ヒープの空き領域からオブジェクトを割当て、そのアドレスをｏｂｊに代入する。
【０１７４】
ステップＳ４００６：ハンドルメモリの空き領域からハンドルを割当て、そのアドレスにｏｂｊを代入する。
ステップＳ４００７：ｈｅａｐが指す世代ヒープの空き領域からオブジェクトを割当て、そのオブジェクトのアドレスをｏｂｊがさすハンドルの「対応するオブジェクト」領域に代入し、オブジェクトの「対応するハンドル」領域にｏｂｊの内容を代入する。
【０１７５】
ステップＳ１８０１：ｏｂｊが指すオブジェクトの被参照数に０をセットする。
ステップＳ６０４：ｏｂｊが指すオブジェクトのメンバ変数を割当て、オブジェクトの領域を初期化する。
図３６は、実施の形態１及び４の世代間オブジェクト移動部が図８（ｂ）の代わりに行うべき世代間オブジェクト移動下請け処理を示す。
【０１７６】
ステップＳ３６０１：ｏｂｊが指すハンドルに対応するオブジェクトを、ｈｅａｐが指す世代ヒープに移動する。
ステップＳ３６０２：ｏｂｊが指しているハンドルの「対応するオブジェクト」領域に、移動した先のオブジェクトのアドレスを代入する。
図３９は、実施の形態４から６のオブジェクト解放部が図２０の代わりに行うべきオブジェクト解放処理を示す。
【０１７７】
ステップＳ２１０１：オブジェクト解放部は、オブジェクトのアドレス格納用として変数ｗｏｒｋを用意する。
ステップＳ２１０２：ｏｂｊが指しているオブジェクトのメンバで、他のオブジェクトを指しているアドレスが残っている間、それをｗｏｒｋに代入して、ステップＳ１９０４の処理を繰り返す。
【０１７８】
ステップＳ１９０４：被参照数デクリメント処理を呼び出して被参照数変更部に実行させる。
ステップＳ３９０１：ｏｂｊが指すオブジェクトの「対応するハンドル」領域が指すハンドルを解放する。
ステップＳ２１０５：ｏｂｊが指すオブジェクト領域を解放する。
【０１７９】
図３５は、実施の形態１から６の世代ヒープ解放部が図５（ｂ）の代わりに行うべき世代ヒープの解放処理を示す。
ステップＳ３５０１：世代ヒープ解放部は、ヒープメモリへのポインタとして変数ｈｅａｐを用意し、オブジェクトへのポインタとして変数ｏｂｊを用意する。
【０１８０】
ステップＳ６０２：図６（ｂ）に示す現在の世代ヒープ取得処理を呼び出し、現在実行中のメソッドに対応する世代ヒープのアドレスを取得する。
ステップＳ３５０３：ｇにｈｅａｐが指す世代ヒープの世代番号を代入する。ステップＳ３５０４：ｈｅａｐが指しているヒープメモリのすべてのオブジェクトについて、そのアドレスをｏｂｊに代入して、ステップＳ３５０５を繰り返す。
【０１８１】
ステップＳ３５０５：ｏｂｊが指すオブジェクトの「対応するハンドル」が指すハンドルを解放する。
ステップＳ５１１：図５（ｃ）に示す世代ヒープのポップ処理を呼び出して、スタックから対象の世代ヒープをはずして世代ヒープを解放する。
このようにハンドルを介して参照関係を表す方式においては、オブジェクトを世代ヒープ間で移動させたとき、当該オブジェクトに対応するハンドルが持つポインタを変更するのみでよい。これに対し、実施の形態１から６のハンドルを介さずにオブジェクト間で直接参照する方式の場合、オブジェクトを移動した際、当該オブジェクトを指していたポインタをすべて変更しなければならない。よってハンドルを介して参照関係を表す方式においては、１つのオブジェクトの移動につき、オブジェクトの実際の移動にかかる時間と対応するハンドル内のポインタの変更にかかる時間とをあわせた時間がかかる。この時間は一定であるので、移動対象のオブジェクトの数を予め把握することができれば、１つのオブジェクトの移動に要する時間と移動対象のオブジェクトの数とを掛け合わせた時間が処理時間となり、正確に処理時間を予測することができることとなる。そして処理時間を予測できるガベージコレクション装置は、応答性を要するアプリケーションプログラムに利用することができる。
【０１８２】
以上、各実施形態について説明したが上記実施形態の他に実施形態同士で組み合わせ可能なものを組み合わせて実施してもよい。
各実施形態におけるガベージコレクション装置の動作手順を汎用のコンピュータ又はプログラム実行機能を有する機器等に実行させるためのコンピュータプログラムとし、記録媒体に記録し又は各種通信路等を介して流通させ頒布することもできる。このような記録媒体にはＩＣカード、光ディスク、フレキシブルディスク、ＲＯＭ等がある。
【０１８３】
各実施形態におけるガベージコレクション装置の動作手順を方法として実施してもよい。
【０１８４】
【発明の効果】
本発明のガベージコレクション装置は、アプリケーションプログラムを構成するメソッドが実行開始された場合にメソッド用メモリ領域を確保し、確保したメソッド用メモリ領域とメソッドとの対応関係及び確保した各メソッド用メモリ領域同士の確保時期の先後関係を記録する確保手段と、メソッド用メモリ領域中のあるオブジェクトが当該メソッド用メモリ領域より先に確保されたメソッド用メモリ領域から参照されている場合に、当該オブジェクトを当該先に確保されたメソッド用メモリ領域に移動させる移動手段と、メソッドが実行終了した場合に当該メソッドに対応するメソッド用メモリ領域を解放する解放手段とを備える。
【０１８５】
このような構成により、古いメソッド用メモリ領域から参照されている新しいメソッド用メモリ領域のオブジェクトを古いメソッド用メモリ領域に移動させるので、新しいメソッド用メモリ領域について、その中の各オブジェクトが使用済みか否かを把握する必要なく、メソッドの終了と同時に一気に解放することができる。このように使用済みか否かの把握に要する時間が不要となるので解放にかかる時間は短い。またこの解放は定型的な処理を行うだけであるため、解放に要する時間は常に一定であり、解放の処理の各ステップに要する予測時間の合計から解放に要する時間を予測することができる。
【０１８６】
また移動対象のオブジェクトはメモリ領域全体に多数存在するのではなく、比較的新しいメソッド用メモリ領域、すなわちメモリ領域全体の局所的な部分に存在するので、その分数が少なく、移動に要する時間は短くなる。また移動に要する時間は、オブジェクトの合計サイズに比例するので、１つのオブジェクトに対して参照関係によりぶら下がるオブジェクトの合計サイズの上限を予め定めておけば、移動に要する時間の上限を予測することができる。あるいは、各メソッド用メモリ領域の上限を定めておけば、移動させるオブジェクトは参照元のオブジェクトが存在する古いメソッド用メモリ領域よりも新しいメソッド用メモリ領域に存在するので、新しい各メソッド用メモリ領域の合計サイズから、移動に要する時間の上限を予測することができる。
【０１８７】
加えて、古いメソッド用メモリ領域から新しいメソッド用メモリ領域のオブジェクトへの参照は特定の命令を実行した場合にしか発生しないので、世代間のオブジェクトの移動は発生頻度が比較的少ない。よって移動によりアプリケーションプログラムの実行が中断される回数は少なく、全体として中断される時間も短くなる。
【０１８８】
以上のことから、ガベージコレクション装置は、メソッド用メモリ領域の解放やオブジェクトの移動等の主な処理の起動時間が短く、その時間を上限の予測も含めて予測することができるので、応答性を要するアプリケーションプログラムにも利用することができる。
【図面の簡単な説明】
【図１】本発明の実施の形態１に係るガベージコレクション装置１００の構成図である。
【図２】（ａ）は、ガベージコレクション装置１００の動作の概略を示すフローチャートである。
（ｂ）は、ステップＳ２５のオブジェクトの移動処理の概略を示すフローチャートである。
【図３】（ａ）及び（ｂ）は、生成された世代ヒープに確保されたメモリオブジェクトの移動の一例を示す図である。
【図４】（ａ）は、フレームの生成処理を示す。
（ｂ）は、世代ヒープ生成処理を示す。
（ｃ）は、ヒープメモリの生成処理を示す。
（ｄ）は、世代ヒープのプッシュ処理を示す。
【図５】（ａ）は、フレーム解放処理を示す。
（ｂ）は、世代ヒープの解放処理を示す。
（ｃ）は、世代ヒープのポップ処理を示す。
（ｄ）は、ヒープメモリの解放処理を示す。
【図６】（ａ）は、オブジェクト生成処理を示す。
（ｂ）は、現在の世代ヒープ取得処理を示す。
【図７】（ａ）は、世代間オブジェクト移動部８０が行うローカル変数への代入処理を示す。
（ｂ）は、世代間オブジェクト移動部８０が行うメンバ変数への代入処理を示す。
【図８】（ａ）は、世代間オブジェクト移動部８０が行う世代間オブジェクト移動処理を示す。
（ｂ）は、世代間オブジェクト移動部８０が行う世代間オブジェクト移動下請け処理を示す。
【図９】実施の形態２に係るガベージコレクション装置２００の構成図である。
【図１０】ガベージコレクション装置２００の動作の概略を示すフローチャートである。
【図１１】（ａ）は、オブジェクト生成部７２が行うオブジェクトの生成処理を示す。
（ｂ）は、世代間オブジェクト移動下請け処理の処理手順を示す。
（ｃ）は、世代ヒープのスカビンジ処理の処理手順を示す。
【図１２】（ａ）は、世代ヒープのマーキング処理の処理手順を示す。
（ｂ）は、到達フラグのマーキング処理の手順を示す。
【図１３】世代ヒープのスイーピング処理の処理手順を示す。
【図１４】実施の形態３に係るガベージコレクション装置３００の構成図である。
【図１５】世代ヒープスカビンジ部９３が行う世代ヒープスカビンジ処理の処理手順を示す。
【図１６】実施の形態４に係るガベージコレクション装置４００の構成図である。
【図１７】オブジェクト生成部７４が行うオブジェクト生成処理を示す。
【図１８】（ａ）は、世代間オブジェクト移動部８４が行うローカル変数への代入処理を示す。
（ｂ）は、世代間オブジェクト移動部８４が行うメンバ変数への代入処理を示す。
【図１９】（ａ）は、被参照数変更部９４が行う被参照数デクリメント処理を示す。
（ｂ）は、被参照数変更部９４が行う被参照数インクリメント処理を示す。
【図２０】オブジェクト解放部９５が行うオブジェクト解放処理を示す。
【図２１】ガベージコレクション装置４００の動作の概略を示すフローチャートである。
【図２２】（ａ）は、実施の形態８のガベージコレクション装置における世代ヒープを中心とするメモリ構造の一例を示す。
（ｂ）は、図２２（ａ）の例におけるポインタ移動後のメモリ構造の例を示す。
【図２３】実施の形態７の世代ヒープ生成部２０が行う世代ヒープの生成処理の処理手順を示す。
【図２４】実施の形態７の世代ヒープ解放部４０が行う世代ヒープの解放処理を示す。
【図２５】（ａ）は、実体メモリの生成処理を示す。
（ｂ）は、実体メモリの解放処理を示す。
【図２６】実施の形態７のガベージコレクション装置におけるオブジェクト生成部７０が行うオブジェクトの生成処理を示す。
【図２７】実施の形態７のガベージコレクション装置における世代間オブジェクト移動部８０が行う世代間オブジェクト移動下請け処理を示す。
【図２８】（ａ）は、実施の形態７のガベージコレクション装置における世代ヒープを中心とするメモリ構造の一例を示す。
（ｂ）は、図２８（ａ）の例におけるポインタコピー後のメモリ構造の例を示す。
【図２９】（ａ）は、第三世代の世代ヒープを解放する場合におけるメモリ構造の変化の例を示す。
（ｂ）は、図２９（ａ）の例におけるオブジェクト解放後のメモリ構造の例を示す。
【図３０】世代ヒープ解放部４０が行う世代ヒープの解放処理の処理手順を示す。
【図３１】実施の形態８におけるガベージコレクション装置のオブジェクト生成部７０が行うオブジェクト生成処理の処理手順を示す。
【図３２】実施の形態８のガベージコレクション装置における世代間オブジェクト移動部８０が行う世代間オブジェクト移動下請け処理を示す。
【図３３】（ａ）及び（ｂ）は、実施の形態１から６のガベージコレクション装置に追加すべきハンドルメモリの生成処理及び解放処理を示す。
【図３４】実施の形態１のオブジェクト生成部が図６（ａ）の代わりに行うべきオブジェクト生成処理を示す。
【図３５】実施の形態１から６の世代ヒープ解放部が図５（ｂ）の代わりに行うべき世代ヒープの解放処理を示す。
【図３６】実施の形態１及び４の世代間オブジェクト移動部が図８（ｂ）の代わりに行うべき世代間オブジェクト移動下請け処理を示す。
【図３７】実施の形態２及び３のオブジェクト生成部が図１１（ａ）の代わりに行うべきオブジェクト生成処理を示す。
【図３８】実施の形態４のオブジェクト生成部が図１７の代わりに行うべきオブジェクト生成処理を示す。
【図３９】実施の形態４から６のオブジェクト解放部が図２０の代わりに行うべきオブジェクト解放処理を示す。
【図４０】実施の形態５及び６のオブジェクト生成部が行うべきオブジェクト生成処理を示す。
【符号の説明】
１０    フレーム生成部
２０    世代ヒープ生成部
３０    フレーム解放部
４０    世代ヒープ解放部
５０    世代ヒープ管理部
６０    ヒープメモリ管理部
７０    オブジェクト生成部
７２    オブジェクト生成部
７４    オブジェクト生成部
８０    世代間オブジェクト移動部
８２    世代間オブジェクト移動部
８３    世代間オブジェクト移動部
８４    世代間オブジェクト移動部
９０    世代ヒープスカビンジ部
９３    世代ヒープスカビンジ部
９４    被参照数変更部
９５    オブジェクト解放部
１００  ガベージコレクション装置
２００  ガベージコレクション装置
３００  ガベージコレクション装置
４００  ガベージコレクション装置
【図１】
0003939975.tif 000002
【図２】
0003939975.tif 000003
【図３】
0003939975.tif 000004
【図４】
0003939975.tif 000005
【図５】
0003939975.tif 000006
【図６】
0003939975.tif 000007
【図７】
0003939975.tif 000008
【図８】
0003939975.tif 000009
【図９】
0003939975.tif 000010
【図１０】
0003939975.tif 000011
【図１１】
0003939975.tif 000012
【図１２】
0003939975.tif 000013
【図１３】
0003939975.tif 000014
【図１４】
0003939975.tif 000015
【図１５】
0003939975.tif 000016
【図１６】
0003939975.tif 000017
【図１７】
0003939975.tif 000018
【図１８】
0003939975.tif 000019
【図１９】
0003939975.tif 000020
【図２０】
0003939975.tif 000021
【図２１】
0003939975.tif 000022
【図２２】
0003939975.tif 000023
【図２３】
0003939975.tif 000024
【図２４】
0003939975.tif 000025
【図２５】
0003939975.tif 000026
【図２６】
0003939975.tif 000027
【図２７】
0003939975.tif 000028
【図２８】
0003939975.tif 000029
【図２９】
0003939975.tif 000030
【図３０】
0003939975.tif 000031
【図３１】
0003939975.tif 000032
【図３２】
0003939975.tif 000033
【図３３】
0003939975.tif 000034
【図３４】
0003939975.tif 000035
【図３５】
0003939975.tif 000036
【図３６】
0003939975.tif 000037
【図３７】
0003939975.tif 000038
【図３８】
0003939975.tif 000039
【図３９】
0003939975.tif 000040
【図４０】
0003939975.tif 000041