(57)【要約】      （修正有）【課題】コンピュータシステムに実装される世代別ガーベジコレクションにおいて各世代の仮想メモリ空間サイズを動的に調整可能にする。【解決手段】世代別ガーベジコレクション環境の準備・初期化処理において、全世代の仮想メモリ空間として単一の仮想メモリ空間を獲得し、当該単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように当該単一の仮想メモリ空間を各世代で分配する。世代別ガーベジコレクション処理において、世代間の仮想メモリ空間の配分を変更する。【選択図】図４
2007025914.tif 000002
【特許請求の範囲】
【請求項１】
世代別ガベージコレクション処理をコンピュータに実行させるための世代別ガベージコレクションプログラムであって、
前記世代別ガベージコレクション処理は、世代別ガベージコレクション環境の準備・初期化処理を含み、
当該世代別ガベージコレクション環境の準備・初期化処理は、
全世代の仮想メモリ空間として単一の仮想メモリ空間を獲得し、前記単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように前記単一の仮想メモリ空間を各世代で分配する処理を含む、
ことを特徴とする世代別ガベージコレクションプログラム。
【請求項２】
前記世代別ガベージコレクション環境の準備・初期化処理は、
前記単一の仮想メモリ空間において、実メモリがコミットされた空間が連続した空間として設けられ且つ実メモリがコミットされていない空間が存在する場合には当該空間が最新世代に設けられるように、前記単一の仮想メモリ空間に実メモリをコミットする処理を更に含む、
ことを特徴とする請求項１記載の世代別ガベージコレクションプログラム。
【請求項３】
前記世代別ガベージコレクション処理は、対象世代のガベージコレクション処理を更に含み、
当該対象世代のガベージコレクション処理は、
対象世代の仮想メモリ空間において不要オブジェクトの回収とプロモーションによる全ての生存オブジェクトの移動が終了した後に、前記対象世代と、前記生存オブジェクトの移動先世代である前記対象世代の次に古い世代との間の仮想メモリ空間の配分を変更する処理を含む、
ことを特徴とする請求項１又は２記載の世代別ガベージコレクションプログラム。
【請求項４】
前記対象世代のガベージコレクション処理は、
当該対象世代のガベージコレクション処理中において、プロモーションによる生存オブジェクトの移動に失敗した時は、前記失敗以後の生存オブジェクトの移動を中止すると共に、前記失敗以前に移動したオブジェクトへの参照を修復する処理を更に含む、
ことを特徴とする請求項３記載の世代別ガベージコレクションプログラム。
【請求項５】
前記世代別ガベージコレクション処理は、全世代のガベージコレクション処理を更に含み、
当該全世代のガベージコレクション処理は、
前記単一の仮想メモリ空間内の実メモリがコミットされている空間において各世代間にオブジェクトが存在しない空間が存在する場合には当該空間を不要オブジェクトで埋めるステップと、
前記単一の仮想メモリ空間内の実メモリがコミットされている空間に対しガベージコレクション処理を行うステップと、
前記単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように前記単一の仮想メモリ空間を各世代で再分配するステップと、
からなる処理を含む、
ことを特徴とする請求項２記載の世代別ガベージコレクションプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、世代別ガベージコレクション（generational garbage collection）を実装するコンピュータシステムにおいて仮想メモリ資源を有効に利用するための技術に関する。
【背景技術】
【０００２】
コンピュータシステムに実装されるメモリ管理機能の一つとしてガベージコレクション（以下「ＧＣ」という）がある。ＧＣは、プログラムが動的に確保したメモリ領域のうち不要になった領域を自動的に解放する機能である。ＧＣには、アルゴリズムに応じて、マーク・スイープ型、コピー型、トレイン型、並列型、コンカレント型など様々な種類があり、また、これらのアルゴリズムを複合的に用いるものとして世代別ＧＣがある。
【０００３】
世代別ＧＣは、アプリケーションプログラム（以下単に「アプリケーション」という）が利用するメモリ空間を分割し、オブジェクトの寿命（世代）によって分類することで、処理単位当たりの不要オブジェクトの回収効率を向上させるようにしたＧＣであり、短寿命のオブジェクトは回収される確率が高く、長寿命のオブジェクトは回収される確率が低いという特質を持っている。
【０００４】
この世代別ＧＣでは、仮想メモリ空間が世代毎に独立して割り当てられて処理が行われている。例えば新／旧２世代の世代別ＧＣの場合には、新／旧それぞれの世代に仮想メモリ空間が独立して割り当てられている。尚、世代別ＧＣに仮想メモリ空間の規定はないが、仮想メモリ空間が世代毎に独立して割り当てられているのが現状である。
【０００５】
世代別ＧＣに関し、例えば特許文献１には、動的変数に対する動的変数領域を確保する命令を含むソースプログラムを解析して、動的変数領域を複数の世代領域のいずれかに割り当てる際に、動的変数の生存に関する変数特性を分析して、割り当てる世代領域を決定する方法が記載されている。
【特許文献１】特開２００１−１８４２１９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
ところで、メモリアドレスが３２ビットで表現されるコンピュータシステムの場合、仮想メモリ空間は最大でも４ＧＢ（ギガバイト）までしか獲得することができない。但し、通常は、ＯＳ（operating system）やその他のコンピュータシステム、更には当該コンピュータシステム内の命令／データ／スタック域にも仮想メモリ空間が分配されるため、４ＧＢよりも小さくなるのが現実である。
【０００７】
例えば新／旧２世代の世代別ＧＣを実装するコンピュータシステムにおいて、仮に当該コンピュータシステムが仮想メモリ空間の全てを利用できるとすると、当該コンピュータシステムの初期化時に仮想メモリ空間を新世代に１ＧＢ，旧世代に３ＧＢ割り当てた場合には、運用中に旧世代に３ＧＢものメモリは不要かつ新世代に２ＧＢのメモリをコミット（実際に存在するメモリ資源を仮想メモリ空間に割り当てること）した方が処理効率が良くなると判断されたとしても、仮想メモリ空間が世代毎に独立して割り当てられているために、それを動的に再割り当てすることができなかった。そのため、このような場合には、当該コンピュータシステムの運用自体を再起動して仮想メモリ空間の再割り当てを行うか、又は非効率なまま現状の仮想メモリ空間の分配で処理を続行するしかなかった。これは、３世代以上の世代別ＧＣを実装するコンピュータシステムは勿論のこと、上記の特許文献１に記載のシステムも含め、同様に生じ得る問題である。
【０００８】
本発明は、上記実情に鑑み、コンピュータシステムに実装される世代別ＧＣにおいて各世代の仮想メモリ空間サイズを動的に調整可能にするための世代別ＧＣプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するため、本発明の一態様に係る世代別ＧＣプログラムは、世代別ガベージコレクション処理をコンピュータに実行させるための世代別ガベージコレクションプログラムであって、前記世代別ガベージコレクション処理は、世代別ガベージコレクション環境の準備・初期化処理を含み、当該世代別ガベージコレクション環境の準備・初期化処理は、全世代の仮想メモリ空間として単一の仮想メモリ空間を獲得し、前記単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように前記単一の仮想メモリ空間を各世代で分配する処理を含む、ことを特徴とする。
【００１０】
この世代別ＧＣプログラムによれば、前記単一の仮想メモリ空間内の各世代間の境界を動的に変動（浮動化）させることができ、各世代の仮想メモリ空間のサイズ調整が可能になる。
【発明の効果】
【００１１】
本発明によれば、コンピュータシステムに実装される世代別ＧＣにおいて各世代の仮想メモリ空間サイズを動的に調整することができるので、長寿命のオブジェクトが少ないときは新世代の仮想メモリ空間を大きくし、長寿命のオブジェクトが多くなったときに動的かつ連続的に旧世代の仮想メモリ空間を大きくすることができる。従って、従来のように各世代のメモリ利用頻度のバランスが崩れることにより未使用となる仮想メモリ空間が増大するということはなく、柔軟に各世代の仮想メモリ空間のサイズを調整することが可能になる。よって、世代別ＧＣを実装するコンピュータシステムにおいて、有限である仮想メモリ空間を効率良く利用することができる。
【発明を実施するための最良の形態】
【００１２】
以下、本発明の実施の形態を図面を参照しながら説明する。
図１は、本発明の一実施の形態に係る、コンピュータシステムに実装される世代別ＧＣによるガベージ・コレクタ処理の概要を示すフローチャートである。
【００１３】
尚、本処理は、当該コンピュータシステム内の、ＣＰＵとＲＯＭ等を有するメモリ管理部において、そのＣＰＵがそのＲＯＭに記憶されている本実施形態に係る世代別ＧＣプログラムを読み出し実行することにより、行われる処理である。
【００１４】
同図に示したように、本処理では、まず世代別ＧＣ環境の準備・初期化処理を行い（Ｓ１）、以降は、アプリケーションからのメモリ不足によるＧＣ要求に応じて、対応するＧＣ処理（Ｓ２）として、対象世代（メモリが不足した世代）のＧＣ処理（２ａ）、或いは、全体（全世代一括）のＧＣ処理（Ｓ２ｂ）を行う。
【００１５】
尚、詳しくはこれから説明するが、上記Ｓ１では各世代に同一の仮想メモリ空間を割り当てる処理等が行われ、上記Ｓ２ａではその同一の仮想メモリ空間における世代間のサイズ調整処理やプロモーション失敗の捕捉処理等が行われる。また、上記Ｓ２ｂではその同一の仮想メモリ空間において世代間の隙間を埋める処理や各世代のリサイズ処理等の、世代空間結合による最適化の処理等が行われる。以降の説明では、本発明の理解を容易にするため、これらの処理を従来の処理と比較しながら説明することにする。
【００１６】
まず、上記Ｓ１の世代別ＧＣ環境の準備・初期化処理について説明する。
世代別ＧＣでは、各世代の仮想メモリ空間をそれぞれ独立して管理できることを前提としている。そのため、従来の世代別ＧＣ環境の準備・初期化処理では、各世代に独立して仮想メモリ空間を割り当てていた。
【００１７】
図２は、従来の世代別ＧＣ環境の準備・初期化処理を示すフローチャートである。同図に示したように、本フローでは、ｎ＝１〜世代数（全世代数）として（Ｓ１０１）、それぞれのｎに対し、世代ｎに対するＧＣの仕様を決定する処理（Ｓ１０２）、世代ｎの領域サイズ（仮想メモリ空間サイズ）を決定する処理（Ｓ１０３）、世代ｎに仮想メモリ空間を割り当てる処理（Ｓ１０４）、及び、世代ｎに対する初期化処理（Ｓ１０５）を行う。
【００１８】
尚、Ｓ１０２では、マーク・スイープ型、コピー型、トレイン型、並列型、コンカレント型等のＧＣアルゴリズムや世代内部に閉じた仕様が決定される。また、Ｓ１０３乃至１０５では、Ｓ１０２で決定したＧＣの仕様に合わせて処理が行われる。また、Ｓ１０４では、世代ｎの仮想メモリ空間が静的に確定される。
【００１９】
このように、従来では完全に独立して各世代に対する処理が行われているため、各世代に割り当てられる仮想メモリ空間はそれぞれが独立して存在することになる。
図３は、図２に示した従来の世代別ＧＣ環境の準備・初期化処理により仮想メモリ空間が割り当てられたときのイメージ図である。尚、同図では、世代数を２として示しているが、３以上であっても同様である。
【００２０】
同図に示したように、従来の世代別ＧＣ環境の準備・初期化処理が行われると、各世代（世代１と世代２）に独立して仮想メモリ空間が割り当てられる。
同図において、Ｓｚ１、Ｓｚ２は、世代１、世代２に割り当てられた仮想メモリ空間のサイズ（最大メモリサイズ）を表している。また、Ｍ１、Ｍ２は、世代１、世代２の仮想メモリ空間にコミットされた実メモリ（実際に存在するメモリ資源）の領域、すなわち現在アプリケーションが利用可能なメモリ域を表している。尚、実際にアプリケーションによって利用される実メモリは、システム全体が利用するものであるため、必要とされるまでは仮想メモリ空間にコミットしないのが運用時の定石となっている。
【００２１】
このように、従来では、各世代に別々の仮想メモリ空間を割り当てているため、予め有限である仮想メモリ空間を各世代に分配した場合、アプリケーション実行中に、各世代の仮想メモリ空間において静的に決定される最大メモリサイズまで実メモリを増減させることは可能であっても、各世代の仮想メモリ空間を動的に増減させることは不可能である。従って、最適な仮想メモリ空間の分配ができずに不安定な運用をせざるを得ない場合があった。
【００２２】
これに対し、図１に示した上記Ｓ１の世代別ＧＣ環境の準備・初期化処理では、各世代の仮想メモリ空間を同一の仮想メモリ空間として実現するために次のような処理を行う。
図４は、上記Ｓ１の世代別ＧＣ環境の準備・初期化処理を示すフローチャートである。同図に示したように、本フローでは、まず、ｎ＝１〜世代数（全世代数）として（Ｓ１１）、それぞれのｎに対し、世代ｎに対するＧＣの仕様を決定する処理（Ｓ１２）、世代ｎの領域サイズ（仮想メモリ空間サイズ）を決定する処理（Ｓ１３）を行う。尚、Ｓ１２では、マーク・スイープ型、コピー型、トレイン型、並列型、コンカレント型等のＧＣアルゴリズムや世代内部に閉じた仕様が決定される。また、Ｓ１３では、Ｓ１２で決定したＧＣの仕様に合わせて処理が行われる。
【００２３】
そして、Ｓ１１乃至１３の処理が終了すると、続いて、全世代に同一の仮想メモリ空間を割り当てる（Ｓ１４）。具体的には、全世代の仮想メモリ空間として単一の仮想メモリ空間を獲得し、この単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように、この単一の仮想メモリ空間を各世代で配分する。これにより、各世代は同一の仮想メモリ空間を共有することになる。
【００２４】
続いて、ｎ＝１〜世代数（全世代数）として（Ｓ１５）、それぞれのｎに対し、世代ｎに対する初期化処理（Ｓ１６）を行う。尚、このＳ１６では、Ｓ１２で決定した世代ｎのＧＣの仕様に合わせて処理が行われ、また実メモリをコミットしない仮想メモリ空間については世代１（最新世代）に付加される。すなわち、Ｓ１４で獲得された単一の仮想メモリ空間において、実メモリがコミットされた空間が連続した空間として設けられ且つ実メモリがコミットされていない空間が存在する場合には当該空間が最新世代に設けられるように、その単一の仮想メモリ空間に実メモリがコミットされる。
【００２５】
このように、本フローによれば、世代毎に独立して仮想メモリ空間が獲得される従来の手法とは異なり、全世代の仮想メモリ空間として単一の仮想メモリ空間が獲得される。
図５は、図４に示した世代別ＧＣ環境の準備・初期化処理により仮想メモリ空間が割り当てられたときのイメージ図である。尚、図５では、世代数を３として示しているが、２又は４以上であっても同様である。
【００２６】
同図に示したように、図４に示した世代別ＧＣ環境の準備・初期化処理が行われると、全世代（世代１、世代２、及び世代３）に同一の仮想メモリ空間が割り当てられ、その単一の仮想メモリ空間が各世代に配分されることで、各世代の仮想メモリ空間が得られる。これにより、各世代間の仮想メモリ空間の境界を動的に変動させることが可能になる。
【００２７】
同図において、Ｓｚ０は、全世代に割り当てられた同一の仮想メモリ空間のサイズを表す。Ｓｚ１、Ｓｚ２、Ｓｚ３は、世代１、世代２、世代３に配分された仮想メモリ空間のサイズを表す。また、Ｍ１、Ｍ２、Ｍ３は、世代１、世代２、世代３に配分された仮想メモリ空間のそれぞれにコミットされた実メモリの領域、すなわち現在アプリケーションが利用可能なメモリ域を表している。尚、以降の説明においては、世代ｎの仮想メモリ空間において実メモリがコミットされている空間（領域）を世代空間ｎともいうことにする。よって、例えば同図のＭ１、Ｍ２、Ｍ３の空間は、世代空間１、世代空間２、世代空間３ともいう。Ｓｚｍ１、Ｓｚｍ２（＝Ｓｚ２）、Ｓｚｍ３（＝Ｓｚ３）は、世代１、世代２、世代３の仮想メモリ空間にコミットされた実メモリのサイズを表す。Ｓｚｖ１（＝Ｓｚ１−Ｓｚｍ１）は、世代１に配分された仮想メモリ空間において実メモリがコミットされていない空間のサイズを表す。尚、この実メモリがコミットされていない空間は形式的なものであり、単に、全世代に割り当てられた同一の仮想メモリ空間において実メモリをコミットしていない空間を世代１（最新世代）に付加しただけであり、全世代が共通に利用（拡張）可能な空間である。
【００２８】
ここで、各世代の仮想メモリ空間のサイズに関し従来と比較すると、従来では、図３に示したように、各世代の仮想メモリ空間のサイズの合計が仮想メモリ空間の使用サイズとなる。つまり、図２に示した従来の世代別ＧＣ環境の準備・初期化処理により決定した各世代の仮想メモリ空間のサイズはそれ以上動的に拡張することができない。例えば、図３において、Ｓｚ１＋Ｓｚ２＝１００ で、Ｓｚ１＝５０、ＳＺ２＝５０の場合、世代１の最大メモリサイズは５０、 世代２の最大メモリサイズは５０ となる。
【００２９】
これに対し、図４に示した世代別ＧＣ環境の準備・初期化処理によれば、図５に示したように、各世代間の境界は変動可能であり、任意の世代に仮想メモリ空間の全て（Ｓｚ０）を配分することが可能である。例えば、図５において、Ｓｚ１＋Ｓｚ２＋Ｓｚ３＝１００（＝Ｓｚ０）の場合、各世代の配分サイズは可変であるので、世代１の最大メモリサイズが１００となることもあるし、又は、世代２或いは世代３の最大メモリサイズが１００となることもある。但し、総和（Ｓｚ１＋Ｓｚ２＋Ｓｚ３）は常に１００である。
【００３０】
尚、図５においては、世代１を最新世代、世代３を最旧世代とし、同図左側を低アドレス側、同図右側を高アドレス側とした上で、より最新の世代ほど高アドレス側に配置するようにしているが、その理由は次のとおりである。つまり、より旧世代ほど長寿命のオブジェクトが存在する確率が高くなり回収効率が低下するので、ＧＣの度に長寿命のオブジェクトを移動させるのは性能面で損失となる。逆に、より新世代ほど短寿命のオブジェクトが存在する確率が高くなり回収効率が良くなるので、本来オブジェクトの移動が激しい。更に、低アドレス側のオブジェクトが移動した場合、そのオブジェクトより高アドレス側のオブジェクト全てに影響（移動）を与えることになる。そのため、より低アドレス側でのオブジェクトの移動頻度が少なく済むように、より長寿命のオブジェクトを低アドレス側へプロモーションさせる方が好都合である。このような理由から、より最新の世代ほど高アドレス側に配置するようにしている。
【００３１】
尚、プロモーションとは、生存オブジェクトを旧世代へ昇格させることをいい、物理的な移動を伴う。オブジェクトを移動する手段としては、この他にコンパクションによるスライド、コピーイングＧＣ／トレインＧＣによるコピー等がある。特にスライドを行う場合にも同様に低アドレス側へオブジェクトを移動させる方が好ましい。但し、世代内部に閉じて行うＧＣの仕様に依存するため一概には言い切れない場合もある。ここで、スライドとは、同世代空間内で生存オブジェクトを圧縮する方法であり、具体的にはフラグメンテーションを取除いて生存オブジェクトを低アドレス側へ詰めていくことである。
【００３２】
図６は、図４に示した世代別ＧＣ環境の準備・初期化処理により設けられた各世代空間における、生存オブジェクトの移動確率と世代間の境界の変動の関係を示す図である。尚、同図では、世代数を４として示しているが、２、３、又は５以上であっても同様である。また、同図においても、左側を低アドレス側、右側を高アドレス側とし、世代１から世代４へ向かうほど、より旧世代となっている。
【００３３】
同図に示したように、より新世代の世代空間ほど生存オブジェクトの移動確立が高くなるので、各世代空間間の境界ｂ１、ｂ２、ｂ３においては、高アドレス側（ｂ１側）の境界ほど変動頻度が高くなる。また、世代空間１と実メモリがコミットされていない空間との境界ｂ０においても、実メモリの追加・開放により、変動頻度が高くなる。
【００３４】
尚、上記説明では、より新世代ほど高アドレス側に配置するようにしているが、アドレスの高低を全く逆に捉えるならば、より新世代ほど低アドレス側に配置するようにしてもよく、つまり、オブジェクトの寿命（世代）に応じて配置すればよい。
【００３５】
次に、図１に示したＳ２ａの対象世代のＧＣ処理、及び、Ｓ２ｂの全体のＧＣ処理について説明する。
一般的に、世代別ＧＣでは、大きく次の２つの手段に分けて不要オブジェクトの回収が行われる。一つは任意の世代空間内のＧＣ（上記Ｓ２ａの対象世代のＧＣ処理が対応）であり、もう一つは全世代を一括して行うＧＣ（上記Ｓ２ｂの全体のＧＣ処理が対応）である。前者のＧＣは、アプリケーションが使用していた全ての不要オブジェクトを回収することはできないが、ＧＣ対象が狭いので処理コストが小さくすみ、逆に、後者のＧＣは、その時点の全ての不要オブジェクトを回収することができるが、ＧＣ対象が広く処理コストが大きいという特徴を有している。前者のＧＣでは、処理の結果、世代空間間のサイズのバランスが崩れる（＝不安定）場合がある。このようになると、後者のＧＣをせざるを得ない状態となり性能面で不利である。そこで、前者のＧＣでは、このような状態にならないよう世代空間のサイズを調整する必要がある。
【００３６】
ある世代空間がＧＣ対象となって、不要オブジェクトが回収され、生存オブジェクトがより旧世代の世代空間にプロモーションされたとき、プロモーション先の世代空間の利用可能なサイズが減少する。
【００３７】
図７は、従来の対象世代のＧＣ処理によりプロモーションが行われたときのイメージ図である。尚、同図では、世代数を２として示しているが、３以上の場合であっても部分的にみると２世代の関係（世代１⇔世代２，世代２⇔世代３，…）として表現可能であるので、ここでは世代数を２として説明する（以降の図８乃至図１０においても同じ）。
【００３８】
図７に示したように、ＧＣ対象世代を世代ｎとし、世代ｎの世代空間に対しＧＣ処理が行われて、不要オブジェクトが回収され、生存オブジェクトがより旧世代の世代ｎ＋１の世代空間へプロモーションされると、世代ｎ＋１の世代空間の利用可能な領域（空き領域）のサイズが減少する。
【００３９】
ここで、世代空間のサイズ調整を考えると、従来では各世代に割り当てられる仮想メモリ空間が独立して存在しているために、各世代の世代空間のサイズ調整は各世代で独立して行うことができる。よって、世代ｎ＋１の世代空間を拡張させたり（但し、割り当てられている仮想メモリ空間の範囲内）、世代ｎの世代空間を縮退させたりと、各世代において独立して世代空間のサイズ調整が可能である。
【００４０】
これに対し、図８は、図１に示したＳ２ａの対象世代のＧＣ処理によりプロモーションが行われたときのイメージ図である。
同図に示したように、ＧＣ対象世代を世代ｎとし、世代ｎの世代空間に対しＧＣ処理が行われて、不要オブジェクトが回収され、生存オブジェクトがより旧世代の世代ｎ＋１の世代空間へプロモーションされると、世代ｎ＋１の世代空間の利用可能な領域（空き領域）のサイズが減少する。
【００４１】
ここで、世代空間のサイズ調整を考えると、世代ｎと世代ｎ＋１の世代空間が連続して存在しているために、各世代の世代空間のサイズ調整を各世代で独立して行うことができない。よって、世代ｎ＋１の世代空間の拡張を行う場合には、それと同時に同サイズだけ世代ｎの世代空間を縮退させるといった世代空間間でのサイズ調整が必要となる。
【００４２】
一般的に、ＧＣ対象の世代ｎの世代空間に対しＧＣ処理を行う場合、次回の世代ｎの世代空間に対するＧＣ処理以後も同様に、世代ｎの全オブジェクトが生存してもプロモーションが可能となるように、世代ｎ＋１の世代空間の空き領域のサイズが、世代ｎの世代空間のサイズ以上となるように、世代ｎ＋１の世代空間のサイズを拡張する。但し、ＧＣ対象の世代ｎの世代空間に対しＧＣ処理を行ったときの生存オブジェクトの総量は、通常、その世代空間全体のごく一部に相当するので、予めそのサイズ（生存率）を推測することができるならば、世代ｎ＋１の世代空間の空き領域のサイズとして、世代ｎの世代空間分用意しなくともよいことになる。図１に示したＳ２ａの対象世代のＧＣ処理では、これを、後述するプロモーション失敗の捕捉処理により可能にしている。
【００４３】
図９は、図１に示したＳ２ａの対象世代のＧＣ処理を示すフローチャートと、その処理中の仮想メモリ空間のイメージを示す図である。
同図のフローに示したように、アプリケーションからの要求により、世代ｎに対し世代空間内ＧＣが発動されると、まず、世代空間ｎに対しＧＣ処理を行う（Ｓ２１）。このＳ２１では、世代空間ｎにおいて、不要オブジェクトの回収とプロモーションが行われ、またプロモーションに失敗したときには後述のプロモーション失敗の捕捉処理が行われる。
【００４４】
続いて、世代空間ｎのＧＣ対象空間に生存オブジェクトが残っているか否かを判定する（Ｓ２２）。ここで、ＧＣ対象空間とは、世代空間ｎが単一のヒープ空間である場合には世代空間ｎそれ自身を示し、世代空間ｎが複数のヒープ空間を有する場合にはＧＣ対象となった任意のヒープ空間を示す。
【００４５】
尚、世代空間のＧＣの仕様としてＧＣ対象空間の生存オブジェクトを全てプロモーションさせるとしているならばＳ２２の判定は常にＮｏ（偽）となるので、この判定処理は不要である。
【００４６】
Ｓ２２の判定において、その判定結果がＹｅｓの場合にはＳ２３乃至２６の処理をスキップし、Ｎｏの場合にはそのＳ２３乃至２６の処理である世代空間間のサイズ調整処理を行う。
【００４７】
詳しくは、まず、上記Ｓ２１でのプロモーションによる世代空間ｎから世代空間ｎ＋１への生存オブジェクトの移動率Ｋを次式（１）により計算する（Ｓ２３）。
Ｋ＝Ｍ／Ｓn  （１）
ここで、Ｍは、プロモーションにより世代空間ｎから移動した生存オブジェクトのサイズである。Ｓnは、世代空間ｎのサイズである。但し、世代空間ｎが複数の領域（ヒープ空間）を有する場合には、ＧＣ対象となったヒープ空間のサイズを示す。
【００４８】
続いて、世代空間ｎと世代空間ｎ＋１とにおける空きスペース（空き領域サイズ）Ｆを次式（２）により計算する（Ｓ２４）。
Ｆ＝Ｓn＋（Ｓn+1−Ａ−Ｍ）  （２）
ここで、Ｓn+1は、世代空間ｎ＋１のサイズである。Ａは、以前から蓄積されているオブジェクトのサイズである。
【００４９】
続いて、過去ｘ回分の移動率Ｋ1~x（Ｋ1は今回の計算値Ｋを示す）のうち最悪値(最大値)を求め、安全率を乗じて世代空間の配分率Ｐとする（Ｓ２５）。この場合、配分率Ｐは次式（３）により計算される。但し、配分率Ｐは、上下限を予め設定し、その範囲を超えない値とする。例えば上下限を１０〜１００％とした場合、配分率Ｐはその範囲に収まるようにする。
【００５０】
Ｐ＝（Ｋ1~xの最悪値）＊安全率  （３）
ここで、ｘは、過去の移動率を経験値として覚えておくための個数であり、例えば３〜５個程度でよい。また、安全率は、通常、１．５程度でよい。安全率がより小さいほど効率良くヒープ空間を活用でき、より大きいほど次回の世代空間内のＧＣ処理が成功する確率が上がるようになる。尚、失敗した場合は、全体のＧＣが発動される。
【００５１】
続いて、Ｓ２４で計算された空きスペースＦを、世代ｎ＋１：世代ｎ＝Ｐ：１となるように配分し、世代空間間の境界を移動して仮想メモリ空間の再分配を行う（Ｓ２６）。この場合、世代空間ｎのサイズＳnは式（４）により計算され、世代空間ｎ＋１のサイズＳn+1は次式（５）により計算される。
【００５２】
Ｓn＝Ｆ＊１／（１＋Ｐ）  （４）
Ｓn+1＝Ｆ＊Ｐ／（１＋Ｐ）＋Ａ＋Ｍ  （５）
尚、上記Ｓ２１において、後述するプロモーション失敗の捕捉処理を行わない場合には、Ｐ／１＝１（１００％）となる。
【００５３】
ところで、プロモーションが行われる際に、プロモーション先の世代空間に必要十分な空き領域が必要であることは既に述べた。もし空き領域が不足している場合には、それは世代空間内のＧＣ処理が失敗することを示す。従って、失敗する以前にプロモーション先の世代空間内のＧＣ若しくは全体のＧＣを発動し、プロモーション先の世代空間に必要十分な空き領域を用意しておく必要がある。そうしないとアプリケーションがメモリ不足で停止してしまうからである。
【００５４】
図１０は、従来の対象世代のＧＣ処理におけるプロモーションによる世代空間の変動を示すイメージ図である。
同図に示したように、ＧＣ対象世代を世代ｎとして、１回目のＧＣ処理（ＧＣ＃１），２回目のＧＣ処理（ＧＣ＃２），３回目のＧＣ処理（ＧＣ＃３），…といった具合にＧＣ処理の毎に、プロモーション先である世代ｎ＋１の世代空間の空き領域サイズが常に世代ｎの世代空間のサイズ分用意されていれば、それは世代ｎのＧＣ処理が成功することを意味する。
【００５５】
本来、プロモーション先の世代空間の空き領域はＧＣ対象の世代に存在する生存オブジェクトの量だけあればよいが、ＧＣ処理を開始する前に生存オブジェクトの量を予め正確に見積ることは不可能である。そのため、図１０に示したように、従来においては最悪値（＝安全値）である１００％のオブジェクトが生存しても問題無いように、世代ｎの世代空間と同等のサイズだけ空き領域として確保している。
【００５６】
これに対し、図９に示したＳ２１の世代空間のＧＣ処理では、プロモーション先の世代空間の空き領域が不足した場合に、ＧＣ対象世代となっているオブジェクトへの参照関係を一貫して修復し、そのまま継続して、より旧世代の世代空間内ＧＣや全体のＧＣを発動させるプロモーション失敗の捕捉処理を行うことが可能になっている。そのため、プロモーション先に用意する空き領域は過去統計的にプロモーションされた生存オブジェクトの割合を乗じたサイズでよく、つまり、過去にＧＣ対象世代の世代空間の５％がプロモーションされていたなら、せいぜい空き領域はＧＣ対象世代の世代空間の５〜１０％程度用意しておけばよいことになる。仮に、プロモーション先の空き領域が不足して世代空間のＧＣ処理が失敗したとしても、ＧＣ対象世代となっているオブジェクトへの参照関係を修復できるからである。よって、上記Ｓ２１の世代空間のＧＣ処理では、ＧＣ対象世代の世代空間と同サイズの空き領域をプロモーション先の世代空間に用意する必要が無くなり、世代空間のメモリ領域使用効率が向上するためＧＣ処理の発生頻度を低下させることができる。
【００５７】
図１１は、このプロモーション失敗の捕捉処理を含む、図９に示したＳ２１の世代空間のＧＣ処理を示すフローチャートである。
同図に示したように、世代空間内ＧＣが発動され世代空間ｎに対しＧＣ処理が行われているときに、プロモーション先の世代空間ｎ＋１の空き容量が不足してプロモーションに失敗すると、プロモーション失敗の捕捉処理（Ｓ３１）を行う。
【００５８】
プロモーション失敗の捕捉処理（Ｓ３１）では、プロモーションの関数（クロージャ）を次のように更新して処理を行う。つまり、プロモーション失敗以後は、検出される生存オブジェクトの移動を中止すると共に、プロモーション失敗以前に検出された(移動済みの)生存オブジェクトへの参照を移動先へ更新する。
【００５９】
そして、プロモーション失敗の捕捉処理（Ｓ３１）が終了すると、処理が復帰し、続いてプロモーションに失敗が在ったか否かを判定し（Ｓ３２）、その判定結果がＹｅｓの場合には全体のＧＣを発動して後述の図１６に示す全体のＧＣ処理へ移行し、Ｎｏの場合には前述の図９に示したＳ２２へ移行する。
【００６０】
このような処理により、プロモーション先の空き領域が不足したとしても、アプリケーションを停止させることなく処理を続行することが可能になる。
尚、世代空間内のＧＣ処理におけるプロモーションの形態は、オブジェクトの移動タイミングにより、逐次移動型（コピーイングＧＣ等）と一括移動型（マークスイープＧＣ等）の２つに分けられる。逐次移動型では、生存オブジェクトが検出された時点で同時にオブジェクトを移動するので、プロモーションが失敗した時点で移動済みのオブジェクトへの参照を修復する必要がある。一方、一括移動型では、生存オブジェクトを全て検出した後に一括してオブジェクトを移動するので、オブジェクトが移動する前にプロモーションに失敗するか否かを判定できるため参照関係の修復は不要である。従って、上記のプロモーション失敗の捕捉処理（Ｓ３１）では、世代空間内のＧＣ処理におけるプロモーションの形態が逐次移動型の場合には上記のとおり処理を行うが、それが一括移動型の場合にはそのまま何もせずに処理が復帰する。
【００６１】
ここで、上記の逐次移動型プロモーションの基本的な概念を、図１２に示すイメージ図を用いて説明する。
同図において、ＧＣ対象を世代ｎ、プロモーション先を世代ｎ＋１とすると、逐次移動型のプロモーションでは、まず、（ａ）アプリケーションが利用中のオブジェクトへの参照の集合であるルート群に存在する参照フィールドＲから参照されるオブジェクトＯを検出する。続いて、（ｂ）そのオブジェクトＯが既に世代ｎ＋１へ移動済みであるならば、参照フィールドＲを移動先Ｏ´への参照に書き換える。或いは、（ｃ）そのオブジェクトＯが未だ世代ｎ＋１へ移動していないならば、世代ｎ＋１の世代空間に移動先Ｏ´として領域を獲得し、そこへオブジェクトＯを移動すると共に、参照フィールドＲを移動先Ｏ´への参照に書き換える。そして、（ｄ）ルート群に未処理の参照フィールドが無くなるまで、上記（ａ）〜（ｃ）を繰り返す。このように、逐次移動型では、生存オブジェクトが検出された時点で同時にオブジェクトの移動が行われる。
【００６２】
尚、世代空間ｎ＋１の空き領域が不足した時点で、プロモーション失敗の捕捉処理をする前に、世代空間ｎ＋２〜最旧世代空間の空き領域へのプロモーションを試みてもよい。
次に、図１に示したＳ２ｂの全体のＧＣ処理について説明する。
【００６３】
従来の全体のＧＣ処理においては、各世代が異なる仮想メモリ空間に割り当てられているために、同一のＧＣ仕様に則って世代空間毎に繰り返し処理をせざるを得ない。
図１３は、従来の全体のＧＣ処理の実行形態を説明する図である。
【００６４】
同図に示したように、例えば世代数を３とした場合、従来の全体のＧＣ処理では、同一のＧＣ仕様に則って、まず世代１の世代空間に対するＧＣ処理を実行し、続いて世代２の世代空間に対するＧＣ処理を実行し、そして世代３の世代空間に対するＧＣ処理を実行するといった具合に、世代１乃至３のそれぞれの世代空間毎に繰り返しＧＣ処理をせざるを得ない。
【００６５】
これに対し、図１に示したＳ２ｂの全体のＧＣ処理では、各世代空間が同一の仮想メモリ空間を共有するため、同一のＧＣ仕様、且つ単一のメモリ空間としてＧＣ処理を行うことができ、ＧＣ処理の単純化、効率化を図ることができる。
【００６６】
図１４は、上記Ｓ２ｂの全体のＧＣ処理の実行形態を説明する図である。
同図に示したように、例えば世代数を３とした場合、同一のＧＣ仕様に則って、且つ、世代１、世代２、世代３の各世代空間からなる単一のメモリ空間としてＧＣ処理を行うことができる。
【００６７】
尚、同図において、Ｓｚｍ０は、世代１、世代２、世代３の各世代空間からなる単一のメモリ空間のサイズである。Ｓｚｍ１、Ｓｚｍ２、Ｓｚｍ３は、世代１、世代２、世代３の世代空間（実質空間）のサイズ（仮想メモリ域）である。Ｓｚ１は、世代１の仮想メモリ空間（仮想メモリ域）のサイズである。Ｓｚｖ１は、世代１の仮想メモリ空間において実メモリがコミットされていない空間、すなわち、全世代に割り当てられた単一の仮想メモリ空間における未使用領域であって、意味的には各世代が共通に獲得できる拡張域である。
【００６８】
但し、上記Ｓ２ｂの全体のＧＣ処理では、各世代空間を単一のメモリ空間として扱うために、各世代空間間に存在する実装依存の調整領域を不要オブジェクトであるかのようにみせかけて、アプリケーションに使用されるオブジェクトを全てアドレス的に連続させる必要がある。そうしないと、上記Ｓ２ｂの全体のＧＣ処理において、生存オブジェクトを検出するためにメモリ空間を横断（トラバース）することができないからである。尚、実装依存の調整領域とは、アプリケーションが使用しなかったメモリ領域、すなわちオブジェクトが存在しない領域であり、本明細書中ではこれを「隙間」ともいう。
【００６９】
図１５は、世代空間間の隙間を不要オブジェクトで埋めるときのイメージ図である。
同図に示したように、世代空間間の隙間であるフラグメントを不要オブジェクトで埋めることにより、各世代空間を単一のメモリ空間として扱うことが可能になり、上記Ｓ２ｂの全体のＧＣ処理において生存オブジェクトを検出するために各世代空間を横断することが可能になる。尚、世代空間間の隙間を埋める不要オブジェクトとしては、例えばｉｎｔ型配列等が考えられる。
【００７０】
図１６は、図１に示したＳ２ｂの全体のＧＣ処理を示すフローチャートと、その処理中の仮想メモリ空間のイメージを示す図である。
同図に示したように、アプリケーションからの要求により、或いは図１１のＳ３３にて、全体のＧＣが発動されると、まず、上述したように各世代空間間の隙間を不要オブジェクトで埋める（Ｓ４１）。尚、各世代のＧＣの仕様上、世代空間内に複数の領域を持つ場合は、各領域間の隙間も同様に埋める。
【００７１】
続いて、各世代空間間の境界を解除し（Ｓ４２）、全体のＧＣ処理を行う（Ｓ４３）。尚、このＳ４３では、同一のＧＣの仕様に依存し、例えば一般的に多用されるマーク・スイープ型ＧＣが用いられる。
【００７２】
続いて、利用可能なヒープ空間のサイズを決定し、そのサイズに応じて実メモリをコミット或いは実メモリの一部をアンコミットする（仮想メモリ空間から実メモリの一部を開放する）（Ｓ４４）。具体的には、利用可能なヒープ空間のサイズを、生存オブジェクトの総サイズＬに世代数（全世代数）ｎを乗じたサイズとして、ヒープ空間を拡張または縮退する。尚、世代数ｎの代わりに別の値を乗じてもよい。例えば同一世代内に複数のヒープ空間を持つ場合には全ヒープ空間内に存在するヒープ空間の総数としたり、単に√（２ｎ）や固定値４としたりしてもよい。
【００７３】
続いて、世代空間の境界設定、すなわち仮想メモリ空間の再分配を行う（Ｓ４５）。具体的には、図１に示したＳ１の世代別ＧＣ環境の準備・初期化処理で行われる仮想メモリ空間の割り当てと同様に各世代のＧＣ仕様に合わせて仮想メモリ空間を再分配する。このとき、生存オブジェクトは最旧世代空間へ移動させ、実メモリがコミットされていない領域（アンコミット域）は最新世代空間として扱う。尚、この再分配では、例えば、Ｓ４４で決定したヒープサイズｎ×Ｌを各世代で均等に分配してもよいし、或いは、図９に示した対象世代のＧＣ処理で説明したように過去統計的に世代空間間のサイズ調整を行って再分配してもよい。
【００７４】
尚、本実施例において、図１に示したガベージ・コレクタ処理は、汎用的なコンピュータで実施させることも可能である。そのためには、このガベージ・コレクタ処理をコンピュータに行わせる上記世代別ＧＣプログラムをそのコンピュータで読み取り可能な記録媒体（記憶媒体）に予め記憶させておき、その記録媒体からその世代別ＧＣプログラムを読み出させてそのコンピュータのメインメモリに一旦格納させた後に、そのコンピュータの有する中央処理装置に、その格納されたプログラムを読み出させて実行させるように構成すればよい。
【００７５】
上述した世代別ＧＣプログラムを格納し、且つそれをコンピュータで読み取ることの可能な記録媒体の例を図１７に示す。このような記録媒体としては、例えば、コンピュータ１の本体に内蔵若しくは外付けされる半導体メモリやハードディスク装置などのメモリ２、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＭＯ（光磁気ディスク）、フレキシブルディスクなどといった可搬型記憶媒体３、あるいはコンピュータ１と回線４で接続されていてコンピュータ１がプログラムをダウンロードすることの可能なプログラムサーバ５の記憶装置６などがあるが、これらのいずれであってもよい。
【００７６】
以上、本発明について詳細に説明したが、本発明は上記実施形態に限定されず、本発明の要旨を逸脱しない範囲において、各種の改良及び変更を行っても良いのはもちろんである。
【００７７】
（付記１）
世代別ガベージコレクション処理をコンピュータに実行させるための世代別ガベージコレクションプログラムであって、
前記世代別ガベージコレクション処理は、世代別ガベージコレクション環境の準備・初期化処理を含み、
当該世代別ガベージコレクション環境の準備・初期化処理は、
全世代の仮想メモリ空間として単一の仮想メモリ空間を獲得し、前記単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように前記単一の仮想メモリ空間を各世代で分配する処理を含む、
ことを特徴とする世代別ガベージコレクションプログラム。
【００７８】
（付記２）
前記世代別ガベージコレクション環境の準備・初期化処理は、
前記単一の仮想メモリ空間において、実メモリがコミットされた空間が連続した空間として設けられ且つ実メモリがコミットされていない空間が存在する場合には当該空間が最新世代に設けられるように、前記単一の仮想メモリ空間に実メモリをコミットする処理を更に含む、
ことを特徴とする付記１記載の世代別ガベージコレクションプログラム。
【００７９】
（付記３）
前記世代別ガベージコレクション処理は、対象世代のガベージコレクション処理を更に含み、
当該対象世代のガベージコレクション処理は、
対象世代の仮想メモリ空間において不要オブジェクトの回収とプロモーションによる全ての生存オブジェクトの移動が終了した後に、前記対象世代と、前記生存オブジェクトの移動先世代である前記対象世代の次に古い世代との間の仮想メモリ空間の配分を変更する処理を含む、
ことを特徴とする付記１又は２記載の世代別ガベージコレクションプログラム。
【００８０】
（付記４）
前記対象世代のガベージコレクション処理は、
当該対象世代のガベージコレクション処理中において、プロモーションによる生存オブジェクトの移動に失敗した時は、前記失敗以後の生存オブジェクトの移動を中止すると共に、前記失敗以前に移動したオブジェクトへの参照を修復する処理を更に含む、
ことを特徴とする付記３記載の世代別ガベージコレクションプログラム。
【００８１】
（付記５）
前記世代別ガベージコレクション処理は、全世代のガベージコレクション処理を更に含み、
当該全世代のガベージコレクション処理は、
前記単一の仮想メモリ空間内の実メモリがコミットされている空間において各世代間にオブジェクトが存在しない空間が存在する場合には当該空間を不要オブジェクトで埋めるステップと、
前記単一の仮想メモリ空間内の各世代間の境界を解除するステップと、
前記単一の仮想メモリ空間内の実メモリがコミットされている空間に対しガベージコレクション処理を行うステップと、
前記単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように前記単一の仮想メモリ空間を各世代で再分配するステップと、
からなる処理を含む、
ことを特徴とする付記２記載の世代別ガベージコレクションプログラム。
【００８２】
（付記６）
前記再分配するステップでは、
生存オブジェクトが最旧世代の仮想メモリ空間に存在し、且つ、前記単一の仮想メモリ空間内の実メモリがコミットされていない空間が最新世代の仮想メモリ空間に設けられるように再分配が行われる、
ことを特徴とする付記５記載の世代別ガベージコレクションプログラム。
【００８３】
（付記７）
世代別ガベージコレクション処理をコンピュータに実行させるための世代別ガベージコレクションプログラムを記憶したコンピュータで読み取り可能な記憶媒体であって、
前記世代別ガベージコレクション処理は、世代別ガベージコレクション環境の準備・初期化処理を含み、
当該世代別ガベージコレクション環境の準備・初期化処理は、
全世代の仮想メモリ空間として単一の仮想メモリ空間を獲得し、前記単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように前記単一の仮想メモリ空間を各世代で分配する処理を含む、
ことを特徴とする世代別ガベージコレクションプログラムを記憶したコンピュータで読み取り可能な記憶媒体。
【００８４】
（付記８）
世代別ガベージコレクション処理を行う世代別ガベージコレクション方法であって、
前記世代別ガベージコレクション処理は、世代別ガベージコレクション環境の準備・初期化処理を含み、
当該世代別ガベージコレクション環境の準備・初期化処理では、
全世代の仮想メモリ空間として単一の仮想メモリ空間を獲得し、前記単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように前記単一の仮想メモリ空間を各世代で分配する工程、
を行うことを特徴とする世代別ガベージコレクション方法。
【００８５】
（付記９）
世代別ガベージコレクション手段を有する世代別ガベージコレクション装置であって、
前記世代別ガベージコレクション手段は、世代別ガベージコレクション環境の準備・初期化手段を含み、
当該世代別ガベージコレクション環境の準備・初期化手段は、
全世代の仮想メモリ空間として単一の仮想メモリ空間を獲得し、前記単一の仮想メモリ空間内に各世代の仮想メモリ空間が世代順に連続して配置されるように前記単一の仮想メモリ空間を各世代で分配する手段を含む、
ことを特徴とする世代別ガベージコレクション装置。
【図面の簡単な説明】
【００８６】
【図１】本発明の一実施の形態に係る、コンピュータシステムに実装される世代別ＧＣによるガベージ・コレクタ処理の概要を示すフローチャートである。
【図２】従来の世代別ＧＣ環境の準備・初期化処理を示すフローチャートである。
【図３】従来の世代別ＧＣ環境の準備・初期化処理により仮想メモリ空間が割り当てられたときのイメージ図である。
【図４】Ｓ１の世代別ＧＣ環境の準備・初期化処理を示すフローチャートである。
【図５】Ｓ１の世代別ＧＣ環境の準備・初期化処理により仮想メモリ空間が割り当てられたときのイメージ図である。
【図６】Ｓ１の世代別ＧＣ環境の準備・初期化処理により設けられた各世代空間における、生存オブジェクトの移動確率と世代間の境界の変動の関係を示す図である。
【図７】従来の対象世代のＧＣ処理によりプロモーションが行われたときのイメージ図である。
【図８】Ｓ２ａの対象世代のＧＣ処理によりプロモーションが行われたときのイメージ図である。
【図９】Ｓ２ａの対象世代のＧＣ処理を示すフローチャートと、その処理中の仮想メモリ空間のイメージを示す図である。
【図１０】従来の対象世代のＧＣ処理におけるプロモーションによる世代空間の変動を示すイメージ図である。
【図１１】プロモーション失敗の捕捉処理を含むＳ２１の世代空間のＧＣ処理を示すフローチャートである。
【図１２】逐次移動型プロモーションの基本的な概念を示すイメージ図である。
【図１３】従来の全体のＧＣ処理の実行形態を説明する図である。
【図１４】Ｓ２ｂの全体のＧＣ処理の実行形態を説明する図である。
【図１５】世代空間間の隙間を不要オブジェクトで埋めるときのイメージ図である。
【図１６】Ｓ２ｂの全体のＧＣ処理を示すフローチャートと、その処理中の仮想メモリ空間のイメージを示す図である。
【図１７】記憶させた世代別ＧＣプログラムをコンピュータで読み取ることの可能な記憶媒体の例を示す図である。
【符号の説明】
【００８７】
１      コンピュータ
２      メモリ
３      可搬型記憶媒体
４      回線
５      プログラムサーバ
６      記憶装置
【図１】
2007025914.tif 000003
【図２】
2007025914.tif 000004
【図３】
2007025914.tif 000005
【図４】
2007025914.tif 000006
【図５】
2007025914.tif 000007
【図６】
2007025914.tif 000008
【図７】
2007025914.tif 000009
【図８】
2007025914.tif 000010
【図１０】
2007025914.tif 000011
【図１１】
2007025914.tif 000012
【図１２】
2007025914.tif 000013
【図１３】
2007025914.tif 000014
【図１４】
2007025914.tif 000015
【図１７】
2007025914.tif 000016
【図９】
2007025914.tif 000017
【図１５】
2007025914.tif 000018
【図１６】
2007025914.tif 000019