(57)【特許請求の範囲】
【請求項１】
オブジェクトをその上に生成し、必要に応じて該オブジェクトを保持するためのヒープメモリの管理方法であって、
前記ヒープメモリを論理的に新世代ヒープと旧世代ヒープとに分割して管理し、
新規オブジェクトに前記新世代ヒープ内のメモリブロックを割り当て、
前記新世代ヒープに対してガベージコレクションを行うマイナーコレクションを繰り返し実行し、
所定回数のマイナーコレクションを経てもまだ生存と判断されるオブジェクトを前記新世代ヒープか前記旧世代ヒープに再配置し、
前記マイナーコレクションを複数回実行したことをひとつの条件に、前記旧世代ヒープを少なくとも含むヒープに対してガベージコレクションを行うメジャーコレクションを実行し、
各マイナーコレクションは、
前回のマイナーコレクションの実行以降に生成した新規オブジェクトの生存率を算出し、
該生存率が所定の閾値以下なら、前記新規オブジェクトのうちの生存オブジェクトを前記新世代ヒープ内のエイジング領域に再配置し、
該生存率が前記閾値より高ければ、前記新規オブジェクトのうちの生存オブジェクトを前記旧世代ヒープに直接再配置するステップを有するヒープメモリの管理方法。
【請求項２】
前記生存率は、前回のマイナーコレクションの実行以降に生成した新規オブジェクトを割り当てた新世代ヒープのメモリサイズと、該新規オブジェクトのうち生存するオブジェクトが割り当てられたメモリサイズとの比率であることを特徴とする請求項１記載のヒープメモリ管理方法。
【請求項３】
前記生存率は、前回のマイナーコレクションの実行以降に生成した新規オブジェクトのうちの生存するオブジェクトの数であることを特徴とする請求項１記載のヒープメモリ管理方法。
【請求項４】
オブジェクトをその上に生成し、必要に応じて該オブジェクトを保持するためのヒープメモリの管理方法であって、
前記ヒープメモリを論理的に新世代ヒープと旧世代ヒープとに分割して管理し、
新規オブジェクトに前記新世代ヒープ内のメモリブロックを割り当て、
前記新世代ヒープに対してガベージコレクションを行うマイナーコレクションを繰り返し実行し、
所定回数のマイナーコレクションを経てもまだ生存と判断されるオブジェクトを前記新世代ヒープか前記旧世代ヒープに再配置し、
前記マイナーコレクションを複数回実行したことをひとつの条件に、前記旧世代ヒープを少なくとも含むヒープに対してガベージコレクションを行うメジャーコレクションを実行し、
各マイナーコレクションは、
前回のマイナーコレクションの実行以降に生成した新規オブジェクトの生存率を算出し、
過去のマイナーコレクションの実行の時から前記新規オブジェクトの生存率が継続して第１の閾値を超えた回数を継続カウンタに記録し、
継続カウンタの値が第２の閾値を超えた場合に、前記新規オブジェクトのうちの生存オブジェクトを前記旧世代ヒープに直接再配置し、それ以外の場合は前記新規オブジェクトのうちの生存オブジェクトを前記新世代ヒープ内のエイジング領域に再配置するステップを有するヒープメモリの管理方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、計算機システムに関し、特に計算機システムにおけるメモリ管理方法の分野に関する。具体的には、世代別ガベージコレクション(generational garbage collection)方法およびそれを用いた計算機システムに関する。
【０００２】
【従来の技術】
すべてのアプリケーションプログラムは、様々なリソースを用いて記述される。例えば、オブジェクト指向環境におけるプログラミングでは、リソースをオブジェクトとして扱う。プログラマは、オブジェクト毎に明示的にメモリを確保し、そのオブジェクトに対応したメモリブロックを初期化して、プログラム実行時にオブジェクトを利用する。利用後はオブジェクトの状態情報を破棄し、最終的にオブジェクトを割り当てたメモリを解放する。ところが、プログラマによるこれら一連のメモリ管理操作はバグの巣窟であり、メモリリークやオブジェクトの破壊といった、致命的なプログラミングエラーを起こしかねない。
【０００３】
プログラマをメモリ管理のわずらわしさから解放するため、近年多用されているオブジェクト指向型のプログラミングシステムは、メモリ管理を自動的かつ動的に行う。オブジェクト指向言語処理系（プログラミングシステム、以下単にシステムという）はヒープとよぶ有限サイズのメモリを管理し、オブジェクトのヒープへの割り当てを自動的かつ動的に行う。アプリケーションプログラム実行時、システムによるオブジェクトのヒープ割り当ては継続して行われるため、いつかは有限なヒープを使い尽くしてしまう。この問題を解決するためには、ガベージコレクションにより、ヒープ内の使用していないメモリブロックを回収し、再利用する必要がある。
【０００４】
一般に、オブジェクト指向のプログラミング実行環境では、ヒープ内オブジェクトへのポインタ（メモリのロケーション情報）がなくなるとオブジェクトにアクセスすることができないため、アクセス不可能になったオブジェクトに対して割り当てられたメモリブロックを他のオブジェクトのために再利用できる。この事実に基づきガベージコレクションは、実行中のアプリケーションプログラムがアクセス可能なオブジェクトを識別し、アクセス可能であれば生存オブジェクトとして保持する。アクセス不可能であったオブジェクトは不必要なオブジェクトとして後のヒープ割り当てのために解放し、そのメモリブロックを後に再利用する。
【０００５】
オブジェクトがアクセス可能かどうかは、ルーツをたどることにより判断する。すべてのアプリケーションプログラムはルーツを持つ。ルーツはメモリロケーション情報のリストであり、ヒープ内のオブジェクトか、ヒープ内のnullをセットされたオブジェクト（プログラムからの参照がなくなったもの）のどちらかを参照する。たとえば、アプリケーションプログラム内のすべてのグローバルな静的オブジェクトポインタ、スタック上にあるローカル変数や引数オブジェクトポインタ、ヒープ内のオブジェクトを指すポインタを格納するＣＰＵレジスタはすべて、アプリケーションプログラムのルーツの一部とみなされる。ガベージコレクションはルーツをたどり、オブジェクトがルーツから到達可能であればアクセス可能であると判断する。
【０００６】
ガベージコレクション方法としては、様々な手法が提案されている。これら従来手法については、Ｒｉｃｈａｒｄ  ＪｏｎｅｓおよびＲａｆａｅｌ  Ｌｉｎｓによる「Ｇａｒｂａｇｅ  Ｃｏｌｌｅｃｔｉｏｎ：Ａｌｇｏｒｉｔｈｍｓ  ｆｏｒ  Ａｕｔｏｍａｔｉｃ  Ｄｙｎａｍｉｃ  Ｍｅｍｏｒｙ  Ｍａｎａｇｅｍｅｎｔ」、Ｊｏｈｎ  Ｗｉｌｅｙ＆Ｓｏｎｓ出版社（ＩＳＢＮ  ０−１４７−９４１４８−４）に詳細が記述されているため、ここでは説明を省略する。その中で、近年のオブジェクト指向プログラミングシステムは、最も効率よくガベージコレクションを行う方法として、世代別ガベージコレクションを採用している。
【０００７】
世代別ガベージコレクションは、ほとんどのオブジェクトの生存期間は短く、かつ、新しいオブジェクト程生存期間が短く、古いオブジェクト程生存期間も長いという前提の下で、ガベージコレクション実行時に調査対象になるオブジェクトの数、すなわち、ガベージコレクションの対象となるオブジェクトを割り当てたメモリのサイズ、を限定することにより、ガベージコレクションによりアプリケーションプログラム実行が中断する時間を削減する。
【０００８】
世代別ガベージコレクションでは、ヒープを世代とよぶ複数グループに論理的に分割して管理する。世代はオブジェクトの生存期間に関連し、一般にそのオブジェクトが生存したガベージコレクションサイクルで決定される。例えば、ヒープを新世代と旧世代という２つのグループに論理的に分割した場合、最新オブジェクトを新世代ヒープのメモリブロックに配置し、何回かガベージコレクションを行った後も生存するオブジェクトを旧世代ヒープのメモリブロックに再配置する。通常は新世代ヒープのみを対象としてガベージコレクションを行い（マイナーコレクション）、新世代ヒープに新規オブジェクトに割り当てるための空きメモリブロックがなくなった場合にのみ、少なくとも旧世代を含むヒープに対してガベージコレクションを行う（メジャーコレクション）。マイナーコレクションは、アプリケーションプログラム実行中に、新規オブジェクトを割り当てたメモリサイズがあらかじめ決められた閾値に達するか、あるいはあらかじめ決められた時間が経過すると行われ、メジャーコレクションに比べ頻繁に行われる。マイナーコレクションは、ルーツをたどることによりガベージコレクションの対象となる新世代ヒープのメモリブロックを割り当てたオブジェクト群の中でアクセスできないオブジェクトを識別し、アクセス可能なオブジェクトを別の場所に再配置する。また、十分に長く生き残ったオブジェクトを旧世代ヒープに再配置する。
【０００９】
一般に、再配置とは、アクセス可能なオブジェクトを別のメモリブロックにコピーする処理である。コピー処理後もアプリケーションプログラムがコピー先のオブジェクトにアクセスできるように、そのオブジェクトへのポインタをコピー先のメモリブロックへとつけかえる。マイナーコレクションでは、再配置の対象となるオブジェクト数がメジャーコレクションに比べると非常に少ないため、高速にガベージコレクションを行うことができる。
【００１０】
図１にヒープを旧世代と新世代の２グループに論理的に分割した世代別ガベージコレクションシステムの１例を示す。図中、１００はヒープ、１０１は旧世代ヒープ、１０２は新世代ヒープである。新世代ヒープ１０２はさらにオブジェクト作成領域１１０とエイジング領域１１１に論理分割される。また、図示のように新世代ヒープではあるがまだ利用されていない領域も含む。１２０、１３０、１４０はヒープに保持するオブジェクトであり、ここでは同じ内容を示す。
【００１１】
新規オブジェクトは、オブジェクト作成領域１１０に割り当てる。エイジング領域１１１には、オブジェクト作成領域１１０においてマイナーコレクションを行った結果生存したオブジェクトを再配置する。旧世代ヒープ１０１には、エイジング領域１１１において一定ガベージコレクションサイクル後もアクセス可能であった生存オブジェクトを再配置する。
【００１２】
オブジェクト作成領域１１０には新規オブジェクト１２０を割り当てる。オブジェクト作成領域１１０におけるマイナーコレクションの結果、オブジェクト１２０がアプリケーションプログラムからアクセス可能であった場合には、オブジェクト１２０をエイジング領域１１１のオブジェクト１３０として再配置し、ポインタを更新する。再配置の結果、オブジェクト作成領域１１０のオブジェクト１２０は無効になり、アプリケーションプログラムからは、再配置先のオブジェクト１３０が参照される。エイジング領域１１１のオブジェクト１３０が一定ガベージコレクションサイクル後もアクセス可能であった場合には、旧世代ヒープ１０１のオブジェクト１４０として再配置する。再配置後、再配置先のオブジェクト１４０がアプリケーションプログラムから参照される。
【００１３】
図２は、ヒープを３世代に論理分割する世代別ガベージコレクションシステムの別の例を示す。図中、２００はヒープ、２０１は第０世代ヒープ、２０２は第１世代ヒープ、２０３は第２世代ヒープを示す。２１０、２１１、２１２はオブジェクトを示し、同じ内容を含む。第０世代ヒープ２０１には、新規オブジェクトを割り当てる。第１世代ヒープ２０２には、第０世代ヒープにおいて少なくともＮ（Ｎは１から４までの整数値）ガベージコレクションサイクルの間生存したオブジェクトを再配置する。第２世代ヒープ２０３は、システム中で最も古いオブジェクトを保持しており、第１世代ヒープ２０２において少なくともＮ（Ｎは１から４までの整数値）ガベージコレクションサイクルの間生存したオブジェクトを再配置する。通常Ｎは１に設定する。
【００１４】
第０世代ヒープ２０１には新規オブジェクト２１０を割り当てる。一定ガベージコレクションサイクル後、第０世代ヒープ２０１のオブジェクト２１０がアプリケーションプログラムからアクセス可能であった場合には、オブジェクト２１０を第１世代ヒープ２０２のオブジェクト２１１として再配置する。再配置の結果、第０世代ヒープ２０１のオブジェクト２１０は無効になり、アプリケーションプログラムからは、再配置先のオブジェクト２１１が参照される。第１世代ヒープ２０２のオブジェクト２１１が一定ガベージコレクションサイクル後もアクセス可能であった場合には、第２世代ヒープ２０３のオブジェクト２１２として再配置する。再配置後、アプリケーションプログラムからはオブジェクト２１２が参照される。
【００１５】
上述の世代別ガベージコレクション方法については、以下に示す従来例が公知である。
【００１６】
例えば、特開平１１−１５１８０２号公報では、マルチプロセッサ環境において、世代別ガベージコレクションを行う方法が記載されている。ガベージコレクションをマルチプロセッサ環境で行うために、特定プロセッサが世代別ガベージコレクションを行う条件を検出し、条件が成立する場合、複数のプロセッサはその特定プロセッサからの指示に従いプログラム処理を停止し、一斉に世代別ガベージコレクションを行う。複数のプロセッサは、ガベージコレクションが終了したことを検出すると、通常のプログラム処理を再開する。世代別ガベージコレクションでは、図１に示すヒープを旧世代と新世代の２グループに論理的に分割し、新世代をさらに作成領域とエイジング領域に分割する方法を用いる。マイナーコレクション時、作成領域内の各オブジェクトがアプリケーションプログラムからアクセス可能であるかどうかを識別し、アクセス可能であった作成領域内の生存オブジェクトはエイジング領域に再配置される。エイジング領域のオブジェクトで、Ｎ（Ｎは１から４までの整数値）ガベージコレクションサイクル後もアクセス可能であるオブジェクトは、旧世代ヒープに再配置される。（第１の公知例）
ＵＳＰ  ５，６５２，８８３では、世代別ガベージコレクション方法とコンサバティブガベージコレクションのアプローチを融合することにより、マイナーコレクション時に生存するオブジェクトを正確に識別するための手法が記載されている。メモリはスタックとヒープを含み、ヒープは新世代と旧世代に論理分割され、それぞれにはポインタにより識別される新規オブジェクトと古いオブジェクトを割り当てる。スタックはそのエントリに、オブジェクトへのポインタである可能性があるものを保持する。
【００１７】
オブジェクトへのポインタである可能性があるものを保持するとは以下の理由による。例えば、あるオブジェクトがオブジェクトへの参照とｖａｌｕｅ値の構造体として定義されている場合、オブジェクトを参照するときに、中身がポインタである場合とｖａｌｕｅ値である場合がある。コンサバティブガベージコレクションでは、ポインタの場合もｖａｌｕｅ値である場合もアクセス可能であると認識する。その結果、ガベージコレクション時に生存したオブジェクトを圧縮して別のメモリ領域に移す場合に、オブジェクトのポインタでないものはアドレスが分からないので移動することが出来ない。そこで、ここで述べている従来手法では、オブジェクトへのポインタである可能性のあるものとは通常とは別管理とすることで、アクセス可能かどうかを正確に切り分け、問題を解決する手法を用いている。
【００１８】
また、新世代ヒープのルーツからたどることのできない旧世代ヒープから新世代ヒープのオブジェクト参照をサポートするために、リメンバーリストを設ける。リメンバーリストには、新世代ヒープ内のオブジェクトへのポインタを持つ旧世代ヒープのオブジェクトを登録する。ガベージコレクション時に、スタックおよびリメンバーリスト経由でアクセス可能なオブジェクトは生存オブジェクトとして識別する。この方式では、ガベージコレクション時、ガベージコレクションの対象となるオブジェクトがアクセス可能かどうかを、新世代ヒープのルーツを用いるだけでなく、スタックエントリおよびリメンバーリストを用いて判断することにより、より正確に生存オブジェクトを識別する。マイナーコレクションでは、上記手法により識別した生存オブジェクトをより古い世代に再配置する。（第２の公知例）
ＵＳＰ  ６，２２６，６５３  Ｂ１では、リメンバーセットを用いて効率よく旧世代ヒープのオブジェクトから新世代ヒープのオブジェクトへの参照を行う世代別ガベージコレクション方法について記載されている。ここでは、図２に示すヒープを３世代に論理分割する方法を用いている。リメンバーセットは、第２の公知例と同様、新世代オブジェクトへのポインタを持つ旧世代オブジェクトを登録するために使用する。一旦、オブジェクトを旧世代ヒープに再配置すると、アプリケーションプログラムがそのオブジェクトをアクセスしなくなってもメジャーコレクション実行時までは回収されないため、旧世代ヒープを有効に利用することができない。そこで、旧世代ヒープに再配置するオブジェクト数を出来る限り削減することを目的として、新世代と旧世代の間に位置する中間世代を設け、各世代間での再配置のタイミングを遅らせ、旧世代へ再配置するオブジェクト数を削減する。（第３の公知例）
マイナーコレクションのオーバヘッドを削減する方法として、情報処理学会論文誌Ｖｏｌ．３８  Ｎｏ．４  ＡＰＲ．１９９７  ｐｐ．８３５−８４４「オブジェクトの生存率の理論的解析に基づいた世代別ガーベッジコレクション」では、マイナーコレクションにおいて、オブジェクトの生存率に基づきwatermarkと呼ぶ閾値を動的に変更する世代別ガベージコレクション方法が開示されている。ここでは、ヒープを旧世代と新世代の２グループに論理的に分割し、新世代を更に作成領域とエイジング領域に分割する方法を用いている。watermarkと呼ぶ閾値アドレスを作成領域中に設定することで、マイナーコレクション時に閾値より低いアドレスにあってアクセス可能なオブジェクトは旧世代ヒープに直接再配置し、閾値よりも高いアドレスにあってアクセス可能なオブジェクトは新世代ヒープのエイジング領域に再配置する。ここでは、watermarkをオブジェクトがどれくらい長く生存するかという理論計算に基づいてシステムが動的に設定する。（第４の公知例）
【００１９】
【発明が解決しようとする課題】
上記第１、第２および第３の公知例で記載されている世代別ガベージコレクション方法では、ほとんどのオブジェクトの生存期間は短く、かつ新しいオブジェクト程生存期間が短く、古いオブジェクト程生存期間も長いという前提をおいている。言い換えると、マイナーコレクションにおいて、再配置（コピー）の対象となる生存オブジェクトは少なく、結果として旧世代ヒープに再配置するオブジェクトも少ないことを前提としている。その前提の下、マイナーコレクションにおいて再配置の対象となる生存オブジェクトを正確に識別するための手法について記載されている。
【００２０】
ところが、ブロードバンド時代の企業情報システムでは、短期間に数多くのアプリケーションプログラムを開発する必要があるため、個々のアプリケーションプログラムをチューニングする時間が減少する。また、作成したアプリケーションプログラムを企業情報システム上で運用し始めると、運用を停止しメンテナンスすることは困難であるため、ほとんど変更されない。このような状況下で開発されたプログラムではオブジェクトの生存期間が長くなる。また、ブロードバンド時代の企業情報システムでは、アプリケーションプログラムをネットワーク経由でアクセスするため、本質的にオブジェクトの生存期間が長くなる。このようなオブジェクトの生存期間が長いプログラムでは、マイナーコレクションの結果アクセス可能と識別される生存オブジェクト数が多く、世代内あるいは世代間でのオブジェクトの再配置量、すなわちコピー量が多くなる。
例えば、上記第３の公知例のように０、１、２世代で構成される世代別ガベージコレクションにおいて、生存オブジェクトが多い場合、マイナーコレクションの対象となる新規オブジェクトのほとんどが第０世代から第１世代へと再配置され、さらにこれらのオブジェクトはそのまま第1世代から第２世代へと再配置される。あるいは、上記第１の公知例のように、新旧二つの世代で構成され、新世代がさらに作成領域とエイジング領域で構成される世代別ガベージコレクションでは、マイナーコレクション時にほとんどのオブジェクトが作成領域からエイジング領域に再配置され、さらにエイジング領域から旧世代領域へと再配置される。すなわち、大多数のオブジェクトが２回以上の再配置（コピー処理）を行うことになる。特に、マイナーコレクションにおけるアプリケーションプログラムの中断時間を最小にするため、コピー処理をアプリケーションプログラム本来の処理と並行して行うことがある。その結果、再配置により発生するコピー処理がアプリケーションプログラム本来の処理に悪影響を及ぼし、アプリケーションプログラムの性能が大きく低下する。上記第１、第２および第３の公知例では、マイナーコレクション時の生存オブジェクト数が少ないことを前提としているため、これらコピー処理によるアプリケーションプログラム処理への影響は小さいが、生存オブジェクト数が多いブロードバンド時代のアプリケーションプログラムでは、オブジェクトの世代間のコピー処理が増加し、結果としてアプリケーションプログラムの性能が低下してしまう。
【００２１】
第４の公知例について述べると以下のようである。従来技術ではガベージコレクション処理はプログラム処理を中断して行うことを前提に、オブジェクトがどのくらい長時間生存するかという理論的計算に基づきwatermarkの最適値を決定してガベージコレクションのオーバヘッドを削減する。ところが、現実はガベージコレクション処理によるプログラムの中断時間を最小にするため、ガベージコレクション処理のコピー処理部分はプログラム本来の処理と並行して行なわれる。この従来技術ではコピー処理がプログラム本来の処理と並行して行なわれることによるアプリケーションプログラムの処理性能の低下を考慮していないため、最適な閾値を決定することは難しい。また、閾値アドレスにより再配置先を変更するため、生成領域中のほとんどのオブジェクトが生存する場合にも閾値アドレスよりも上位アドレスに割り当てられたオブジェクトは新世代ヒープのエイジング領域に再配置されてしまい、コピー量を削減することが出来ない。
【００２２】
この問題点を解決するために、マイナーコレクションにおいてアクセス可能と識別されるオブジェクト数が多い場合、すなわち再配置の対象になるメモリブロックサイズが大きい場合には、オブジェクトの再配置先を変更し、コピー処理を削減する必要がある。
【００２３】
また、アプリケーションプログラムの性能低下の問題に対しては、アプリケーションプログラムを設計しなおし、不要なオブジェクトを生成しない、不必要なオブジェクトを解放する、オブジェクトを再利用するといったソースコードレベルのチューニングを行うことで対策可能である。ところが、ソースコードレベルのチューニングを行うと、プログラムの開発コストが増大してしまう。
【００２４】
この問題点を解決するために、マイナーコレクション時にアクセス可能と識別される生存オブジェクト数が多い場合でも、アプリケーションプログラムを改変することなく、アプリケーションプログラムの処理時間を削減する必要がある。
【００２５】
本発明の第１の課題は、ブロードバンド時代のアプリケーションプログラムの性能低下を防止するために、世代別ガベージコレクションのマイナーコレクションにおいて、アプリケーションプログラムからアクセス可能な生存オブジェクトが多い場合、そのオブジェクトの再配置処理（すなわちコピー処理）を削減する世代別ガベージコレクション方法を提供することにある。
【００２６】
本発明の第２の課題は、プログラマがアプリケーションプログラムのソースコードを改変することなく、オブジェクトの再配置先を変更するための閾値を設定できる世代別ガベージコレクションのパラメータ設定方法を提供することにある。
【００２７】
【課題を解決するための手段】
本発明の第１の課題は、世代別ガベージコレクションのマイナーコレクションにおける生存オブジェクト再配置プロセスを、少なくとも２回のマイナーコレクション間にアプリケーションプログラムが生成した新規オブジェクトのために、システムに要求して割り当てられたメモリサイズに対する、新規オブジェクトのうち生存するオブジェクトに割り当てられているメモリサイズの比率を算出するオブジェクト生存率算出プロセスと、オブジェクト生存率と閾値を比較するオブジェクト生存率比較プロセスと、オブジェクト生存率が閾値を超える場合に生存オブジェクトを旧世代ヒープに直接再配置する生存オブジェクト再配置プロセスで行うことで解決できる。
【００２８】
本発明の第２の課題は、第１の課題を解決する手段に加えて、アプリケーションプログラマがプログラムの実行時パラメータとして再配置先を変更するための閾値を設定する手段を設けることで解決できる。
【００２９】
【発明の実施の形態】
以下、本発明に係るメモリ管理方法について、図面を参照しながら詳細に説明する。
【００３０】
＜発明の実施の形態＞
図３に本発明の実施の形態におけるアプリケーションプログラムの開発フローを示す。アプリケーションプログラムの開発は、プログラム実行環境の構築（ステップ３０２）、プログラムのコーディング（ステップ３０３）、プログラムの静的パラメータの設定（ステップ３０４）、プログラムのコンパイル（ステップ３０５）、プログラムの実行時パラメータの設定（ステップ３０６）、プログラムの実行（ステップ３０７）、プログラムの評価（ステップ３０８）の順に行う。ステップ３０２は、複数のアプリケーションプログラムのコーディングを行う前に唯一度だけ行う。プログラマはプログラムの実行ファイルが完成するまでは、ステップ３０３、ステップ３０４、ステップ３０５の処理を繰り返す。プログラムの実行ファイル完成後は、ステップ３０６以降の処理を行うことができるが、プログラム実行し、ステップ３０８においてプログラムの評価を行った結果、処理性能が十分でない場合には、ステップ３０６あるいはステップ３０４に戻り様々なパラメータを設定し直してチューニングを行う。ステップ３０６あるいはステップ３０４においてチューニングを行っても処理性能が改善しない場合には、ステップ３０３に戻り、プログラムを再コーディングする。プログラムの実行ステップ３０７では、計算機システムのメモリリソースを用いてプログラムを実行するが、本発明の実施の形態ではプログラマがメモリを管理するのではなく、システムがヒープメモリを管理することを前提とする。また、ヒープメモリ管理では世代別ガベージコレクションを用いる。
【００３１】
本発明の実施の形態における世代別ガベージコレクションを行うヒープメモリの概略構成を図４に示す。ヒープメモリ４００は旧世代ヒープ４０１と新世代ヒープ４０２で構成される。これら２つは論理的に分割されている。またヒープメモリ４００は、管理領域４０３を持つ。新世代ヒープ４０２は最新オブジェクトを保持するオブジェクト作成領域４１０とエイジング領域４１１で構成される。オブジェクト作成領域４１０には新規オブジェクトを割り当てる。エイジング領域４１１には、オブジェクト作成領域４１０内の生存するオブジェクトを再配置する。旧世代ヒープ４０１には、エイジング領域４１１内の生存オブジェクトを再配置する。
【００３２】
管理領域４０３は、ヒープ管理情報４２０や実行時パラメータ４２１等を管理する領域である。ヒープ管理情報４２０には、システムがヒープメモリ管理を行うのに必要な各種管理情報を保持する。実行時パラメータ４２１は、プログラマが実行時に設定するものであり、具体的にはプログラム実行開始時のヒープメモリサイズや、新世代ヒープサイズ等である。ここで、ヒープメモリ管理や実行時パラメータ等を管理する領域を世代別ヒープとは別の領域に設けているが、世代別ヒープ内部に設けてもよい。本発明の実施例ではヒープを２世代に論理分割したヒープを用いた場合のガベージコレクション方法について説明しているが、図２のように３世代に論理分割したヒープにも適用可能である。第0世代、第1世代、第２世代のように３つの世代に論理分割したヒープの場合、第０世代はオブジェクト作成領域４１０、第１世代はエイジング領域４１１、第２世代は旧世代ヒープ４０１に対応する。
【００３３】
図４に示すヒープメモリ４００の構成および管理情報の管理方法については、従来の技術と同じ手法で実現できるため、詳細説明を省略する。本発明の実施の形態では、管理領域４０３が従来のヒープ管理情報に加えてオブジェクト生存率を記録し、プログラマが実行時パラメータとしてオブジェクト生存率の閾値を設定する。また、設定した閾値を管理領域４０３の実行時パラメータ４２１に保持する。
【００３４】
次に図４のヒープメモリ４００を管理するヒープメモリ管理プロセスを図５に示す。ヒープメモリ管理プロセスは、オブジェクト割り当てプロセス５０２とガベージコレクションプロセス５０６で構成する。ガベージコレクションプロセス５０６は、マイナーコレクションプロセス５０７とメジャーコレクションプロセス５０８からなる。アプリケーションプログラム実行時、プログラムが新規オブジェクトを生成するために、メモリ割り当て要求をシステムに発行すると、システムはヒープメモリ管理プロセスを起動する（５０１）。次に、オブジェクト割り当てプロセス５０２は、新規オブジェクトをヒープの空きメモリブロックに割り当てる。オブジェクト割り当てプロセス５０２は、従来と同じ手法により実現可能であるため、ここでは詳細を説明しない。
【００３５】
プロセス５０３では、新規オブジェクトにメモリブロックを割り当てる場合に、ヒープが不足してないかどうかを判定する。ヒープが足りている場合には、新規オブジェクトにメモリブロックを割り当て、メモリ管理プロセスを終了する（５０４）。プロセス５０３においてヒープが足りない場合には、ガベージコレクションプロセス５０６を起動する。ここで、ガベージコレクションプロセス５０６を実行するプログラム部をガベージコレクタとも言う。
【００３６】
ガベージコレクションプロセス５０６を起動するにあたって、世代別ガベージコレクションを行うため、プロセス５０５により新世代ヒープに空きがあるかどうかを判定する。新世代ヒープに空きがある場合には、マイナーコレクションプロセス５０７を起動する。新世代ヒープに空きがない場合には、メジャーコレクションプロセス５０８を起動する。
【００３７】
マイナーコレクションプロセス５０７は、新世代ヒープに割り当てた新規オブジェクトが一定のメモリサイズに達するか、あるいはガベージコレクションプロセス５０６を実行した後一定の時間が経過した場合に起動する。マイナーコレクションプロセス５０７は、新世代ヒープのガベージコレクション対象のメモリブロックに割り当てた新規オブジェクト群について、アプリケーションプログラムがアクセス可能なオブジェクトを識別し、アクセス可能な生存オブジェクトは別の世代に移動し、アクセスできないオブジェクトに割り当てたメモリブロックを解放する。
【００３８】
メジャーコレクションプロセス５０８は、ヒープメモリに割り当てた少なくとも旧世代のオブジェクトについて、本例ではヒープメモリに割り当てた全てのオブジェクトについて、アプリケーションプログラムからアクセス可能かどうかを識別し、アクセス不可能なオブジェクトに割り当てたメモリブロックを解放する。メジャーコレクションプロセス５０８は、生存オブジェクトがまとまったメモリブロックに配置されるように、メモリ割り当ての最適化も行う。
【００３９】
マイナーコレクションプロセス５０７あるいはメジャーコレクションプロセス５０８によりメモリブロックを解放する。解放後、再度オブジェクト割り当てプロセス５０２により、新規オブジェクトにメモリブロックを割り当て、メモリ管理プロセスを終了する（５０４）。
【００４０】
本発明の実施の形態では、マイナーコレクションプロセス５０７の処理フローが従来の技術とは異なる。
【００４１】
図６にマイナーコレクションプロセス５０７の処理フローを示す。マイナーコレクションプロセス５０７は、ポインタ位置特定プロセス６０２と生存オブジェクト再配置プロセス６０３とポインタ位置更新プロセス６０４で実現する。
【００４２】
ポインタ位置特定プロセス６０２は、マイナーコレクションプロセス５０７起動時に、アプリケーションプログラムからアクセス可能なオブジェクトに対するポインタを特定するプロセスである。
【００４３】
生存オブジェクト再配置プロセス６０３は、マイナーコレクションの結果生存したオブジェクトを異なる世代のメモリブロックあるいは同じ世代の異なるメモリブロックに再配置するプロセスである。
【００４４】
ポインタ位置更新プロセス６０４は、アプリケーションプログラムが再配置先のオブジェクトをアクセスすることができるように、再配置した生存オブジェクトに対するポインタを更新するプロセスである。
【００４５】
本発明の実施の形態では、マイナーコレクションにおける生存オブジェクト再配置プロセス６０３が新規である。ポインタ位置特定プロセス６０２およびポインタ位置更新プロセス６０４は従来技術で実現できるため、ここでは詳細説明を省略する。
【００４６】
図７に、マイナーコレクションプロセスにおける生存オブジェクト再配置プロセス６０３の処理フローを示す。生存オブジェクト再配置プロセス６０３は、オブジェクト生存率算出プロセス７０２と、オブジェクト生存率比較プロセス７０３と、生存オブジェクト再配置プロセス７０４からなる。
【００４７】
オブジェクト生存率算出プロセス７０２は、オブジェクト生存率を算出するプロセスである。オブジェクト生存率比較プロセス７０３は、オブジェクト生存率算出プロセス７０２で算出したオブジェクト生存率が高いかどうかを判定する。生存オブジェクト再配置プロセス７０４は、オブジェクト生存率比較プロセス７０３の結果に従い、生存オブジェクトの再配置先を変更するプロセスである。
【００４８】
本発明の実施の形態では、マイナーコレクションにおける生存オブジェクト再配置プロセス６０３がオブジェクト生存率算出プロセス７０２およびオブジェクト生存率比較プロセス７０３および生存オブジェクト再配置プロセス７０４からなる。さらに、生存オブジェクト再配置プロセス７０４がオブジェクト生存率比較プロセス７０３の実行結果に従って動作する。
【００４９】
図８に、生存オブジェクト再配置プロセス６０３の処理フローの詳細を示す。生存オブジェクト再配置プロセス６０３は、オブジェクト生存率を算出するプロセス８０２と、オブジェクト生存率が閾値を超えているかどうかを判定するプロセス８０３と、オブジェクト生存率が閾値を超えている場合に生存オブジェクトを新世代ヒープ４０２のオブジェクト作成領域４１０から旧世代ヒープ４０１にダイレクトに再配置するプロセス８０４と、オブジェクト生存率が閾値以下である場合には従来の技術と同じ手法を用いて新世代ヒープのオブジェクト作成領域４１０の生存オブジェクトを新世代ヒープ４０２のエイジング領域４１１に再配置するプロセス８０５からなる。
【００５０】
プロセス８０２は、オブジェクト生存率を算出する。オブジェクト生存率は、マイナーコレクション間で新規オブジェクトを割り当てた新世代ヒープメモリサイズと新規オブジェクトのうち生存するオブジェクトが割り当てられたメモリサイズの比率である。新規オブジェクトに割り当てたメモリが一定サイズに達するたびにマイナーコレクションプロセス５０７を起動する場合、オブジェクト生存率の分母にあたる新規オブジェクトを割り当てるメモリサイズは一定である。一方、マイナーコレクションプロセスを一定時間毎に起動する場合には、プログラムの処理内容によりオブジェクト生存率の分母にあたるメモリサイズはかわりうる。プロセス８０２で算出するオブジェクト生存率は図４に示す管理領域４０３に記録する。オブジェクト生存率は現在処理中のマイナーコレクションプロセスでのみ使用するため、テンポラリ領域に記録してもよい。
【００５１】
プロセス８０３で使用する閾値Ｘは、図３に示すプログラム開発フローの中の実行時パラメータ設定ステップ３０６により、プログラマがプログラムの実行時パラメータとして設定する。プログラム実行が開始されると、これらの実行時パラメータは図４に示すヒープメモリ４００の管理領域４０３に記録される。プロセス８０３では、あらかじめ設定した閾値と、プロセス８０２によりマイナーコレクション毎に新しく算出するオブジェクト生存率を比較する。
【００５２】
本発明の実施の形態では、オブジェクト生存率をマイナーコレクション間で新規オブジェクトを割り当てた新世代ヒープメモリサイズと新規オブジェクトのうち生存するオブジェクトが割り当てられたメモリサイズの比率として算出している。オブジェクト生存率は、生存オブジェクトが割り当てられるメモリのサイズあるいは生存オブジェクト数でもよい。同様に、閾値もオブジェクト生存率と同様に比率として設定しているが、生存オブジェクトが割り当てられるメモリのサイズあるいは生存オブジェクト数でもよい。また、本発明の実施の形態では、現在マイナーコレクションの対象となるヒープメモリに関する生存オブジェクトの情報に基づきオブジェクト生存率を算出しているが、過去の履歴に基づいてオブジェクト生存率を算出してもよい。その場合は、生存オブジェクト再配置プロセス６０３においてオブジェクト生存率算出プロセス７０２を行わなくとも、ヒープメモリの管理領域４０３に記録したオブジェクト生存率に基づいて生存オブジェクトを再配置すればよい。
【００５３】
本発明の実施の形態では、マイナーコレクションにおける生存オブジェクトの再配置プロセス６０３を、オブジェクト生存率を算出するプロセス８０２と、オブジェクト生存率が閾値を超えているかどうかを判定するプロセス８０３と、判定結果に従って、プロセス８０４あるいはプロセス８０５の処理を行い、生存オブジェクトの再配置先を変更する。
【００５４】
また、本発明の実施の形態では、プロセス８０２で算出するオブジェクト生存率およびプロセス８０３で使用する閾値を管理領域４０３に保持する。また、プロセス８０３で使用する閾値をプログラマがプログラムの実行時パラメータとして設定する。また、プログラマが実行時パラメータとして設定したオブジェクト生存率の閾値を管理領域４０３に保持する。
【００５５】
図９は、図５に示すメジャーコレクションプロセス５０８の処理フローを示す。メジャーコレクションプロセス５０８は、ポインタ位置特定プロセス９０２と、生存オブジェクト再配置プロセス９０３と、ポインタ位置更新プロセス９０４で実現する。
【００５６】
生存オブジェクト再配置プロセス９０３は、ヒープ全体についてアプリケーションプログラムからアクセス可能なオブジェクトを識別し、プロセス９１０によりアクセス可能な生存オブジェクトを再配置する。メジャーコレクションプロセス５０８は、従来の技術と同じ方法で実現できるため、ここでは詳細説明を省略する。
【００５７】
次に本発明の実施の形態における世代別ガベージコレクションの処理フローについて各図を用いて説明する。
【００５８】
図３にプログラム開発のフローを示す。プログラマがアプリケーションプログラムを開発する場合、まずステップ３０２のプログラム実行環境を構築する。次に、アプリケーションプログラムをコーディングし（３０３）、プログラムの静的パラメータを設定し（３０４）、プログラムをコンパイルする（３０５）。コンパイルが終了すると、プログラムを実行する。プログラマはプログラムの実行に先立ち、実行時パラメータを設定する。実行時パラメータの設定（３０６）において、ヒープサイズや新世代ヒープサイズ等を設定し、同時にオブジェクト生存率の閾値を設定する。
【００５９】
本発明では、プログラマは実行時パラメータの設定において、オブジェクト生存率の閾値を設定する。
【００６０】
図１０にプログラム実行時におけるマイナーコレクション回数とオブジェクト生存率の推移の例を示す。本発明の実施の形態では、プログラマが実行時パラメータとしてオブジェクト生存率の閾値を７５％に設定する。プログラマは図３に示すステップ３０７により、閾値を含む実行時パラメータを用いてプログラムを実行する。プログラム実行が開始されると、プログラムはシステムのヒープメモリを使用して処理を進める。プログラムが新規オブジェクトにメモリを割り当てる場合、システムに対してメモリ割り当て要求を発行する。システムはプログラムからメモリ割り当て要求を受けとると、メモリ管理プロセスを起動して新規オブジェクトにヒープのメモリブロックを割り当てる。図５にメモリ管理プロセスの処理フローを示す。システムがメモリ管理プロセスを起動すると（５０１）、オブジェクト割り当てプロセス５０２を行う。
【００６１】
オブジェクト割り当てプロセス５０２は、新規オブジェクトを図４に示す新世代ヒープ４０２の中のオブジェクト作成領域４１０に割り当てる。プログラムの処理が進み、新規オブジェクトを割り当てるためのオブジェクト作成領域４１０が満杯になると、システムは図５に示すガベージコレクションプロセス５０６を起動する。プロセス５０５の結果、新世代ヒープ４０２にはまだ空きがあるため、1回目のマイナーコレクションプロセス５０７を起動する。
【００６２】
次に、図５、図６、図８を用いて、マイナーコレクションプロセス５０７の処理フローについて説明する。図５に示すように、システムがマイナーコレクションプロセス５０７を起動すると、まずポインタ位置特定プロセス６０２を起動する。図６に示すポインタ位置特定プロセス６０２は、新世代ヒープ４０２のオブジェクト作成領域４１０に割り当てた新規オブジェクトがアプリケーションプログラムからアクセス可能かどうかを識別する。次に、システムは生存オブジェクト再配置プロセス６０３を起動する。生存オブジェクト再配置プロセス６０３は、図８に示すオブジェクト生存率算出プロセス８０２により、オブジェクトの生存率を算出する。オブジェクト生存率はオブジェクト作成領域４１０のメモリサイズに対するオブジェクト作成領域４１０に割り当てた新規オブジェクトのうち生存するオブジェクトの比率である。図１０に示すように、1回目のマイナーコレクションのオブジェクト生存率は５０％、すなわちオブジェクト作成領域４１０の新規オブジェクトのうち半分がアクセス可能、であるから、図４の管理領域４０３にオブジェクト生存率を記録する。
【００６３】
次に、オブジェクト生存率比較プロセス８０３は、図４の管理領域４０３に記録したオブジェクト生存率と図４に示すヒープメモリ４００の管理領域４０３に記録しているオブジェクト生存率の閾値とを比較する。オブジェクト生存率の閾値は、図１０に示すようにプログラムの実行開始時にプログラマにより７５％と設定されているため、1回目のマイナーコレクションではオブジェクト生存率は閾値以下である。閾値以下であるため、比較結果はＮＯとなる。そして、プロセス８０５により、従来の技術と同様な方法でオブジェクト作成領域４１０の生存オブジェクトをエイジング領域４１１に再配置する。エイジング領域４１１に再配置した生存オブジェクトは数マイナーコレクションサイクル後、旧世代ヒープ４０１に再配置される。
【００６４】
生存オブジェクト再配置プロセス６０３の実行後は、再配置先のオブジェクトをアプリケーションプログラムがアクセスできるように、図６に示すポインタ位置更新プロセス６０４を用いて、生存オブジェクトのポインタ位置を更新して1回目のマイナーコレクションプロセス５０７を終了する。その後、プロセス５０２によりオブジェクトをヒープに割り当て、メモリ管理プロセスを終了する。
【００６５】
システムがプログラムからのメモリ割り当て要求に応答すると、オブジェクトにメモリブロックが割り当てられ、プログラムは次の処理を行うことができる。プログラムが次の処理において再度メモリ割り当て要求をシステムに発行すると、システムは再度メモリ管理プロセスを起動し、同様の処理を行う。メモリ管理プロセスはオブジェクト割り当てプロセス５０２により新規オブジェクトをヒープメモリに割り当てる。プロセス５０３において割り当てるメモリブロックが不足すると、新世代ヒープには空きがあるため、1回目のマイナーコレクションと同様に、マイナーコレクションプロセス５０７を起動する。図１０に示すように２回目のマイナーコレクションでも、オブジェクト生存率は５０％であり、一方オブジェクト生存率の閾値は７５％であるため、生存オブジェクト再配置プロセス６０３では、図８に示すプロセス８０５により従来の技術と同様にオブジェクト作成領域４１０の生存オブジェクトをエイジング領域４１１に再配置して、２回目のマイナーコレクションを終了する。
【００６６】
続いてプログラムがメモリ割り当て要求をシステムに発行すると、システムは再度メモリ管理プロセスを起動する。図５に示すメモリ管理プロセスはオブジェクト割り当てプロセス５０２により新規オブジェクトをオブジェクト作成領域４１１に割り当てる。システムは、オブジェクト作成領域４１１がいっぱいになると、ガベージコレクションプロセス５０６を起動する。新世代ヒープにはまだ空きがあるため、３回目のマイナーコレクションプロセス５０７を起動する。３回目のマイナーコレクションプロセス５０７では、最初に図６に示すポインタ位置特定プロセス６０２により生存オブジェクトのポインタ位置を特定する。次に、生存オブジェクト再配置プロセス６０３を行う。
【００６７】
生存オブジェクト再配置プロセス６０３では、図８に示すオブジェクト生存率算出プロセス８０２においてオブジェクト生存率を算出する。図１０に示すように、３回目のマイナーコレクションでは、オブジェクト生存率は９０％である。
【００６８】
オブジェクト生存率比較プロセス７０３は、プロセス８０３により、プロセス８０２で求めたオブジェクト生存率と閾値Ｘを比較する。オブジェクト生存率は９０％、オブジェクト生存率の閾値Ｘは７５％であり、比較結果はＹＥＳとなる。そこで、プロセス８０４において、オブジェクト作成領域４１０の生存オブジェクトを隣接するエイジング領域４１１ではなく、旧世代ヒープ４０１に再配置する。旧世代ヒープ４０１に再配置したオブジェクトは、図５に示すメジャーコレクションプロセス５０８が起動されるまでは再配置の対象にはならない。その後、図６に示すポインタ位置更新プロセス６０４により再配置したオブジェクトのポインタ位置を更新して、マイナーコレクションプロセス５０７を終了し、メモリ管理プロセスを終了する。図１０に示すようにプログラムの処理が進むにつれ、マイナーコレクションプロセス５０７も複数回起動するが、３回目のマイナーコレクションから１０回目のマイナーコレクションにおいては、継続してオブジェクト生存率が閾値を超えるため、図８に示す生存オブジェクト再配置プロセス７０４では、プロセス８０４によりオブジェクト作成領域４１０の生存オブジェクトを旧世代ヒープ４０１に直接再配置する。１１回目のマイナーコレクションでは、オブジェクト生存率が閾値よりも低い。図８に示すプロセス８０３の比較結果はＮＯとなるため、生存オブジェクト再配置プロセス７０４のプロセス８０５により、オブジェクト作成領域４１０内の生存オブジェクトを隣接するエイジング領域４１１に再配置する。エイジング領域４１１に再配置したオブジェクトは、従来の技術と同様な方法を用いて数マイナーコレクションサイクルの後、旧世代ヒープ４０１に再配置される。
【００６９】
本発明の実施の形態によれば、世代別ガベージコレクションを用いたヒープメモリの管理方法において、マイナーコレクションを行う場合に、生存するオブジェクトの比率が高い場合には生存オブジェクトをマイナーコレクションの対象となるオブジェクト作成領域から旧世代ヒープに直接再配置することにより、生存オブジェクトが多い場合に問題となるエイジング領域から旧世代ヒープへのオブジェクト再配置により発生するコピー処理を削減することができる。また、旧世代ヒープへ直接再配置するための条件をプログラマが実行時パラメータとして設定することができるため、ソースプログラムを再コーディングしなくても、プログラムに最適な閾値を設定することができ、プログラム開発コストを削減し、かつプログラムの処理時間を削減することができる。以上が本発明にかかわる実施の形態である。
【００７０】
（実施の形態の変形例１）
本発明の変形例では、図７のオブジェクト生存率比較プロセス７０３において、生存オブジェクトの再配置先をオブジェクト生存率だけでなく継続カウンタに従って決定する。
【００７１】
継続カウンタには、複数回のマイナーコレクションに渡ってオブジェクト生存率が閾値を超えた回数を記録する。また、何回か継続してオブジェクト生存率が閾値を超えた場合にのみ、生存オブジェクトの再配置先を変更するように継続カウンタの閾値を設定する。継続カウンタおよび継続カウンタの閾値はそれぞれ図４のヒープメモリ４００の管理領域４０３に保持する。継続カウンタの閾値はプログラムの実行時に実行時パラメータとして設定できるようにする。また、継続カウンタの値は０で初期化し、またプログラマが継続カウンタの閾値を設定しない場合には、あらかじめ０に設定しておく。
【００７２】
変形例１では、図２に示すヒープメモリを３世代に論理分割した世代ヒープを用いる。システムはヒープメモリを、第0世代、第１世代、第２世代の３つに分割して管理する。第０世代ヒープは図４のオブジェクト作成領域４１０に対応し、最新のオブジェクトを割り当てる。第1世代ヒープは図４のエイジング領域４１１に対応し、第０世代ヒープで生存したオブジェクトを再配置する。第２世代ヒープは旧世代ヒープに対応し、最も古いオブジェクトを割り当てる。マイナーコレクションは通常第０世代ヒープに対して行われ、第２世代ヒープはマイナーコレクションの対象にはならない。
【００７３】
図１１に、マイナーコレクションプロセス５０７における生存オブジェクト再配置プロセス６０３の詳細フローを示す。図６の生存オブジェクト再配置プロセス６０３は、まずプロセス１１０２でオブジェクト生存率を算出する。オブジェクト生存率は図８に示したオブジェクト生存率算出プロセス８０２と同じ方法で算出する。次にプロセス１１０３は、オブジェクト生存率とオブジェクト生存率の閾値Ｘを比較する。オブジェクト生存率が閾値Ｘを超えた場合には、プロセス１１０４において、継続カウンタＮCに１を加算する。加算の結果、継続カウンタＮCの上限を超える場合には、継続カウンタＮCの値は上限値のまま維持する。次に、プロセス１１０６において、継続カウンタＮCの値とカウンタ閾値Ｙを比較する。比較結果より、オブジェクト生存率が閾値Ｘを連続Ｙ回超えた場合にはＹＥＳとなり、プロセス１１０７により、第０世代ヒープの生存オブジェクトを第２世代ヒープに再配置する。プロセス１１０３の結果、オブジェクト生存率が閾値Ｘよりも小さい場合には、プロセス１１０５により継続カウンタＮCの値をリセットし、プロセス１１０８により従来の技術と同様に第０世代の生存オブジェクトを第１世代ヒープに再配置する。プロセス１１０３において、オブジェクト生存率が閾値Ｘを超えるがプロセス１１０６において継続カウンタＮCがカウンタ閾値Ｙ以下である場合には、比較結果がＮＯとなり、プロセス１１０８により従来の技術と同様な方法で第０世代の生存オブジェクトを第１世代ヒープに再配置する。システムは、Ｎマイナーコレクションサイクル後（通常Ｎは１から４までの整数値）、プロセス１１０８により再配置した第１世代ヒープの生存オブジェクトを第２世代ヒープに再配置する。プロセス１１０７により再配置した第２世代ヒープのオブジェクトはメジャーコレクションプロセスが起動されるまでは再配置の対象にはならない。
【００７４】
本発明の実施形態の変形例１では、生存オブジェクトの再配置先をオブジェクト生存率と継続カウンタにより変更する。
【００７５】
図１３（a）は、プログラム実行時のマイナーコレクション回数とオブジェクト生存率の関係を示す。プログラムを実行し、プログラムがシステムにメモリ割り当て要求を発行すると、システムは順次メモリ割り当てプロセスにより新規オブジェクトをヒープメモリに割り当てる。図１３（a）に示すプログラムでは、1、２回目のマイナーコレクションにおけるオブジェクト生存率は５０％であり、３回目から１０回目のマイナーコレクションにおけるオブジェクト生存率は９０％である。プログラマはプログラム実行時に実行時パラメータによりオブジェクト生存率の閾値Ｘを７５％、カウンタ閾値Ｙを３に設定する。
【００７６】
３回目のマイナーコレクションまでは、オブジェクト生存率は閾値Ｘよりも低いため、図１１のプロセス１１０３の結果はＮＯであり、プロセス１１０８により従来手法と同様に、第０世代の生存オブジェクトは第１世代に再配置される。３回目のマイナーコレクションでは、オブジェクト生存率は９０％であり閾値Ｘを超えている。プロセス１１０３の比較結果はＹＥＳとなり、プロセス１１０４において、継続カウンタＮＣの値をインクリメントする。継続カウンタＮＣの値は１である。プロセス１１０６では、継続カウンタＮＣの値とカウンタ閾値を比較する。カウンタ閾値Ｙは３であるため、比較結果はＮＯとなり、プロセス１１０８により従来と同じように第０世代ヒープの生存オブジェクトを第１世代ヒープに再配置する。４回目、５回目のマイナーコレクションも３回目と同様に行う。一方、６回目から１０回目のマイナーコレクションでは、オブジェクト生存率が９０％であり閾値Ｘを超える。プロセス１１０３の比較結果はＹＥＳとなる。プロセス１１０４において継続カウンタに１を加算する。６回目のマイナーコレクションでは、継続カウンタＮＣの値は４となる。７回目ではＮＣは５、８回目のＮＣは６となる。プロセス１１０６では、継続カウンタＮＣの値とカウンタ閾値Ｙを比較する。比較結果はＹＥＳとなり、プロセス１１０７により、従来技術とは異なり、第０世代ヒープの生存オブジェクトを第２世代ヒープに再配置する。生存オブジェクトの再配置先を、オブジェクト生存率と継続カウンタの両方を用いて制御することで、より効率よくヒープメモリを管理できる。本発明の実施の形態では、オブジェクト生存率が一回でも閾値を超えると生存オブジェクトの再配置先を変更していたが、変形例１では継続してオブジェクト生存率が高いプログラムの場合に生存オブジェクトの再配置先を変更するため、より効率よくヒープメモリを管理できる。
【００７７】
（実施の形態の変形例２）
本発明の変形例１では、図７のオブジェクト生存率比較プロセス７０３において、生存オブジェクトの再配置先をオブジェクト生存率だけでなく継続カウンタに従って決定していたが、本発明の変形例２では、オブジェクト生存率の閾値を２種類設ける。
【００７８】
オブジェクト生存率の閾値の一方は、継続カウンタの閾値を超えた場合にのみ生存オブジェクトの再配置先を変更するために使用する。もう一方は、本発明の実施例と同様、オブジェクト生存率が一回でも閾値を超えた場合に、継続カウンタの値には関係なく生存オブジェクトの再配置先を変更するために使用する。
【００７９】
オブジェクト生存率に関する２つの閾値および継続カウンタに関するカウンタ閾値は、それぞれプログラムの実行時に実行時パラメータとして設定する。また、それぞれの閾値はシステムが初期値を設定する。
【００８０】
本発明の変形例２では、システムが図４に示すヒープメモリを使用する。プログラムが新規オブジェクトにメモリブロックを割り当てる場合、システムに対してメモリ割り当て要求を発行する。システムは、メモリ割り当て要求を受け、新規オブジェクトを図４に示す新世代ヒープ４０２のオブジェクト作成領域４１０に割り当てる。オブジェクト作成領域４１０がいっぱいになると、システムはマイナーコレクションプロセス５０７を起動する。
【００８１】
図１２に、マイナーコレクションプロセス５０７における生存オブジェクト再配置プロセス６０３の詳細フローを示す。最初にプロセス１２０２において、オブジェクト生存率を算出する。オブジェクト生存率は図８に示したオブジェクト生存率を算出するプロセス８０２と同じ方法で算出する。次にプロセス１２０３においてオブジェクト生存率と閾値Ｘを比較する。オブジェクト生存率が閾値Ｘを超えた場合には、プロセス１２０４において、継続カウンタＮCに１を加算する。ＮCの値は、プログラム実行開始時に０に初期化する。加算の結果、継続カウンタ値がカウンタの上限を超える場合には、継続カウンタＮCの値を上限値にセットする。次に、プロセス１２０６において継続カウンタＮCの値とカウンタ閾値Ｙを比較する。比較結果より、オブジェクト生存率が閾値Ｘを連続Ｙ回超えた場合には、プロセス１２０８によりオブジェクト作成領域４１１の生存オブジェクトを旧世代ヒープに再配置する。プロセス１２０３において、オブジェクト生存率が閾値Ｘよりも小さい場合には、プロセス１２０５により継続カウンタＮCの値をリセットし、プロセス１２０８により従来の技術と同様にオブジェクト作成領域４１０の生存オブジェクトをエイジング領域４１１に再配置する。エイジング領域４１１に再配置したオブジェクトは、Ｎマイナーコレクションサイクル後（通常Ｎは１から４までの整数値）に旧世代ヒープ４０１に再配置される。プロセス１２０６において、オブジェクト生存率が閾値Ｘを超えるが継続カウンタＮCがカウンタ閾値Ｙ以下である場合には、プロセス１２０７においてオブジェクト生存率と閾値Ｚを比較する。比較の結果、オブジェクト生存率が閾値Ｚを超える場合には、プロセス１２０８によりオブジェクト作成領域４１０の生存オブジェクトを直接旧世代ヒープ４０１に再配置する。旧世代ヒープ４０１に再配置したオブジェクトは、メジャーコレクションプロセス５０８が起動されるまで再配置の対象にはならない。プロセス１２０７において、オブジェクト生存率と閾値Ｚを比較し、オブジェクト生存率が閾値Ｚ以下である場合には、プロセス１２０９により従来の技術と同様な方法で新世代ヒープ４０２のオブジェクト作成領域４１０の生存オブジェクトを新世代ヒープ４０２のエイジング領域４１１に再配置し、処理を終了する。
【００８２】
本発明の実施形態の変形例２では、生存オブジェクトの再配置プロセスを２種類のオブジェクト生存率の閾値と継続カウンタの閾値により制御することが新規である。
【００８３】
図１３（ｂ）は、プログラム実行時のマイナーコレクション回数とオブジェクト生存率の関係を示す。プログラムを実行し、プログラムがシステムにメモリ割り当て要求を発行すると、システムは順次メモリ割り当てプロセスにより新規オブジェクトを新世代ヒープのオブジェクト作成領域４１０に割り当てる。新規オブジェクトを割り当てたメモリブロックが一定のサイズになるか、一定の時間が経過すると、マイナーコレクションプロセスが起動される。図１３（ｂ）に示すプログラムの例では、１回目のマイナーコレクションにおけるオブジェクト生存率は５０％であり、２回目のマイナーコレクションにおけるオブジェクト生存率は９５％である。３回目と４回目のマイナーコレクションのオブジェクト生存率は再度５０％になり、５回目から１０回目のマイナーコレクションにおけるオブジェクト生存率は８０％である。プログラマはプログラムの実行時パラメータでオブジェクト生存率の閾値Ｘを７５％、閾値Ｚを９０％、カウンタ閾値Ｙを２に設定する。
【００８４】
１回目のマイナーコレクションでは、オブジェクト生存率は閾値Ｘよりも小さいため、図１２に示すプロセス１２０３による比較結果はＮＯとなり、プロセス１２０９によって、従来の技術と同様な方法でオブジェクト作成領域４１０の生存オブジェクトをエイジング領域に再配置する。エイジング領域に再配置した生存オブジェクトは、Ｎマイナーコレクションサイクル（Ｎは１から４までの整数値）後に旧世代ヒープに再配置される。２回目のマイナーコレクションでは、オブジェクト生存率が９５％であり閾値Ｚを超えている。図１２のプロセス１２０３による比較結果はＹＥＳ、継続カウンタ値は１、その結果プロセス１２０６による比較結果はＮＯ、プロセス１２０７による比較結果はＹＥＳとなる。オブジェクト生存率が第２の閾値Ｚを超える場合には継続カウンタに関係なく生存オブジェクトの再配置先を変更するため、プロセス１２０８によりオブジェクト作成領域４１０の生存オブジェクトを旧世代ヒープに再配置する。旧世代ヒープに再配置したオブジェクトは、プログラム処理が進みメジャーコレクションプロセスが起動されるまでは再配置されない。３回目および４回目のマイナーコレクションでは、オブジェクト生存率が５０％であり閾値Ｘより小さい。この場合は、プロセス１２０３による比較結果はＮＯとなり、カウンタの値はリセットされ、プロセス１２０９によりオブジェクト作成領域４１０の生存オブジェクトを従来の技術と同様な方法でエイジング領域４１１に再配置する。５回目のマイナーコレクションでは、オブジェクト生存率は８０％になる。プロセス１２０３により、オブジェクト生存率と閾値Ｘを比較する。その結果、オブジェクト生存率は閾値Ｘを超えているため、プロセス１２０７によりオブジェクト生存率と閾値Ｚを比較する。オブジェクト生存率は８０％、閾値Ｚは９０％である。比較結果はＮＯとなるため、プロセス１２０９により、新世代ヒープ４０２のオブジェクト作成領域４１０の生存オブジェクトを従来の方法と同様な方法で新世代ヒープ４０２のエイジング領域４１１に再配置する。一方、７回目から１０回目のマイナーコレクションでは、常にオブジェクト生存率が８０％であり閾値Ｘを超えているため、プロセス１２０３の比較結果はＹＥＳとなる。また毎回閾値Ｘを超えるため、継続カウンタの値は３、４、５のように増加する。次にプロセス１２０６において継続カウンタの値とカウンタ閾値を比較する。カウンタ閾値Ｙは２であるから、継続カウンタＮCの値がカウンタ閾値Ｙを超え、比較結果はＹＥＳとなる。プロセス１２０８によりオブジェクト作成領域４１０の生存オブジェクトを旧世代ヒープ４０１に再配置する。
【００８５】
変形例２では、オブジェクト生存率の閾値を２種類設け、突発的にオブジェクトの生存率が高くなる場合と、定常的にオブジェクト生存率が高い場合それぞれのケースに対応して、生存オブジェクトの再配置先を変更することが出来るため，プログラムの処理内容に合った木目細かなヒープメモリ管理が可能になる。
【００８６】
（実施の形態の変形例３）
本発明の実施の形態および変形例１および変形例２では、オブジェクト生存率および継続カウンタの閾値を、プログラマがプログラム実行時に実行時パラメータとして設定する。変形例３では、プログラマが図３のステップ３０２のプログラム実行環境を構築する時に閾値を設定する。あるいは、プログラマが図３のステップ３０４における静的パラメータの設定において閾値を設定してもよい。あるいはあらかじめ閾値を設定したプログラム実行環境をプログラマに提供することも可能である。また、プログラム実行中に閾値の設定を変更することも考えられる。
【００８７】
（実施の形態の変形例４）
本発明の変形例４では、図６の生存オブジェクト再配置プロセス６０３において、オブジェクト生存率が閾値を超えた場合には、生存オブジェクトを再配置せず、オブジェクト生存率が閾値以下の場合には従来技術と同様な方法で生存オブジェクトを再配置する。
【００８８】
図１４に生存オブジェクト再配置プロセスの詳細フローを示す。本発明の変形例４では、生存オブジェクト再配置プロセス７０４の動作が異なる。プロセス８０３において、プロセス８０２で算出したオブジェクト生存率と閾値Ｘを比較する。オブジェクト生存率が閾値Ｘを超える場合、比較結果がＹＥＳとなる。その場合には、プロセス１４０１により新世代ヒープ４０２のオブジェクト作成領域４１０の生存オブジェクトを移動せずに処理を終了する。一方、プロセス８０３における比較結果がＮＯの場合には、プロセス１４０２により、従来の技術と同様な方法でオブジェクト作成領域４１０からエイジング領域４１１に再配置する。プロセス１４０２により再配置した生存オブジェクトはＮマイナーコレクションサイクル後（通常Ｎは１から４までの整数値）に旧世代ヒープ４０１に再配置される。
【００８９】
以上のように、オブジェクト生存率が閾値よりも高い場合には、新世代ヒープのオブジェクト作成領域の生存オブジェクトを再配置しないため、再配置に伴うコピー処理を削減できる。オブジェクト生存率が高い場合には作成領域から他領域への再配置を行わないので作成領域がいっぱいになってオブジェクトにメモリ領域を割り当てられなくなることはありうる。その場合は、マイナーコレクションではなく、メジャーコレクションを行い空き領域を作成することになる。
【００９０】
本発明の変形例４では、世代別ヒープを新旧２世代で構成する例を示したが、図２に示す３世代で構成する世代ヒープを用いても同様に実現できる。この場合、オブジェクト作成領域を０世代に、エイジング領域を１世代に、旧世代ヒープを２世代に対応させればよい。
【００９１】
また、本発明の変形例４では閾値をオブジェクト生存率でのみ決定する例を示したが、変形例１および変形例２で示した方法で決定してもよい。
【００９２】
さらに、本発明の変形例４では、オブジェクト生存率をマイナーコレクション間で新規オブジェクトを割り当てた新世代ヒープのメモリサイズと新規オブジェクトのうち生存するオブジェクトが割り当てられたメモリサイズの比率として算出している。オブジェクト生存率は、生存オブジェクトが割り当てられるメモリのサイズあるいは生存オブジェクト数でもよい。同様に、閾値もオブジェクト生存率と同様に比率として設定しているが、生存オブジェクトが割り当てられるメモリのサイズあるいは生存オブジェクト数でもよい。また、本発明の実施の形態では、現在マイナーコレクションの対象となるヒープメモリに関する生存オブジェクトの情報に基づきオブジェクト生存率を算出しているが、過去の履歴に基づいてオブジェクト生存率を算出してもよい。その場合は、生存オブジェクト再配置プロセス６０３においてオブジェクト生存率算出プロセス７０２を行わなくとも、ヒープメモリの管理領域４０３に記録したオブジェクト生存率に基づいて生存オブジェクトを再配置すればよい。
【００９３】
本発明の実施の形態によれば、世代別ガベージコレクションのマイナーコレクションにおいて、アプリケーションプログラムからアクセス可能と識別される新規オブジェクトが多い場合には、新規オブジェクトを旧世代ヒープにダイレクトに再配置することにより、途中のコピー処理を削減し、アプリケーションプログラム本来の処理への影響を少なくして、アプリケーションプログラムの性能を向上できる。
【００９４】
また、アプリケーションプログラマがプログラムの実行時にオブジェクトの再配置先を変更するための閾値を明示的に設定することができるため、アプリケーション毎に最適な閾値を設定でき、ソースプログラムを改変しなくても、アプリケーションプログラムの処理時間を削減でき、プログラム開発コストを削減できる。
【００９５】
更に、第４の公知例と比較すると、本発明の実施の形態ではオブジェクト生存割合が高い場合にはマイナーコレクション時に生成領域の生存オブジェクトを直接旧世代ヒープに再配置することで新世代ヒープへのコピー処理を削減し、コピー処理がプログラム本来の処理に及ぼす影響を小さくして、アプリケーションプログラムの処理性能を改善できる。更には、オブジェクト指向プログラミングスタイルではプログラマがメモリ管理を行わないことを特徴とするため、プログラマが閾値をアドレスとして設定することは出来ない。一方、本発明の実施の形態ではアドレスとは独立したオブジェクトの生存割合と呼ぶ閾値を設け、プログラム実行時にプログラマが実行時パラメータとして閾値を設定する手段を持つことでソースプログラムを変更することなくアプリケーションプログラムの処理性能を改善できる。
【００９６】
【発明の効果】
本発明によればヒープのガベージコレクションにおけるコピー回数を削減し、アプリケーションの処理性能を改善することが出来る。
【図面の簡単な説明】
【図１】本発明の従来の技術における世代別ガベージコレクションのヒープメモリの概略構成１を示す図である。
【図２】本発明の従来の技術における世代別ガベージコレクションのヒープメモリの概略構成２を示す図である。
【図３】本発明の実施の形態におけるプログラマによるプログラム開発フローを示す図である。
【図４】本発明の実施の形態におけるヒープメモリの概略構成を示す図である。
【図５】本発明の実施の形態におけるメモリ管理プロセスの処理フローを示す図である。
【図６】本発明の実施の形態におけるマイナーコレクションプロセスの処理フローを示す図である。
【図７】本発明の実施形態における、マイナーコレクションプロセスの生存オブジェクト再配置プロセスの概略フローを示す図である。
【図８】本発明の実施の形態におけるオブジェクト生存率の閾値を利用した生存オブジェクト再配置プロセスの詳細フローを示す図である。
【図９】本発明の実施の形態における、ガベージコレクションプロセスのメジャープロセスの処理フローを示す図である。
【図１０】本発明の実施形態における、プログラム実行時のマイナーコレクション回数とオブジェクト生存率の推移を示す図である。
【図１１】本発明の実施形態の変形例１におけるオブジェクト生存率の閾値と継続カウンタの閾値を用いた生存オブジェクト再配置プロセスの詳細フローを示す図である。
【図１２】本発明の実施形態の変形例２における生存オブジェクト再配置プロセスの詳細フローを示す図である。
【図１３】本発明の実施形態の変形例における、プログラム実行時のマイナーコレクション回数とオブジェクト生存率の推移を示す図である。
【図１４】本発明の実施形態の変形例４におけるオブジェクト生存率の閾値を利用した生存オブジェクト再配置プロセスの詳細フローを示す図である。
【符号の説明】
１００…ヒープメモリ、１０１…旧世代ヒープ、１０２…新世代ヒープ、１１０…オブジェクト作成領域、１１１…エイジング領域、４０３…管理領域、４２０…ヒープ管理情報、４２１…実行時パラメータ、５０２…オブジェクト割り当てプロセス、５０６…ガベージコレクションプロセス、５０７…マイナーガベージコレクションプロセス、５０８…メジャーガベージコレクションプロセス、６０２…ポインタ位置特定プロセス、６０３…生存オブジェクト再配置プロセス、６０４…ポインタ位置更新プロセス、７０２…オブジェクト生存率算出プロセス、７０３…オブジェクト生存率比較プロセス、７０４…生存オブジェクト再配置プロセス。
【図１】
0004079684.tif 000002
【図２】
0004079684.tif 000003
【図３】
0004079684.tif 000004
【図４】
0004079684.tif 000005
【図５】
0004079684.tif 000006
【図６】
0004079684.tif 000007
【図７】
0004079684.tif 000008
【図８】
0004079684.tif 000009
【図９】
0004079684.tif 000010
【図１０】
0004079684.tif 000011
【図１１】
0004079684.tif 000012
【図１２】
0004079684.tif 000013
【図１３】
0004079684.tif 000014
【図１４】
0004079684.tif 000015