(57)【要約】【課題】オブジェクトの寿命を計り、長寿命のオブジェクトをＧＣの対象外とすることで、オブジェクトを利用するプログラムを高速化すること。【解決手段】計算機９のプログラム実行部５０は、実行対象プログラム１０を実行する過程で、その実行対象プログラム１０から利用されるオブジェクトの生成命令を実行すると、生成されるオブジェクトの生存期間が、ルートクラスについてのオブジェクトの生存期間に含まれないときには、生成されるオブジェクトを内部ヒープ６２に配置し、メモリ割当情報テーブル４０を参照して、生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、生成されるオブジェクトを長寿命オブジェクトとして外部ヒープ６４に配置する。【選択図】図１
2010044532.tif 000002
【特許請求の範囲】
【請求項１】
オブジェクトの割当先となるメモリ上のヒープ領域を、ＧＣ（Garbage Collection）が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理方法であって、
メモリ管理方法を実行する計算機は、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、対象集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
前記入力装置は、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す集合定義データと、その集合定義データで示されるオブジェクトの集合を利用する解析用プログラムと、の入力を受け付け、
前記対象集合処理部は、
前記解析用プログラムを試行することにより、その解析用プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
前記プログラム実行部は、
前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
生成されるオブジェクトの生存期間が、ルートクラスについてのオブジェクトの生存期間に含まれないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする
メモリ管理方法。
【請求項２】
オブジェクトの割当先となるメモリ上のヒープ領域を、ＧＣ（Garbage Collection）が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理方法であって、
メモリ管理方法を実行する計算機は、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、有制約集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
前記入力装置は、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す制約集合定義データと、の入力を受け付け、
前記有制約集合処理部は、
前記実行対象プログラムを試行することにより、その実行対象プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
前記実行対象プログラムを読み取り、その実行対象プログラム内の各クラスの定義文で記述されるアクセス修飾子を参照することにより、所定規約を満たすか否かを判定し、
前記所定規約は、オブジェクトの集合のうちのルートクラスについてのオブジェクトはオブジェクトの集合の外部から利用できるが、オブジェクトの集合のうちのルートクラス以外のメンバクラスについてのオブジェクトはオブジェクトの集合の外部から利用できない旨の規約であり、
オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記制約集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
前記プログラム実行部は、
前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
生成されるオブジェクトを利用する前記実行対象プログラムが、前記所定規約を満たさないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする
メモリ管理方法。
【請求項３】
前記有制約集合処理部は、前記実行対象プログラムを試行する過程において、前記外部ヒープに配置されているオブジェクトを解放するときに、その解放するオブジェクトが前記内部ヒープに配置されているオブジェクトから参照されている場合、解放するオブジェクトの属するオブジェクトの集合を妥当性無しとし、
前記プログラム実行部は、
前記生成されるオブジェクトの属するオブジェクトの集合が、妥当性無しとされたときには、前記生成されるオブジェクトを前記内部ヒープに配置すること、を特徴とする
請求項２に記載のメモリ管理方法。
【請求項４】
前記プログラム実行部は、前記実行対象プログラムを実行する過程で、前記内部ヒープに配置されているオブジェクトに対してＣｏｐｙｉｎｇＧＣ処理を実行した結果、前記内部ヒープ内での領域移動が行われるオブジェクトを抽出し、
抽出したオブジェクトの集合の寿命が長寿命の場合、そのオブジェクトの集合のうちのメンバクラスについてのオブジェクトの配置先を、前記内部ヒープから前記外部ヒープに移動すること、を特徴とする
請求項１ないし請求項３のいずれか１項に記載のメモリ管理方法。
【請求項５】
前記メモリ割当用データには、前記試行処理におけるオブジェクトの集合を生成したときの平均領域サイズを、さらに、オブジェクトの集合の名前と対応づけ、
前記プログラム実行部は、前記外部ヒープに配置するためのオブジェクトの領域サイズを、前記メモリ割当用データから読み取った平均領域サイズとすること、を特徴とする
請求項１ないし請求項４のいずれか１項に記載のメモリ管理方法。
【請求項６】
請求項１ないし請求項５のいずれか１項に記載のメモリ管理方法を、コンピュータに実行させるためのメモリ管理プログラム。
【請求項７】
オブジェクトの割当先となるメモリ上のヒープ領域を、ＧＣ（Garbage Collection）が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理装置であって、
メモリ管理装置は、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、対象集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
前記入力装置は、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す集合定義データと、その集合定義データで示されるオブジェクトの集合を利用する解析用プログラムと、の入力を受け付け、
前記対象集合処理部は、
前記解析用プログラムを試行することにより、その解析用プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
前記プログラム実行部は、
前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
生成されるオブジェクトの生存期間が、ルートクラスについてのオブジェクトの生存期間に含まれないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする
メモリ管理装置。
【請求項８】
オブジェクトの割当先となるメモリ上のヒープ領域を、ＧＣ（Garbage Collection）が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理装置であって、
メモリ管理装置は、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、有制約集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
前記入力装置は、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す制約集合定義データと、の入力を受け付け、
前記有制約集合処理部は、
前記実行対象プログラムを試行することにより、その実行対象プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
前記実行対象プログラムを読み取り、その実行対象プログラム内の各クラスの定義文で記述されるアクセス修飾子を参照することにより、所定規約を満たすか否かを判定し、
前記所定規約は、オブジェクトの集合のうちのルートクラスについてのオブジェクトはオブジェクトの集合の外部から利用できるが、オブジェクトの集合のうちのルートクラス以外のメンバクラスについてのオブジェクトはオブジェクトの集合の外部から利用できない旨の規約であり、
オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記制約集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
前記プログラム実行部は、
前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
生成されるオブジェクトを利用する前記実行対象プログラムが、前記所定規約を満たさないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする
メモリ管理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ管理方法、メモリ管理プログラム、および、メモリ管理装置の技術に関する。
【背景技術】
【０００２】
ＧＣ（Garbage Collection）は、メモリ上のヒープ領域に対するメモリ管理（特に、不要となった使用中のメモリ領域の開放）について、プログラムからの明示的な命令がされなくても、自動的に実現する技術である。なお、ＧＣの起動は自動的に行われるため、リアルタイム処理などの重要な制御に対して、ＧＣの負荷の影響を抑える方式も提案されている（非特許文献１、２参照）。
ヒープ領域は、内部ヒープまたは外部ヒープのいずれかに分類される。
内部ヒープは、ＧＣの対象内となるヒープ領域であり、例えば、Ｊａｖａ（登録商標）言語に実行されているＪａｖａ（登録商標）ヒープとして実現される。
外部ヒープは、ＧＣの対象外となるヒープ領域であり、プログラムからの明示的な命令（手動）により、メモリ管理が実現される。
【０００３】
ＧＣを実現するためのアルゴリズムは、いくつか存在する。以下、２つのアルゴリズムを例示する。
「Mark and Sweep GC」アルゴリズムは、ヒープ領域上のプログラムのルートオブジェクトからリンクを順に辿り（Mark）、辿れなかった（宙に浮いた）オブジェクトをヒープ領域上から削除し（Sweep）、細切れのヒープ領域内のメモリ空間を一カ所に片づける（Compaction）アルゴリズムである。
「Copying GC」アルゴリズムでは、メモリ空間を複数の区画に区切り、ＧＣ監視対象のヒープ領域はそのうちの１つの区画のみとする。そして、オブジェクトからリンクを辿る処理を１つの区画内までに制限し、オブジェクト間がリンクで接続されるオブジェクト群の単位で、別の区画にコピー（Copying）するアルゴリズムである。
【非特許文献１】Angelo Corsaro and Ron K. Cytron著,“Efficient memory-reference checks for real-time java”,Proceedings of the 2003 ACM SIGPLAN conference on Language, compiler, and tool for embedded systems,2003
【非特許文献２】F.Pizlo,J.M. Fox,D. Holmes and J.Vitek著,“Real-time Java scoped memory: design patterns and semantics”,Proceedings of the Seventh IEEE International Symposium on Object-Oriented Real-Time Distributed Computing, 2004.
【発明の開示】
【発明が解決しようとする課題】
【０００４】
なお、Ｊａｖａ（登録商標）言語のメモリ確保に関する技術として、長寿命となるオブジェクトを外部ヒープに確保することで、ＧＣの実行に伴う負荷の増大を抑止する技術が存在する（例えば、特願２００７−２０３２８８号公報を参照）。なお、オブジェクトの寿命とは、オブジェクトがメモリ上に生成されてから解放されるまでの期間の時間長を指す。
つまり、ＧＣの処理対象となるオブジェクトの増加により、ＧＣの処理負荷も増加する。そこで、長寿命の（換言すると、処理負荷への影響が大きい）オブジェクトをＧＣの処理対象となる内部ヒープではなく、ＧＣの処理対象外となる外部ヒープに配置することにより、ＧＣの処理対象となるオブジェクトを抑制し、ＧＣの処理負荷も抑制する。
そして、短寿命のオブジェクトを内部ヒープに配置し、長寿命のオブジェクトを外部ヒープに配置するように振り分けることで、ＧＣによる自動メモリ管理と、明示的な命令による手動メモリ管理と、のバランスをとることができる。
【０００５】
前記したオブジェクトの寿命に応じて、ヒープ領域を振り分ける手法を実現するときに、オブジェクトの寿命を計る処理は重要かつ困難な問題である。
【０００６】
実際にどのオブジェクトが長寿命となるかの判断を行うためにはオブジェクトのライフサイクルを考慮する必要があり、高度な知識が必要である。また、実行されるプログラムの利用状況、環境等によっても、オブジェクトが長寿命となるかが決まることも多い。
新たにプログラムを作成する際、どのオブジェクトが長寿命になるかを予め意識してプログラミングを行うことは、非常に困難なため、外部ヒープ領域を効果的に利用可能なプログラムの作成は困難である。
利用状況、環境等によって、オブジェクトが長寿命となるかが決まることも多く、ある利用状況で長寿命となったオブジェクトが、他の利用状況でも長寿命になるとは限らない。そのため、常に外部ヒープ領域に確保することで、ＧＣの処理負荷の増大を抑止できるとは限らない。
【０００７】
そこで、本発明は、前記した問題を解決し、オブジェクトの寿命を計り、長寿命のオブジェクトをＧＣの対象外とすることで、オブジェクトを利用するプログラムを高速化することを、主な目的とする。
【課題を解決するための手段】
【０００８】
前記課題を解決するため、本発明は、オブジェクトの割当先となるメモリ上のヒープ領域を、ＧＣ（Garbage Collection）が適用される内部ヒープ、および、プログラムから明示的にメモリ管理される外部ヒープに分けるとともに、オブジェクトの寿命に基づいてオブジェクトの割当先を決定するメモリ管理方法であって、
メモリ管理方法を実行する計算機が、前記内部ヒープおよび前記外部ヒープを構成するメモリに加え、入力装置と、対象集合処理部と、メモリ割当用データと、プログラム実行部と、を有し、
前記入力装置が、実行対象プログラムと、その実行対象プログラムから利用されるオブジェクトの集合を示す集合定義データと、その集合定義データで示されるオブジェクトの集合を利用する解析用プログラムと、の入力を受け付け、
前記対象集合処理部が、
前記解析用プログラムを試行することにより、その解析用プログラムから利用されるオブジェクトの集合についてのメモリ上の生成時刻から解放時刻までの生存期間を取得するとともに、その取得した各生存期間の時間長により、各オブジェクトの寿命を計算し、
オブジェクトの集合の名前と、そのオブジェクトの集合を構成するオブジェクトのうちの前記集合定義データで指定されるルートクラスについてのオブジェクトの寿命の平均値と、を対応づけて前記メモリ割当用データとして記憶手段に格納し、
前記プログラム実行部が、
前記実行対象プログラムを実行する過程で、その実行対象プログラムから利用されるオブジェクトの生成命令を実行すると、
生成されるオブジェクトの生存期間が、ルートクラスについてのオブジェクトの生存期間に含まれないときには、前記生成されるオブジェクトを前記内部ヒープに配置し、
前記メモリ割当用データを参照して、前記生成されるオブジェクトが属するオブジェクトの集合に対応する寿命の平均値を取得し、取得した寿命の平均値が所定閾値以上のときに、前記生成されるオブジェクトを長寿命オブジェクトとして前記外部ヒープに配置するとともに、取得した寿命の平均値が所定閾値未満のときに、前記生成されるオブジェクトを短寿命オブジェクトとして前記内部ヒープに配置すること、を特徴とする。
その他の手段は、後記する。
【発明の効果】
【０００９】
本発明によれば、オブジェクトの寿命を計り、オブジェクトを適宜ＧＣの対象外とすることで、オブジェクトを利用するプログラムを高速化することが可能になった。
【発明を実施するための最良の形態】
【００１０】
以下、本発明の一実施形態に係る外部ヒープ適用支援装置（メモリ管理装置）を、適宜図面を参照しながら説明する。外部ヒープ適用支援装置は、オブジェクトの寿命に基づいて処理負荷の高いオブジェクトを選定し、その選定したオブジェクトをＧＣの対象外である外部ヒープ領域にメモリ割当することを特徴とする。
【００１１】
図１（ａ）は、メモリ振り分け手段を含む外部ヒープ適用支援装置が実現される計算機９の構成図を示す。
計算機９は、ＰＣやサーバなどのコンピュータによって実現され、メモリ９１、ＣＰＵ（Central Processing Unit、処理部）９２、記憶装置９３、入力装置９４、出力装置９５およびこれらを相互接続するバス９６を含んで構成される。
メモリ９１は、オペレーティングシステム９７に加え、実行対象プログラム１０、対象集合処理部２０、有制約集合処理部３０、メモリ割当情報テーブル４０（メモリ割当用データ）、プログラム実行部５０、プログラム実行環境部６０、集合用領域管理ＡＰＩ（Application Programming Interface）７０を含んで記憶している。
【００１２】
実行対象プログラム１０は、Ｊａｖａ（登録商標）言語などのオブジェクト指向言語で記述されるプログラムである。実行対象プログラム１０のソースコードには、オブジェクト指向のクラスが記述されており、そのクラスが実行時にはヒープ領域上にオブジェクトとして具現化される。
実行対象プログラム１０は、対象集合１１を利用する。対象集合１１は、有制約集合１２および無制約集合１３である（詳細は図３参照）。
対象集合１１は、寿命が類似するオブジェクト群であり、有制約集合１２と無制約集合１３との総称である。
有制約集合１２は、カプセル化された対象集合１１であり、後記する５つの規約（第１規約〜第５規約）から構成される制約を満たす対象集合１１である。
無制約集合１３は、有制約集合１２とは逆に、制約を満たさない対象集合１１である。換言すると、無制約集合１３は、対象集合１１に属する有制約集合１２の補集合である。
【００１３】
対象集合処理部２０は、対象集合１１（主に無制約集合１３だが、有制約集合１２でも可能）を試行し、その結果をメモリ割当情報テーブル４０に書き込む。本実施形態において、「集合」とは、クラスから生成される１つ以上のオブジェクトの集合を指す。同じ集合に属する各オブジェクトは、利用（参照）関係にある。
有制約集合処理部３０は、有制約集合１２を試行し、その結果をメモリ割当情報テーブル４０に書き込む。
【００１４】
メモリ割当情報テーブル４０は、対象集合１１ごとに、集合の生存期間（集合の寿命とも呼ばれる）などの試行結果を管理する（詳細は表２）。
プログラム実行部５０は、実行対象プログラム１０を実行する。このとき、実行対象プログラム１０から利用される対象集合１１は、ヒープ領域に割り当てられる。ここで、プログラム実行部５０は、メモリ割当情報テーブル４０の集合の生存期間から対象集合１１が長寿命か短寿命かを判定し、その結果によって対象集合１１の割当先となるヒープ領域を選択する。
プログラム実行環境部６０は、例えば、Ｊａｖａ（登録商標）  ＶＭ（Virtual Machine）として実現されるプログラム実行部５０の実行環境であり、オペレーティングシステム９７上で実行される。
【００１５】
図１（ｂ）は、図１（ａ）の計算機９に含まれる、プログラム実行部５０およびプログラム実行環境部６０の詳細を示す構成図である。
【００１６】
プログラム実行部５０は、メモリ割当部５１を有しており、メモリ割当部５１は、ルートクラス配置部５２、メンバクラス配置部５３を有している。
ルートクラス配置部５２は、対象集合１１のルートクラスを、ヒープ領域（内部ヒープ６２または外部ヒープ６４）に配置する。なお、１つの対象集合１１には、１つのルートクラスが含まれる。ルートクラスは、クラス間の利用関係をツリー構造として見たときのルート（根）に存在するクラスである。
メンバクラス配置部５３は、対象集合１１のメンバクラスを、ヒープ領域（内部ヒープ６２または外部ヒープ６４）に配置する。１つのルートクラスからは、１つ以上のメンバクラスが利用される。よって、１つの対象集合１１には、１つ以上のメンバクラスが含まれる。
【００１７】
プログラム実行環境部６０は、内部ヒープ処理部６１、内部ヒープ６２、外部ヒープ処理部６３、外部ヒープ６４、ＧＣ処理部６５、オブジェクト情報取得部６８、参照情報取得部６９を有している。また、ＧＣ処理部６５は、Copying GC部６６とMark and Sweep GC部６７を有している。
【００１８】
内部ヒープ処理部６１は、内部ヒープ６２を対象とするメモリ割当処理を担当し、外部ヒープ処理部６３は、外部ヒープ６４を対象とするメモリ割当処理を担当する。
内部ヒープ６２とは、メモリ管理が自動で実行される（換言すると、ＧＣの対象となる）ヒープ領域である。内部ヒープ６２は、例えば、Ｊａｖａ（登録商標）ヒープとして実現される。
外部ヒープ６４とは、メモリ管理が手動で実行される（換言すると、ＧＣの対象とならず、プログラム中から明示的にメモリ管理をする必要のある）ヒープ領域である。
よって、内部ヒープ６２と外部ヒープ６４との違いは、ＧＣの対象となるか否かである。
内部ヒープ６２に格納されるデータが多くなると、ＧＣの対象となるため、メモリ管理は容易になる反面、ＧＣの処理に伴う負荷が増大する。
外部ヒープ６４に格納されるデータが多くなると、負荷はあまりかからないが、メモリ管理を手動で明示的に行う必要がある。
【００１９】
ＧＣ処理部６５は、内部ヒープ６２に対するＧＣを実行する。このＧＣのアルゴリズムにより、Copying GC方式を実行するCopying GC部６６と、Mark and Sweep GC方式を実行するMark and Sweep GC部６７と、が実行される。
オブジェクト情報取得部６８および参照情報取得部６９は、内部ヒープ６２および外部ヒープ６４上における対象集合１１の各オブジェクトの割当状況を監視し、その結果として、オブジェクト情報取得部６８はオブジェクトの割当履歴を、参照情報取得部６９はオブジェクト間の参照関係を、それぞれ取得する。
集合用領域管理ＡＰＩ７０は、実行対象プログラム１０から利用され、対象集合１１の集合用領域を確保および解放する。
【００２０】
図２は、図１（ａ）の計算機９に含まれる、対象集合処理部２０および有制約集合処理部３０の詳細を示す構成図である。なお、各データ構造（各テーブル）の詳細は、後記する各表に示し、各処理部の詳細は、後記する各フローチャートに示す。
【００２１】
対象集合処理部２０は、集合定義データ２１（詳細は表３）および集合試行部２２を有する。
集合試行部２２は、集合オブジェクト解析部２３と、集合解析部２４と、集合ルートクラステーブル２５（詳細は表４）と、集合メンバクラス候補テーブル２６（詳細は表５）と、集合メモリ割当情報生成部２７と、を有する。
【００２２】
有制約集合処理部３０は、制約集合定義データ３１（詳細は表６）と、制約形式検査部３２と、制約試行部３３と、を有する。
制約試行部３３は、制約ルートクラス配置部３４と、制約メンバクラス配置部３５と、制約利用情報テーブル３６（詳細は表７）と、制約メモリ割当情報生成部３７と、を有する。
【００２３】
図３は、実行対象プログラム１０から利用される対象集合１１（有制約集合１２および無制約集合１３）のクラス構成の一例を示すクラス図である。
【００２４】
対象集合１１は、ルートを成すオブジェクトを基点として参照関係を構築し、そのルートを成すオブジェクトの生存期間に他のオブジェクトの生存期間が包含される、オブジェクトの集合である。
ルートクラス（「RootClass」１０２）は、参照関係をツリー構造としたときのルートを成すクラスである。
メンバクラス（「MemberClass1」１０３、「MemberClass2」１０５、「MemberClass3」１０４）は、ルートクラスから参照される、ルートクラス以外のクラスである。
無制約集合１３では、「RootClass」１０２にインタフェース１０１が付され、「MemberClass1」１０３にインタフェース１０６が付されており、外部のクラスからの利用を許可している。
【００２５】
クラス間の参照関係は、クラス間を接続する記号（菱形が付された直線）で示される。菱形があるクラスは、参照元のクラスである。例えば、「RootClass」１０２からは、「MemberClass1」１０３と、「MemberClass2」１０５とに、それぞれ参照されている。
なお、「RootClass」１０２からの塗られている菱形は、合成（Composition）を示し、参照元のオブジェクトの消去にともない、参照先のオブジェクトも消去する。
一方、塗られていない菱形は、集約（Aggregation）を示し、参照元のオブジェクトの消去は、参照先のオブジェクトの消去には影響しない。
【００２６】
有制約集合１２は、対象集合１１のうちの制約を満たすオブジェクトの集合である。その制約とは、有制約集合１２のルートクラスのみが、有制約集合１２以外のオブジェクトから利用できることである。具体的には、有制約集合１２では、「RootClass」１０２のみがインタフェース１０１を提供している。有制約集合１２に属さないオブジェクトは、有制約集合１２内のインタフェースを提供しない各メンバクラスを利用することができない。
有制約集合１２以外のオブジェクトからメンバクラスを利用すことができないため、ルートクラス（「RootClass」１０２）の消去にともない、すべてのメンバクラス（「MemberClass1」１０３、「MemberClass2」１０５、「MemberClass3」１０４）も消去する。
【００２７】
以下、有制約集合１２の規約を具体化する。
【００２８】
「有制約集合１２のルートクラスのみが、有制約集合１２以外のオブジェクトから利用できる」という規約をＪａｖａ（登録商標）言語に適用すると、以下の第１規約〜第５規約をすべて満たすときに規約に合格することになる。
・第１規約は、有制約集合１２を構成するクラスはすべて同じパッケージ（package）１０７内に宣言しなければならないことである。
・第２規約は、有制約集合１２のルートクラスは、第１規約で宣言されるパッケージ内において、publicクラスとして、１つだけ宣言しなければならないことである。
・第３規約は、有制約集合１２のメンバクラスは、package-privateなクラスとして宣言しなければならないことである。
・第４規約は、有制約集合１２のルートクラスのpublicと宣言されているメソッド（インタフェース１０１）は、戻り値としてメンバクラスを返してはいけないことである。
・第５規約は、有制約集合１２のルートクラスのフィールド、有制約集合１２のメンバクラスのフィールド、メソッド、コンストラクタは、publicと宣言してはいけないことである。
【００２９】
まず、５つの規約に従い定義されたプログラムは、対象集合１１である。以下に各規約から導き出せる事項をもとに、その根拠を示す。
第５規約から、メンバクラスのオブジェクトを生成できるのは、同じパッケージであるルートクラスとメンバクラス内である。
第４規約からメンバクラスのオブジェクトは、有制約集合１２以外のオブジェクトへは渡されないため、メンバクラスを保持できるのは、ルートクラスおよびメンバクラスである。したがって、メンバクラスの生存期間は、ルートクラスの生存期間に含まれる。
つまり、５つの規約に従い定義されたプログラムは、対象集合１１である。
【００３０】
次に、５つの規約に従い定義されたプログラムは、有制約集合１２のルートクラスのみが有制約集合１２以外のオブジェクトから利用できるので、有制約集合１２である。以下に各規約から導き出せる事項をもとに、その根拠を示す。
第３規約から、メンバクラスの型を有制約集合１２以外のオブジェクトから利用することはできない。
第５規約から、メンバクラスのフィールド、メソッド、コンストラクタを有制約集合１２以外のオブジェクトから利用することはできない。
第５規約から、メンバクラスのオブジェクトを生成できるのは、同じパッケージであるルートクラスとメンバクラス内である。
第４規約から、メンバクラスのオブジェクトは、有制約集合１２以外のオブジェクトへは渡されない。
【００３１】
図４は、対象集合１１の生存の様子を示す説明図である。
【００３２】
図４（ａ）は、クラス間の利用関係を矢印で示す図である。
「RootClass」は、対象集合１１のルートクラスのオブジェクトである。「MemberClass1」、「MemberClass2」、「MemberClass3」は、対象集合１１のメンバクラスのオブジェクトである。「OtherClass1」、「OtherClass2」は、対象集合１１以外のオブジェクトである。対象集合１１は、「RootClass」、「MemberClass1」、「MemberClass2」、「MemberClass3」により構成される。
図４（ａ）の矢印を順に追っていくことで、参照が辿れる。ここで、参照が辿れるとは、オブジェクトが直接参照しているオブジェクトを探し、その参照しているオブジェクトが参照しているオブジェクトを探す、というように再帰的にオブジェクトを探し、最終的に目的のオブジェクトを発見できることである。
【００３３】
図４（ｂ）は、図４（ａ）の各クラスの割り当てに関する情報を示す表である。この表は、クラスごとに、そのクラス名と、割り当てられたクラスの領域サイズ（単位はＢ（Byte））と、クラスの割り当てられた時刻を示す生成時刻と、クラスの割り当てが解放された時刻を示す解放時刻と、を対応づける。クラスの寿命は、解放時刻と生成時刻との差分により求められる。
【００３４】
図５は、図４（ａ）のクラスごとに（「OtherClass2」は、省略）、クラスの寿命（生存期間）を示す図である。横方向に各クラスを配置し、縦方向は時間軸（下に行くほど時間が経過）を示す。そして、クラスごとにその生存期間を示す矩形が示されている。
例えば、ルートクラスである「RootClass」は、生成時刻が「10:00」であり、解放時刻が「10:20」であるので、寿命は２０分である。
あるクラスの生成時刻がルートクラスの生成時刻以降であり、かつ、あるクラスの解放時刻がルートクラスの解放時刻以前であるときに、「あるクラスの生存期間が、ルートクラスの生存期間に包含される」と表現する。
例えば、各メンバクラス（「MemberClass1」、「MemberClass2」、「MemberClass3」）の生存期間は、それぞれルートクラスの生存期間に包含される。しかし、「OtherClass1」の生存期間は、ルートクラスの生存期間には包含されない。
なお、１つのルートクラスの生存期間内において、あるクラスの「生成および解放」が複数回実行されることもあるが、そのときには、あるクラスの複数回の生存期間がすべてルートクラスの生存期間に包含されるとき、包含関係を有することとする。
【００３５】
以下、図１（ａ）の計算機９に含まれる、各データ構造を表形式で説明する。
【００３６】
【表１】
2010044532.tif 000003
【００３７】
表１は、対象集合１１（有制約集合１２）を記述するプログラムの一例を示す。このプログラムは、Ｊａｖａ（登録商標）の文法に沿って、記述されている。
１行目は、パッケージ（package x）の宣言文である。
２，１０，１６，１７行目は、それぞれクラス（RootClass、MemberClass1、MemberClass2、MemberClass3）の宣言文である。
RootClassは、ルートクラスであり、修飾子「public」が付されている。
MemberClass1、MemberClass2、MemberClass3は、それぞれメンバクラスであり、修飾子が省略されているため、package-private（自分のパッケージからのみ参照可能）なクラスである。
５〜８行目は、getDataメソッドを示す。このgetDataメソッドは、ルートクラスのpublicメソッドであり、戻り値としてメンバクラスを返さない。
３，４行目は、それぞれルートクラスのフィールド「m1」，「m2」を示す。
１１，１２行目は、それぞれメンバクラスのフィールド「i」，「m3」を示す。
１３行目は、メンバクラスのコンストラクタ「MemberClass1」を示す。
１４行目は、getメソッドを示す。このgetメソッドは、メンバクラスのメソッドであり、public宣言されていない。
【００３８】
以下に示すように、対象集合１１は、５つの規約をすべて満たすため、有制約集合１２である。
第１規約は、各クラスがpackage xに含まれるので、満たされる。
第２、３規約は、各クラスの修飾子の宣言または省略により、満たされる。
第４規約は、getDataメソッドの宣言により、満たされる。
第５規約は、ルートクラスのフィールド、メンバクラスのフィールド、コンストラクタ、getメソッドの宣言により、満たされる。
【００３９】
【表２】
2010044532.tif 000004
【００４０】
表２は、メモリ割当情報テーブル４０の一例を示す。メモリ割当情報テーブル４０は、対象集合の名前と、ルートクラスと、メンバクラスと、ルートクラスの平均生存時間と、対象集合の平均領域サイズと、を対応づけて管理する。
「対象集合の名前」は、各レコードのキーとなる対象集合１１の特定情報を示す。この対象集合１１は、有制約集合１２でもよいし、無制約集合１３でもよい。
「ルートクラス」は、「対象集合の名前」の対象集合に含まれる１つのルートクラスを示す。
「メンバクラス」は、「対象集合の名前」の対象集合に含まれる１つ以上のメンバクラスを示す。
「ルートクラスの平均生存時間」は、「ルートクラス」に関する実行結果としての、平均生存時間を示す。この平均生存時間は、所定閾値との比較により、レコードの対象集合１１が内部ヒープ６２に割り当てられるか、外部ヒープ６４に割り当てられるか、を決定するための情報である。
「対象集合の平均領域サイズ」は、「対象集合の名前」の対象集合に関する実行結果としての、割り当てられた平均領域サイズを示す。この平均領域サイズは、外部ヒープ６４に割り当てられるときに外部ヒープ６４内に確保される領域サイズの初期値として使用される。
【００４１】
【表３】
2010044532.tif 000005
【００４２】
表３は、集合定義データ２１の一例を示す。この集合定義データ２１は、ＸＭＬの文法（要素タグの入れ子構造）に沿って、記述されている。
１〜１１行目は、ルート要素であるtarget-set-definition要素を示す。
２〜５行目は、ルート要素の子要素であるtarget-set要素を示す。３行目のtarget-set-name要素は対象集合１１の名称を示し、４行目のroot-class要素はその対象集合１１のルートクラスの名称を示す。
６〜１０行目は、２〜５行目と同様に、ルート要素の子要素であるtarget-set要素を示す。
【００４３】
【表４】
2010044532.tif 000006
【００４４】
表４は、集合ルートクラステーブル２５の一例を示す。集合ルートクラステーブル２５は、対象集合１１の名前と、その対象集合１１に含まれるルートクラスと、ルートクラスの生成時刻と、ルートクラスの解放時刻と、ルートクラスの領域サイズと、メンバクラス候補テーブルＩＤと、を対応づけて管理する。「メンバクラス候補テーブルＩＤ」には、対応するルートクラスから利用されるメンバクラスのリストを格納する、集合メンバクラス候補テーブル２６（表５）のテーブルを特定するためのＩＤが格納される。
【００４５】
【表５】
2010044532.tif 000007
【００４６】
表５は、集合メンバクラス候補テーブル２６の一例を示す。集合メンバクラス候補テーブル２６は、集合ルートクラステーブル２５（表４）のメンバクラス候補テーブルＩＤごとに、複数のテーブルに分割されて構成される。集合メンバクラス候補テーブル２６は、メンバクラス候補と、その生成時刻と、その解放時刻と、その領域サイズと、を対応づけて管理する。
【００４７】
【表６】
2010044532.tif 000008
【００４８】
表６は、制約集合定義データ３１の一例を示す。この制約集合定義データ３１は、集合定義データ２１（表３）と同じ形式である。制約集合定義データ３１は有制約集合１２の定義情報を格納するのに対し、集合定義データ２１は対象集合１１（有制約集合１２または無制約集合１３）の定義情報を格納する。
１〜１５行目は、ルート要素であるconstrained-set-definition要素を示す。
２〜８行目は、ルート要素の子要素であるconstrained-set要素を示す。３行目のconstrained-set-name要素は有制約集合１２の名称を示し、４行目のroot-class要素はその有制約集合１２のルートクラスの名称を示す。さらに、５〜７行目のmember-class要素は、その有制約集合１２のメンバクラスの名称を示す。
９〜１３行目は、２〜８行目と同様に、ルート要素の子要素であるconstrained-set要素を示す。
【００４９】
【表７】
2010044532.tif 000009
【００５０】
表７は、制約利用情報テーブル３６の一例を示す。集合ルートクラステーブル２５（表４）との主な違いは、格納する情報が、対象集合１１に関するものか（集合ルートクラステーブル２５）、有制約集合１２に限定したものか（制約利用情報テーブル３６）である。
制約利用情報テーブル３６は、有制約集合１２の名前と、その有制約集合１２に含まれるルートクラスの生成時刻と、ルートクラスの解放時刻と、有制約集合１２の領域サイズと、有制約集合１２の妥当性と、を対応づけて管理する。
なお、「有制約集合１２の領域サイズ」とは、有制約集合１２のルートクラスおよびメンバクラスのオブジェクトが占める領域サイズを示す。また、「有制約集合の妥当性」は、有制約集合１２の利用方法が妥当である（妥当）か、否か（不当）を示す。
【００５１】
【表８】
2010044532.tif 000010
【００５２】
表８は、対象集合１１（有制約集合１２も含む）を利用する実行対象プログラム１０の一例を示す。このプログラムは、Ｊａｖａ（登録商標）の文法に沿って、記述されている。
【００５３】
５行目は、newInstanceメソッドを利用して、メモリアロケータのインスタンスを生成する旨を示す。
７行目は、allocateメソッドを利用して、引数で指定したルートクラスを含む対象集合用領域を割り当てて、対象集合の利用を開始する旨を示す。
９行目は、getRootメソッドを利用して、対象集合のルートクラスを取得する旨を示す。
１１行目は、取得した対象集合のルートクラスを利用して、任意の操作を実行する旨を示す。
１３行目は、９行目で取得した対象集合のルートクラスへの参照をクリアする旨を示す。
１５行目は、releaseメソッドを利用して、引数で指定した対象集合用領域を解放して、対象集合の利用を終了する旨を示す。
【００５４】
【表９】
2010044532.tif 000011
【００５５】
表９は、対象集合１１（無制約集合１３）を利用する実行対象プログラム１０に関する解析用プログラムの一例を示す。このプログラムは、Ｊａｖａ（登録商標）の文法に沿って、記述されている。
以下、表９と表８との違いに着目して、説明する。
５行目では、内部ヒープ６２内に対象集合１１のルートクラスを生成する。対象集合用領域の確保および解放する旨を明示しない。
【００５６】
【表１０】
2010044532.tif 000012
【００５７】
表１０は、集合用領域管理ＡＰＩ７０の一例を示す。集合用領域管理ＡＰＩ７０は、表８の実行対象プログラム１０から利用され、対象集合１１（有制約集合１２も含む）の集合用領域を確保および解放する。
【００５８】
１〜９行目は、MemoryAllocatorクラスを宣言する。MemoryAllocatorクラスは、対象集合１１（有制約集合１２も含む）の集合用領域を確保および解放するメモリアロケータである。４行目のnewInstanceメソッドにより、メモリアロケータのインスタンスが生成され、６行目のallocateメソッドにより、引数で指定されたルートクラスを含む集合用領域が割り当てられ、８行目のreleaseメソッドにより、allocateメソッドで割り当てられた集合用領域が解放される。
【００５９】
１０〜１４行目は、TargetSetAreaインタフェースを宣言する。TaretSetAreaインタフェースは、MemoryAllocatorクラスからアクセスされる集合用領域を規定する。１３行目で宣言されるgetRootメソッドは、６行目のallocateメソッドの呼び出し時に引数として指定されるルートクラスのオブジェクトを取得するメソッドである。
【００６０】
図６は、計算機９が実行する処理の概要を示すフローチャートである。計算機９は、このフローチャートから、図７以降のフローチャートをサブルーチンとして呼び出す。
【００６１】
Ｓ１１において、計算機９は、入力装置９４を介して、実行対象プログラム１０から利用される無制約集合１３を記述する集合定義データ２１と、実行対象プログラム１０から利用される有制約集合１２を記述する制約集合定義データ３１と、の入力を受け付ける。
【００６２】
Ｓ１２において、計算機９は、Ｓ１１で入力された集合定義データ２１および制約集合定義データ３１から、利用される対象集合１１が有制約集合１２か、無制約集合１３かを判定する。制約集合定義データ３１に記述された有制約集合１２ならＳ３１へ、集合定義データ２１に記述された無制約集合１３ならＳ２１へ、それぞれ移行する。
【００６３】
Ｓ２１において、計算機９は、実行対象プログラム１０に関する解析用プログラムの入力を受け付ける。なお、Ｓ２１の解析用プログラムと、Ｓ２３で入力される実行対象プログラム１０とは、利用される対象集合１１が互いに同じである。解析用プログラムは、利用される対象集合１１を意識することなく記述されている。一方、実行対象プログラム１０には、解析用プログラムの試行（後記するＳ２２）の結果を示す記述が追加され、集合用領域管理ＡＰＩ７０による対象集合１１の集合用領域を確保および解放する旨が記述される。
【００６４】
Ｓ２２において、集合試行部２２は、解析用プログラムを実行（試行）し、その結果をメモリ割当情報テーブル４０に登録する。そのため、集合試行部２２は、図１１のフローチャートを実行する。なお、図１１からの処理において、集合試行部２２は、Ｓ２１で入力される解析用プログラムに、Ｓ１１で入力される集合定義データ２１で指定されたルートクラスを含む対象集合１１が存在するか否かを、特定する。
Ｓ２３において、計算機９は、無制約集合１３を利用する実行対象プログラム１０の入力を受け付ける。実行対象プログラム１０は、集合用領域管理ＡＰＩ７０による無制約集合１３の明示的なメモリ管理を、解析用プログラムに追加したプログラムである。
解析用プログラムのルートクラス生成（表９の５行目）を、解析用プログラムの試行の結果（図１１のＳ５０６で後記）から特定された無制約集合１３の対象集合用領域の割り当て（表８の７行目、allocate）と、ルートクラスの取得（表８の５行目、getRoot）とに変更する。
無制約集合１３の任意の操作（表９の７行目）の次に、ルートクラスへの参照のクリア（表８の１３行目）と、割り当てた対象集合用領域の解放（表８の１５行目、release）とを追加する。
【００６５】
Ｓ３１において、計算機９は、有制約集合１２を利用する実行対象プログラム１０の入力を受け付ける。
Ｓ３２において、制約形式検査部３２は、Ｓ３１で入力された実行対象プログラム１０が、Ｓ１１で入力された制約集合定義データ３１が示すように、利用される対象集合１１が有制約集合１２か否かを形式検査する。そのため、制約形式検査部３２は、図１５のフローチャートを実行する。
【００６６】
Ｓ３３において、制約試行部３３は、Ｓ３２の形式検査に合格した実行対象プログラム１０を実行（試行）し、その結果をメモリ割当情報テーブル４０に登録する。そのため、制約試行部３３は、図１８のフローチャートを実行する。
【００６７】
Ｓ４１において、プログラム実行部５０は、Ｓ２２またはＳ３３で登録されたメモリ割当情報テーブル４０の内容に従って、実行対象プログラム１０を実行（運用）する。そのため、プログラム実行部５０は、図７のフローチャートを実行する。このとき、プログラム実行部５０のメモリ割当部５１は、実行対象プログラム１０から利用される対象集合１１（有制約集合１２および無制約集合１３）の生存期間（寿命）をメモリ割当情報テーブル４０から読み取って、所定閾値と比較することで対象集合１１が長寿命か短寿命かを判定し、長寿命の場合には外部ヒープ６４に対象集合用領域を割り当てるとともに、その対象集合用領域内に対象集合１１を配置し、短寿命の場合には内部ヒープ６２に対象集合１１を配置する。
【００６８】
以上図６の各処理において、以下に示す各オブジェクトのうち、処理負荷の高いオブジェクトを外部ヒープ６４に待避させることにより、計算機９の処理性能の低下を抑制することができる。
・既存プログラム（解析用プログラム）から利用されるオブジェクト（Ｓ２１，Ｓ２２，Ｓ２３）
・新規プログラム（実行対象プログラム１０）から利用されるオブジェクト（Ｓ３１，Ｓ３２，Ｓ３３）
【００６９】
なお、図６の処理では、Ｓ１１で集合定義データ２１および制約集合定義データ３１の入力を受け付け、Ｓ１２でその利用される集合をもとに分岐するようにすることで、１台の計算機９が２種類の対象集合１１（無制約集合１３、有制約集合１２）を選択して扱えるようにした。一方、１台の計算機９が１種類の対象集合１１を専用で扱うように構成してもよく、そのときには、制約集合定義データ３１の入力（Ｓ１１）およびその分岐（Ｓ１２）を省略することができる。
【００７０】
図７は、プログラム実行部５０が運用する、実行対象プログラム１０の処理を示すフローチャートである。このフローチャートは、図６のＳ４１から呼び出されて実行される。なお、実行対象プログラム１０は、有制約集合１２を利用するプログラムでもよいし、無制約集合１３を利用するプログラムでもよい。
【００７１】
Ｓ１０１において、メモリ割当情報テーブル４０から、Ｓ２２およびＳ３３で登録されたメモリ割当情報を取得する。
Ｓ１０２において、プログラム実行環境部６０上で、実行対象プログラム１０の実行を開始する。
Ｓ１０３において、実行中の実行対象プログラム１０からallocateメソッドが実行されると、Ｓ１０４に移行する。
Ｓ１０４において、対象集合用領域を割り当てるとともに、その対象集合用領域内に、ルートクラスを生成する。つまり、allocateメソッドの引数で渡されたルートクラスの名称を引数として、図８を呼び出す。なお、図８では、プログラム実行部５０は、ルートクラス配置部５２に対して、ルートクラスの生成を指示する。指示を受けたルートクラス配置部５２は、対象集合１１が長寿命のときには外部ヒープ６４内に対象集合用領域を割り当てるとともに、その対象集合用領域内にルートクラスを生成し、対象集合１１が短寿命のときには内部ヒープ６２内にルートクラスを生成する。
【００７２】
Ｓ１０５において、実行対象プログラム１０のreleaseメソッドが実行されると、Ｓ１０６に移行する。
Ｓ１０６において、allocateメソッドで割り当てられた対象集合用領域を解放する。つまり、releaseメソッドの引数で渡され、Ｓ１０４で割り当てられた対象集合用領域を引数として、図９を呼び出す。図９では、プログラム実行部５０は、ルートクラス配置部５２に対して、対象集合用領域の解放を指示する。指示を受けたルートクラス配置部５２は、外部ヒープ６４内に割り当てた対象集合用領域を、解放する。
【００７３】
Ｓ１０７において、プログラム実行環境部６０のCopying GC部６６の処理で内部ヒープ６２のNew領域のオブジェクトがOld領域への移動対象となると、Ｓ１０８に移行する。
Ｓ１０８において、Ｓ１０７で移動対象となるメンバクラスのオブジェクトをＳ１０４で外部ヒープ６４内に割り当てた対象集合用領域へ移動する。つまり、移動対象のオブジェクトを引数として、図１０を呼び出す。プログラム実行部５０は、メンバクラス配置部５３に対して、対象集合が長寿命の場合、メンバクラスのオブジェクトを外部ヒープ６４６４内に割り当てた対象集合用領域へ移動するように指示する。
【００７４】
図８は、ルートクラス配置部５２が実行する、対象集合１１の領域割当処理を示すフローチャートである。本フローチャートは、Ｓ１０４から呼び出されて実行されるサブルーチンであり、その引数にはルートクラスの名称が渡される。
【００７５】
Ｓ２０１において、引数で渡されたルートクラスの名称が、Ｓ１０１で取得したメモリ割当情報テーブル４０のルートクラス列に登録されているか否かを判定する。登録されている場合（Ｓ２０１，Ｙｅｓ）、そのメモリ割当情報テーブル４０のレコードを登録レコードとして、Ｓ２０２からの処理を実行する。
【００７６】
Ｓ２０２において、Mark and Sweep GC部６７から、Mark and Sweep GCの実行間隔を取得する。
Ｓ２０３において、登録レコードの「平均生存時間」が、取得したMark and Sweep GCの実行間隔以上か否かを判定する。Ｓ２０３の判定を満たすときには、Ｓ２０４に移行する。
Ｓ２０４において、登録レコードの「対象集合の平均領域サイズ」に従って、外部ヒープ処理部６３を用いて外部ヒープ６４内に対象集合用領域を割り当てるとともに、その対象集合用領域内に引数で渡されたルートクラスを生成する。
Ｓ２０５において、（Ｓ２０１，Ｎｏ）または（Ｓ２０３，Ｎｏ）の場合、内部ヒープ処理部６１を用いて、内部ヒープ６２の中に引数で渡されたルートクラスを生成する。
【００７７】
図９は、ルートクラス配置部５２が実行する、対象集合１１の領域解放処理を示すフローチャートである。本フローチャートは、Ｓ１０６から呼び出されて実行されるサブルーチンであり、その引数には解放対象の対象集合１１が渡される。
【００７８】
Ｓ３０１において、引数で渡された対象集合１１が、外部ヒープ６４に割り当てられているか、否か（内部ヒープ６２に割り当てられている）を判定する。なお、（Ｓ３０１，Ｎｏ）の場合、内部ヒープ６２に割り当てられている対象集合１１は、ＧＣ処理部６５によりＧＣのアルゴリズムに従って解放される。Ｓ３０１の判定を満たすときには、Ｓ３０２に移行する。
Ｓ３０２において、外部ヒープ処理部６３を用いて、引数で渡された対象集合１１が配置されている対象集合用領域を外部ヒープ６４から解放する。
【００７９】
図１０は、メンバクラス配置部５３が実行する、オブジェクトの移動処理を示すフローチャートである。本フローチャートは、Ｓ１０８から呼び出されて実行されるサブルーチンであり、その引数には移動対象のオブジェクトが渡される。
【００８０】
Ｓ４０１において、allocateメソッドにより外部ヒープ６４に配置されたルートクラスのオブジェクトから、引数で渡された移動対象のオブジェクトへの参照が辿れるか、Copying GC部６６へ問い合わせる。Ｓ４０１の判定を満たすときには、Ｓ４０２に移行する。
Ｓ４０２において、引数で渡された移動対象のオブジェクトが、Ｓ４０１のルートクラスを含む対象集合のメンバクラスのオブジェクトであるか判定する。Ｓ４０２の判定を満たすときには、Ｓ４０３に移行する。
Ｓ４０３において、引数で渡された移動対象のオブジェクトを、Ｓ４０１のルートクラスのオブジェクトが格納されている外部ヒープ６４内の対象集合用領域へ移動する。
【００８１】
図１１は、集合試行部２２が実行する、プログラムの試行処理を示すフローチャートである。本フローチャートは、図６のＳ２２から呼び出されるサブルーチンである。
Ｓ５０１において、集合試行部２２は、Ｓ１１で入力された集合定義データ２１を読み込む。
Ｓ５０２において、集合オブジェクト解析部２３は、Ｓ２１の解析用プログラムをプログラム実行環境部６０上で試行する。
Ｓ５０３において、集合オブジェクト解析部２３は、参照情報取得部６９を介して、試行した解析用プログラムに利用されたすべてのオブジェクトの参照関係を取得するとともに、オブジェクト情報取得部６８を介して、利用されたすべてのオブジェクトの割当履歴を取得する。
まず、図４（ａ）からは、以下に示すオブジェクトの参照関係が取得される。
・参照「RootClass→MemberClass1」
・参照「RootClass→MemberClass2」
・参照「MemberClass1→MemberClass3」
・参照「MemberClass2→OtherClass2」
・参照「OtherClass1→OtherClass2」
次に、図４（ｂ）は、取得されるオブジェクトの割当履歴として、すべてのオブジェクト（RootClass、MemberClass1、MemberClass2、MemberClass3、OtherClass1、OtherClass2）の領域サイズと、生成時刻と、解放時刻と、を示している。
Ｓ５０４において、集合解析部２４は、集合オブジェクト解析部２３でのオブジェクト解析の結果から、対象集合１１を解析する。そのため、図１２に示すサブルーチンを呼び出す。
Ｓ５０５において、集合メモリ割当情報生成部２７は、集合解析部２４による対象集合１１の解析結果から、対象集合１１のメモリ割当情報を生成し、そのメモリ割当情報をメモリ割当情報テーブル４０に登録する。そのため、図１４に示すサブルーチンを呼び出す。
Ｓ５０６において、集合試行部２２は、集合メモリ割当情報生成部２７によるメモリ割当情報の生成結果から、メモリ割当情報テーブル４０に登録した「対象集合」、「ルートクラス」、「メンバクラス」をユーザに出力する。
【００８２】
図１２は、集合解析部２４が実行する、対象集合１１の解析処理を示すフローチャートである。本フローチャートは、Ｓ５０４から呼び出されるサブルーチンである。
【００８３】
Ｓ６０１〜Ｓ６０６において、Ｓ１１で入力された集合定義データ２１を参照し、各target-set要素内のroot-class要素を選択するループを実行する。
【００８４】
Ｓ６０２において、Ｓ５０３で取得したオブジェクトの割当履歴から、ループで選択されているroot-class要素で定義されたルートクラスから生成される全オブジェクトの割当履歴を選択し（図４では「RootClass」）、その選択した情報を集合ルートクラステーブル２５のルートクラスに関する列へ格納する。
【００８５】
Ｓ６０３〜Ｓ６０５において、Ｓ６０２の全オブジェクトを１つずつ選択するループを実行する。
Ｓ６０４において、Ｓ６０３からのループで選択したオブジェクトについて、その対象集合のメンバクラスの候補を解析する。そのため、図１３に示すサブルーチンを呼び出す。
【００８６】
図１３は、集合解析部２４が実行する、対象集合のメンバクラス候補の解析処理を示すフローチャートである。本フローチャートは、Ｓ６０４から呼び出されるサブルーチンである。
【００８７】
Ｓ７０１において、Ｓ５０３で取得したオブジェクトの参照関係から、Ｓ６０３〜Ｓ６０５のループで選択されているルートクラスのオブジェクトが参照するすべてのオブジェクトを取得する。ここで、ルートクラスのオブジェクトが直接参照するオブジェクトだけではなく、ルートクラスのオブジェクトから辿れるすべてのオブジェクトを取得する。図４で示した例では、集合解析部２４は、参照情報取得部６９から、「MemberClass1、MemberClass2、MemberClass3、OtherClass2」を取得する。
【００８８】
Ｓ７０２〜Ｓ７０６において、Ｓ７０１で取得したすべてのオブジェクトに対して、１つずつ選択するループを実行する。
【００８９】
Ｓ７０３において、Ｓ５０３で取得したオブジェクトの割当履歴から、Ｓ７０２〜Ｓ７０６のループで選択中のオブジェクトの割当履歴を取得する。
【００９０】
Ｓ７０４において、取得した割当履歴の生成時刻および解放時刻で示される生存区間が、Ｓ６０３〜Ｓ６０５のループで選択されているルートクラスの生成時刻と解放時刻で示される生存区間に包含されるか否かを判定する。Ｓ７０４の判定を満たすときにはＳ７０５に移行する。
【００９１】
Ｓ７０５において、Ｓ７０２〜Ｓ７０６のループで選択中のオブジェクトの割当履歴を、集合メンバクラス候補テーブル２６のメンバクラスの候補に関する列に格納する。
例えば、図４のRootClassの生存区間に包含される（Ｓ７０４，Ｙｅｓ）MemberClass1、MemberClass2、MemberClass3の割当履歴を、それぞれメンバクラスの候補として、集合メンバクラス候補テーブル２６（ＩＤ＝＃１）へ格納する。
一方、図４のRootClassの生存区間に包含されない（Ｓ７０４，Ｎｏ）OtherClass2の割当履歴は、集合メンバクラス候補テーブル２６には格納されない。
なお、OtherClass2は、図４のRootClass以外のルートクラスがＳ６０３〜Ｓ６０５のループで選択されているときに、その選択されているルートクラスのうちの少なくとも１つのルートクラスの生存区間に包含されるときには、別の集合メンバクラス候補テーブル２６（例えば、ＩＤ＝＃２）に格納される。
【００９２】
図１４は、集合メモリ割当情報生成部２７が実行する、メモリ割当情報テーブル４０の登録処理を示すフローチャートである。本フローチャートは、Ｓ５０５から呼び出されるサブルーチンである。
Ｓ８０１〜Ｓ８０８において、集合解析部２４による対象集合１１の解析処理（Ｓ５０４）で作成された集合ルートクラステーブル２５の各ルートクラスを１つずつ選択して、以下のループ処理を実行する。以下、選択したルートクラスごとに、メモリ割当情報テーブル４０の追加するレコードを作成する。
【００９３】
Ｓ８０２において、追加するレコードの「対象集合」列には、選択されたルートクラスの属する対象集合を登録する。
【００９４】
Ｓ８０３において、追加するレコードの「ルートクラス」列には、選択されたルートクラスを登録する。
【００９５】
Ｓ８０４において、集合メンバクラス候補テーブル２６を参照して、追加するレコードの「メンバクラス」列を生成する。具体的には、以下の（１）〜（３）の処理を実行する。
（１）集合ルートクラステーブル２５の「ルートクラス」列から、選択されたルートクラスを検索する。
（２）検索したレコードに含まれる、集合ルートクラステーブル２５の「メンバクラス候補テーブルＩＤ」の全てを抽出する。
（３）抽出した「メンバクラス候補テーブルＩＤ」に一致する全ての集合メンバクラス候補テーブル２６の中で、「メンバクラス候補」列に格納されている要素を、追加するレコードのメンバクラスとして全て抽出する。（なお、抽出した「メンバクラス候補テーブルＩＤ」に一致するいずれかの集合メンバクラス候補テーブル２６の中で、「メンバクラス候補」列に格納されている要素を、追加するレコードのメンバクラスとして全て抽出してもよい。）
【００９６】
Ｓ８０５において、追加するレコードの「ルートクラスの平均生存時間」列を生成する。具体的には、Ｓ８０４の（１）で検索したレコードに含まれる、「メンバクラス候補の生成時刻」および対応する「メンバクラス候補の解放時刻」の組ごとに、時刻の差分を計算することにより１回分の生存時間を計算し、その生存時間の平均値を選択されたルートクラスの平均生存時間とする。
【００９７】
Ｓ８０６において、追加するレコードの「対象集合の平均領域サイズ」列を生成する。つまり、選択されたルートクラスのサイズと、抽出したメンバクラスのサイズとから、対象集合の領域サイズの平均領域サイズを算出する。具体的には、対象集合ごとに、対象集合のルートクラスのサイズを集合ルートクラステーブル２５の「ルートクラスの領域サイズ」列から読み取り、対象集合のメンバクラスのサイズを集合メンバクラス候補テーブル２６の「メンバクラス候補の領域サイズ」列から読み取り、加算することにより対象集合の領域サイズを求める。そして、おのおの求めた対象集合の領域サイズの平均値を計算する。
【００９８】
Ｓ８０７において、Ｓ８０２〜Ｓ８０６でそれぞれ生成された、追加するレコードの各列要素を、メモリ割当情報テーブル４０に書き込む。
【００９９】
図１５は、制約形式検査部３２が実行する、有制約集合１２の制約の形式（第１規約〜第５規格の全て）を満たしているか否かをチェックする処理を示すフローチャートである。本フローチャートは、図６のＳ３２から呼び出されるサブルーチンであり、実行対象プログラム１０から利用される集合を示す制約集合定義データ３１（Ｓ１１で入力される）が、検査対象の制約集合定義データ３１として引数指定される。
【０１００】
Ｓ９０１において、検査対象の制約集合定義データ３１で示される各集合を読み取る。
Ｓ９０２〜Ｓ９０９において、読み取った各集合から１つずつ検査対象の集合を選択し、集合を検査するループを実行する。
Ｓ９０３において、検査対象の集合のルートクラスを検査対象のルートクラスに指定して、ルートクラスを検証するサブルーチン（図１６）を呼び出す。
Ｓ９０４において、Ｓ９０３のルートクラスの検証結果が「妥当」であるか否かを判定する。Ｓ９０４の判定を満たすときにはＳ９０５へ移行し、判定を満たさないときにはＳ９１１へ移行する。
Ｓ９０５〜Ｓ９０８において、検査対象の集合のメンバクラスを制約集合定義データ３１から１つずつ選択し、メンバクラスを検証するループ処理を実行する。
Ｓ９０６において、選択されているメンバクラスを検査対象のメンバクラスに指定して、メンバクラスを検証するサブルーチン（図１７）を呼び出す。
Ｓ９０７において、Ｓ９０６のメンバクラスの検証結果が「妥当」であるか否かを判定する。Ｓ９０７の判定を満たすときにはＳ９０８へ移行し、判定を満たさないときにはＳ９１１へ移行する。
【０１０１】
Ｓ９１０において、検査対象の集合すべてについて、ルートクラスの検証結果がすべて「妥当」（Ｓ９０４，Ｙｅｓ）かつメンバクラスの検証結果がすべて「妥当」（Ｓ９０７，Ｙｅｓ）なら、検査対象の制約集合定義データ３１を「妥当」として、処理を終了する。
Ｓ９１１において、検査対象の集合のうちの１つ以上の集合について、ルートクラスの検証結果が「不当」（Ｓ９０４，Ｎｏ）またはメンバクラスの検証結果が１つでも「不当」（Ｓ９０７，Ｎｏ）なら、検査対象の制約集合定義データ３１を「不当」として、処理を終了する。
【０１０２】
なお、Ｓ９０４またはＳ９０７の判定ですべて「妥当」と判定された検査対象の集合は、有制約集合１２である。一方、Ｓ９０４またはＳ９０７の判定で１回でも「不当」と判定された検査対象の集合は、無制約集合１３であるか、または対象集合１１以外である。
【０１０３】
図１６は、制約形式検査部３２が実行する、ルートクラスが制約の形式を満たしているか否かをチェックする処理を示すフローチャートである。本フローチャートは、Ｓ９０３から呼び出されるサブルーチンである。
【０１０４】
Ｓ１００１において、制約集合定義データ３１に定義された検査対象のルートクラスのプログラムが、Ｓ３１で入力された実行対象プログラム１０内に存在するか否かを判定する。Ｓ１００１の判定を満たすときにはＳ１００２へ移行し、判定を満たさないときにはＳ１００８へ移行する。
Ｓ１００２において、Ｓ３１で入力された実行対象プログラム１０内に存在する、検査対象のルートクラスのプログラムが、publicクラスであるか否かを判定する。Ｓ１００２の判定を満たすときにはＳ１００３へ移行し、判定を満たさないときにはＳ１００８へ移行する。
Ｓ１００３において、検査対象のルートクラスのプログラムが、publicフィールドを含むか否かを判定する。Ｓ１００３の判定を満たすときにはＳ１００８へ移行し、判定を満たさないときにはＳ１００４へ移行する。
Ｓ１００４〜Ｓ１００６において、検査対象のルートクラスのプログラムの各publicメソッドを１つずつ順に選択するループを実行する。このループを終えた後は、Ｓ１００７に移行する。
Ｓ１００５において、選択されたpublicメソッドの戻り値が、検査対象のルートクラスと同じパッケージのクラスであるか否かを判定する。Ｓ１００５の判定を満たすときにはＳ１００８へ移行し、判定を満たさないときにはＳ１００６へ移行する。
Ｓ１００７において、検査対象のルートクラスを「妥当」と判断する。
Ｓ１００８において、検査対象のルートクラスを「不当」と判断する。
【０１０５】
なお、有制約集合の第４規約に反する事例として、選択されたpublicメソッドの戻り値が、当該ルートクラスと異なるパッケージで（Ｓ１００５，Ｎｏ）、かつメンバクラスのスーパークラスであり、また当該publicメソッドがメンバクラスを戻り値として返す場合には、第４規約に反するものの、例外処理として「妥当」と判断することとしてもよい。そして、第４規約に反するこの場合の妥当性は、Ｓ０６での有制約集合を利用するＪａｖａ（登録商標）プログラムの試行時、制約試行部３３の制約ルートクラス配置部３４（図２０のＳ１４０４で後記）により検証される。
【０１０６】
図１７は、制約形式検査部３２が実行する、メンバクラスが制約の形式を満たしているか否かをチェックする処理を示すフローチャートである。本フローチャートは、Ｓ９０６から呼び出されるサブルーチンである。
【０１０７】
Ｓ１１０１において、制約集合定義データ３１に定義された検査対象のメンバクラスのプログラムが、Ｓ３１で入力された実行対象プログラム１０内に存在するか否かを判定する。Ｓ１１０１の判定を満たすときにはＳ１１０２へ移行し、判定を満たさないときにはＳ１１０８へ移行する。
Ｓ１１０２において、Ｓ３１で入力された実行対象プログラム１０内に存在する、検査対象のメンバクラスのプログラムが、ルートクラスと同じパッケージに含まれるか否かを判定する。Ｓ１１０２の判定を満たすときにはＳ１１０３へ移行し、判定を満たさないときにはＳ１１０８へ移行する。
Ｓ１１０３において、検査対象のメンバクラスのプログラムにpublicフィールドが存在するか否かを判定する。Ｓ１１０１の判定を満たすときにはＳ１１０８へ移行し、判定を満たさないときにはＳ１１０４へ移行する。
Ｓ１１０４〜Ｓ１１０６において、検査対象のメンバクラスのプログラムの各メソッドおよび各コンストラクタを１つずつ選択するループを実行する。このループを実行した後は、Ｓ１１０７に移行する。
Ｓ１１０５において、選択されたメソッドまたはコンストラクタが、public宣言されているか否かを判定する。Ｓ１１０５の判定を満たすときにはＳ１１０８へ移行する。
【０１０８】
Ｓ１１０７において、検査対象のメンバクラスを「妥当」と判断する。
Ｓ１１０８において、検査対象のメンバクラスを「不当」と判断する。
【０１０９】
図１８は、制約試行部３３が実行する、プログラムの試行処理を示すフローチャートである。本フローチャートは、図６のＳ３３から呼び出されるサブルーチンである。
【０１１０】
Ｓ１２０１において、制約試行部３３は、Ｓ１１で入力された制約集合定義データ３１を読み込む。
Ｓ１２０２において、制約試行部３３は、有制約集合１２を利用する実行対象プログラム１０をプログラム実行環境部６０上で試行する。この試行結果の各データを制約利用情報テーブル３６に格納する。なお、Ｓ１２０２の試行処理は、プログラム実行部５０の運用処理（図７）と類似する。以下が試行処理と運用処理との相違点である。
（１）allocateメソッドにより呼び出される割当処理のサブルーチンが、運用処理の場合（ルートクラス配置部５２が実行する図８）から、試行処理の場合（制約ルートクラス配置部３４が実行する図１９）に置き換わる。
（２）releaseメソッドにより呼び出される解放処理のサブルーチンが、運用処理の場合（ルートクラス配置部５２が実行する図９）から、試行処理の場合（制約ルートクラス配置部３４が実行する図２０）に置き換わる。
（３）プログラム実行環境部６０のCopying GC部６６の処理で内部ヒープ６２のNew領域のオブジェクトがOld領域への移動対象となるときに呼び出される移動処理のサブルーチンは、双方ともに図１０の処理であるが、その動作主体が、運用処理の場合（メンバクラス配置部５３）から、試行処理の場合（制約メンバクラス配置部３５）に置き換わる。
（４）前記（１）〜（３）の３つのサブルーチンの処理対象となる対象集合１１が割り当てられるヒープ領域は、運用処理の場合（対象集合１１の寿命の長さにより外部ヒープ６４または内部ヒープ６２のいずれかに振り分けられる）から、試行処理の場合（有制約集合１２の寿命の長さに関わらず、外部ヒープ６４となる）に置き換わる。
【０１１１】
Ｓ１２０３において、制約メモリ割当情報生成部３７は、制約利用情報テーブル３６に格納されたＳ１２０２の試行結果からメモリ割当情報を生成し、そのメモリ割当情報をメモリ割当情報テーブル４０に登録する。そのため、図２１に示すサブルーチンを呼び出す。
【０１１２】
図１９は、制約ルートクラス配置部３４が実行する、有制約集合１２の領域割当処理を示すフローチャートである。本フローチャートは、Ｓ１２０２の（１）から呼び出されるサブルーチンである。なお、図８の割当処理との主な違いは、内部ヒープ６２に割り当てずに警告すること（Ｓ１３０２）と、割当結果を制約利用情報テーブル３６に登録すること（Ｓ１３０４）である。
【０１１３】
Ｓ１３０１において、allocateメソッドの引数で渡されたルートクラスが含まれる有制約集合１２が、制約集合定義データ３１に定義されているか否かを判定する。Ｓ１３０１の判定を満たすときにはＳ１３０３へ移行し、判定を満たさないときにはＳ１３０２へ移行する。
Ｓ１３０２において、有制約集合１２が定義されていない旨をユーザに警告し、処理を中断する。
Ｓ１３０３において、外部ヒープ処理部６３を用いて、外部ヒープ６４内に集合用領域を生成し、その集合用領域内にallocateメソッドの引数で渡されたルートクラスを生成する。
Ｓ１３０４において、制約利用情報テーブル３６にレコードを追加し、ルートクラスの生成時刻を登録する。
【０１１４】
図２０は、制約ルートクラス配置部３４が実行する、有制約集合１２の領域解放処理を示すフローチャートである。本フローチャートは、Ｓ１２０２の（２）から呼び出されるサブルーチンである。なお、図９の解放処理との主な違いは、制約利用情報テーブル３６に解放結果を登録することである。
【０１１５】
Ｓ１４０１において、外部ヒープ処理部６３を用いて、外部ヒープ６４内の集合用領域を解放する。この集合用領域を解放することで、この集合用領域内のルートクラスも併せて解放される。
Ｓ１４０２において、制約利用情報テーブル３６に、ルートクラスの解放時刻を登録する。
Ｓ１４０３において、外部ヒープ処理部６３から、Ｓ１４０１での解放時の集合用領域の領域サイズを取得し、制約利用情報テーブル３６に、有制約集合の領域サイズとして登録する。有制約集合１２を利用する実行対象プログラム１０の実行中、有制約集合のルートクラスおよびメンバクラスは外部ヒープ６４内の集合用領域に配置される。ルートクラスおよびメンバクラスの配置において、集合用領域に空きがなくなった場合、外部ヒープ処理部６３は集合用領域を自動的に拡張する。そのため、解放時の集合用領域の領域サイズは、有制約集合のルートクラスおよびメンバクラスが占める領域サイズと同じである。
Ｓ１４０４において、外部ヒープ６４内の集合用領域の解放時、内部ヒープ６２に配置されているオブジェクトから、外部ヒープ６４に配置されている有制約集合のルートクラスおよびメンバクラスへの参照があったか、外部ヒープ処理部６３へ問い合わせる。そして、その問い合わせ結果により、分岐する。Ｓ１４０４の判定を満たすとき（参照あり）にはＳ１４０５へ移行し、判定を満たさないとき（参照なし）にはＳ１４０６へ移行する。
【０１１６】
以下に、Ｓ１４０４において各クラスへの参照の有無を判断する具体例を列挙する。
・実行対象プログラム１０の文「this.root = null;」を実行しない結果、有制約集合のルートクラスへの参照をクリアしていない場合、内部ヒープ６２に配置されているオブジェクトから、外部ヒープ６４に配置されているルートクラスへの参照が存在する。
・図１６で説明した第４規約に関する例外処理において、ルートクラスのpublicメソッドの戻り値が、当該ルートクラスと異なるパッケージで、かつメンバクラスのスーパークラスであり、また当該publicメソッドがメンバクラスを戻り値として返す場合、内部ヒープ６２に配置されているオブジェクトから、外部ヒープ６４に配置されているメンバクラスへの参照が存在する。
【０１１７】
Ｓ１４０５において、制約利用情報テーブル３６内の「有制約集合１２の妥当性」列を「妥当」に更新する。
Ｓ１４０６において、制約利用情報テーブル３６内の「有制約集合１２の妥当性」列を「不当」に更新する。
【０１１８】
図２１は、制約メモリ割当情報生成部３７が実行する、メモリ割当情報テーブル４０の登録処理を示すフローチャートである。本フローチャートは、Ｓ１２０３から呼び出されるサブルーチンである。図１４の登録処理との主な違いは、有制約集合１２の妥当性をチェックすることと、対象集合１１の解析結果（統計情報）を用いる代わりに、有制約集合１２の試行結果を用いてメモリ割当情報テーブル４０の追加するレコードを生成することである。
【０１１９】
Ｓ１５０１〜Ｓ１５０９において、制約利用情報テーブル３６の「有制約集合の名前」ごとに、１つ以上のレコードを選択するループを実行する。以下、１回のループごとに、メモリ割当情報テーブル４０の追加するレコードを１レコード分作成する。
１回のループにおいて、制約利用情報テーブル３６から１つのレコードが選択されるときには、そのレコードの「有制約集合の名前」は、制約利用情報テーブル３６内に１つ存在する。
１回のループにおいて、制約利用情報テーブル３６から複数のレコードが選択されるときには、そのレコードの「有制約集合の名前」は、選択される複数のレコード間で同じである。
【０１２０】
Ｓ１５０２において、選択したレコードの「有制約集合の妥当性」列がすべて「妥当」か否かを判定する。Ｓ１５０２の判定を満たすときにはＳ１５０４へ移行し、判定を満たさないときにはＳ１５０３へ移行する。
Ｓ１５０３において、現在のループで処理中の有制約集合１２のメモリ割当情報を生成するか否かをユーザに問い合わせる。Ｓ１５０３の判定を満たすときにはＳ１５０４へ移行する。
Ｓ１５０４において、追加するレコードの「対象集合」列には、今回のループで選択された「有制約集合の名前」を登録する。
【０１２１】
Ｓ１５０５において、追加するレコードの「ルートクラス」列および「メンバクラス」列を生成する。そのために、現在のループで処理中の制約利用情報テーブル３６の「有制約集合の名前」と一致する、制約集合定義データ３１（表６参照）の「constrained-set-name要素」を検索する（例えば３，１０行目）。
追加するレコードの「ルートクラス」列には、検索された要素内のroot-class要素（例えば４，１１行目）が登録される。
追加するレコードの「メンバクラス」列には、検索された要素内のmember-class要素（例えば５〜７，１２行目）が登録される。
【０１２２】
Ｓ１５０６において、追加するレコードの「ルートクラスの平均生存時間」列を生成する。具体的には、制約利用情報テーブル３６の選択したレコードに含まれる、「ルートクラスの生成時刻」および対応する「ルートクラスの解放時刻」の時刻の差分を計算することにより１レコード分の生存時間を計算する。１回のループで複数のレコードが同じ制約集合の名称のために選択されているときには、その複数のレコードを構成する各レコードについて生存時間を計算し、その生存時間の平均値を「ルートクラスの平均生存時間」とする。
【０１２３】
Ｓ１５０７において、追加するレコードの「対象集合の平均領域サイズ」列を生成する。具体的には、制約利用情報テーブル３６の選択したレコードに含まれる「有制約集合の領域サイズ」の平均値を「ルートクラスの平均生存時間」とする。
Ｓ１５０８において、Ｓ１５０４〜Ｓ１５０７でそれぞれ生成された、追加するレコードの各列要素を、メモリ割当情報テーブル４０に書き込む。
【０１２４】
以上説明した本実施形態によれば、実行対象プログラム１０が利用する対象集合１１のメモリ割当先について、その対象集合１１を構成するオブジェクトの寿命に基づいて、内部ヒープ６２または外部ヒープ６４に振り分ける。
これにより、短寿命のオブジェクトは、その生成処理と解放処理とが頻繁になされるが、内部ヒープ６２に割り当てられるため、そのメモリ管理はＧＣにより自動的に行われる。よって、ＧＣにより、メモリ管理の手間を効率的に削減できる。
一方、長寿命のオブジェクトは外部ヒープ６４に割り当てられるため、ＧＣの対象外となり、ＧＣの処理負荷を削減できる。さらに、長寿命のオブジェクトは、その生成処理と解放処理とが行われる頻度が少ないため、実行対象プログラム１０で明示的にメモリ管理したとしても、メモリ管理の手間はそれほどかからなくて済む。
よって、本実施形態のメモリ管理手法は、内部ヒープ６２および外部ヒープ６４それぞれの長所を、バランスよく活用できる手法である。
【図面の簡単な説明】
【０１２５】
【図１】本発明の一実施形態に関するメモリ振り分け手段を含む外部ヒープ適用支援装置が実現される計算機９を示す構成図である。
【図２】本発明の一実施形態に関する対象集合処理部２０および有制約集合処理部３０の詳細を示す構成図である。
【図３】本発明の一実施形態に関する実行対象プログラム１０から利用される対象集合１１のクラス構成の一例を示すクラス図である。
【図４】本発明の一実施形態に関する対象集合１１の生存の様子を示す説明図である。
【図５】本発明の一実施形態に関するクラスの寿命（生存期間）を示す説明図である。
【図６】本発明の一実施形態に関する計算機９が実行する処理の概要を示すフローチャートである。
【図７】本発明の一実施形態に関するプログラム実行部５０が運用する、実行対象プログラム１０の処理を示すフローチャートである。
【図８】本発明の一実施形態に関するルートクラス配置部５２が実行する、対象集合１１の領域割当処理を示すフローチャートである。
【図９】本発明の一実施形態に関するルートクラス配置部５２が実行する、対象集合１１の領域解放処理を示すフローチャートである。
【図１０】本発明の一実施形態に関するメンバクラス配置部５３が実行する、オブジェクトの移動処理を示すフローチャートである。
【図１１】本発明の一実施形態に関する集合試行部２２が実行する、プログラムの試行処理を示すフローチャートである。
【図１２】本発明の一実施形態に関する集合解析部２４が実行する、対象集合１１の解析処理を示すフローチャートである。
【図１３】本発明の一実施形態に関する集合解析部２４が実行する、対象集合のメンバクラス候補の解析処理を示すフローチャートである。
【図１４】本発明の一実施形態に関する集合メモリ割当情報生成部２７が実行する、メモリ割当情報テーブル４０の登録処理を示すフローチャートである。
【図１５】本発明の一実施形態に関する制約形式検査部３２が実行する、有制約集合１２の制約の形式（第１規約〜第５規格の全て）を満たしているか否かをチェックする処理を示すフローチャートである。
【図１６】本発明の一実施形態に関する制約形式検査部３２が実行する、ルートクラスが制約の形式を満たしているか否かをチェックする処理を示すフローチャートである。
【図１７】本発明の一実施形態に関する制約形式検査部３２が実行する、メンバクラスが制約の形式を満たしているか否かをチェックする処理を示すフローチャートである。
【図１８】本発明の一実施形態に関する制約試行部３３が実行する、プログラムの試行処理を示すフローチャートである。
【図１９】本発明の一実施形態に関する制約ルートクラス配置部３４が実行する、有制約集合１２の領域割当処理を示すフローチャートである。
【図２０】本発明の一実施形態に関する制約ルートクラス配置部３４が実行する、有制約集合１２の領域解放処理を示すフローチャートである。
【図２１】本発明の一実施形態に関する制約メモリ割当情報生成部３７が実行する、メモリ割当情報テーブル４０の登録処理を示すフローチャートである。
【符号の説明】
【０１２６】
１０    実行対象プログラム
１１    対象集合
１２    有制約集合
１３    無制約集合
２０    対象集合処理部
２１    集合定義データ
２２    集合試行部
２３    集合オブジェクト解析部
２４    集合解析部
２５    集合ルートクラステーブル
２６    集合メンバクラス候補テーブル
２７    集合メモリ割当情報生成部
３０    有制約集合処理部
３１    制約集合定義データ
３２    制約形式検査部
３３    制約試行部
３４    制約ルートクラス配置部
３５    制約メンバクラス配置部
３６    制約利用情報テーブル
３７    制約メモリ割当情報生成部
４０    メモリ割当情報テーブル
５０    プログラム実行部
５１    メモリ割当部
５２    ルートクラス配置部
５３    メンバクラス配置部
６０    プログラム実行環境部
６１    内部ヒープ処理部
６２    内部ヒープ
６３    外部ヒープ処理部
６４    外部ヒープ
６５    ＧＣ処理部
６６    Copying GC部
６７    Mark and Sweep GC部
６８    オブジェクト情報取得部
６９    参照情報取得部
７０    集合用領域管理ＡＰＩ
９      計算機
９１    メモリ
９２    ＣＰＵ
９３    記憶装置
９４    入力装置
９５    出力装置
９６    バス
９７    オペレーティングシステム
【図１】
2010044532.tif 000013
【図２】
2010044532.tif 000014
【図３】
2010044532.tif 000015
【図４】
2010044532.tif 000016
【図５】
2010044532.tif 000017
【図６】
2010044532.tif 000018
【図７】
2010044532.tif 000019
【図８】
2010044532.tif 000020
【図９】
2010044532.tif 000021
【図１０】
2010044532.tif 000022
【図１１】
2010044532.tif 000023
【図１２】
2010044532.tif 000024
【図１３】
2010044532.tif 000025
【図１４】
2010044532.tif 000026
【図１５】
2010044532.tif 000027
【図１６】
2010044532.tif 000028
【図１７】
2010044532.tif 000029
【図１８】
2010044532.tif 000030
【図１９】
2010044532.tif 000031
【図２０】
2010044532.tif 000032
【図２１】
2010044532.tif 000033