(57)【特許請求の範囲】
【請求項１】
コンピュータを、
ヒープ領域以外のメモリ領域にオブジェクト用のヘッダーを付加して、前記メモリ領域を擬似的なオブジェクトとして扱い、前記メモリ領域により分割されている複数のヒープ領域を１つの連続したヒープ領域として扱うメモリ管理手段として機能させるためのメモリ管理機能を有するプログラム。
【請求項２】
前記メモリ管理手段は、前記メモリ領域の存在により、指定された最大ヒープ領域サイズの獲得ができなければ、ヒープ領域以外のメモリ領域にオブジェクト用のヘッダーを付加して前記メモリ領域を擬似的なオブジェクトとして扱い、前記メモリ領域により分割されている複数のヒープ領域を１つの連続したヒープ領域として扱うことで、前記ヒープ領域を拡張し、指定された最大ヒープ領域サイズを獲得する請求項１記載のメモリ管理機能を有するプログラム。
【請求項３】
前記メモリ管理手段は、前記オブジェクトが前記ヒープ領域へ動的に割り当てられたことにより前記ヒープ領域に空き領域がなくなると、前記ヒープ領域へ動的に割り当てられた前記オブジェクトのうち使用されなくなった前記オブジェクトを開放すると共に、前記ヒープ領域へ動的に割り当てられた前記オブジェクトのうち使用されている前記オブジェクトを集めて、前記ヒープ領域に連続した空き領域を生成する請求項１記載のメモリ管理機能を有するプログラム。
【請求項４】
前記メモリ管理手段は、前記ヒープ領域へ動的に割り当てられた前記オブジェクトのうち使用されている前記オブジェクトを集める際、前記擬似的なオブジェクトを管理するテーブルを参照して、前記擬似的なオブジェクトを移動させない請求項３記載のメモリ管理機能を有するプログラム。
【請求項５】
メモリ管理機能を有する装置であって、
ヒープ領域以外のメモリ領域にオブジェクト用のヘッダーを付加して、前記メモリ領域を擬似的なオブジェクトとして扱い、前記メモリ領域により分割されている複数のヒープ領域を１つの連続したヒープ領域として扱うメモリ管理手段
を有する装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、連続したメモリ領域を拡張可能とするメモリ管理機能を有するプログラム及び装置に関する。
【背景技術】
【０００２】
Ｊａｖａ（登録商標）言語の実行環境である仮想マシン（ＪＶＭ）はメモリ管理機能の一つとしてガベージコレクション（以下、単にＧＣと記載する）を有する。ＧＣは従来から利用されている（例えば特許文献１参照）。
【０００３】
ＧＣはアプリケーションソフトが動的に割り当てたメモリ領域（以下、オブジェクトという）のうち、使用しなくなった領域を自動的に開放する機能である。この際、使用しているオブジェクトが連続するように再配置する事で、ヒープ領域上に連続した未使用領域を作る（この処理を特にコンパクションとよび区別する場合もあるが、本願明細書ではこの処理も含めGCとする）。なお、JVM以外にも例えばC# の共通言語ランタイム(CLR)はGCを有しており、幅広い範囲で活用されている。
【０００４】
ＧＣによるメモリ管理機能を実装したプロセス（仮想マシン等）ではアプリケーションソフトから動的にオブジェクト生成要求があった場合、プロセスの仮想メモリ空間内のヒープ領域にオブジェクトを割り当てる。ＧＣはアプリケーションソフトがヒープ領域上に動的に割り当てたオブジェクトのうち、不要と判断されたオブジェクトを自動的に開放する。なお、一般的にヒープ領域は用途によって様々種類がある。本願明細書においてヒープ領域はＧＣの対象となるオブジェクト群が割り当てられるメモリ領域を指す。
【０００５】
アプリケーションソフトの実行と共にオブジェクトの生成を繰り返し行うと、ヒープ領域は次第に埋め尽くされていき、空き容量が不足し、新たにオブジェクトの生成が行えなくなる。新たにオブジェクトの生成が行えない状態になったとき、ＧＣは実行される。アプリケーションソフトで使用されず不要と判断されたオブジェクトはＧＣによって解放される。このように、新しいオブジェクトを割り当てるための空き容量はＧＣによって確保される。
【０００６】
ＧＣの一方式では処理の高速化（ヒープ領域内のオブジェクトのシーケンシャル精査の効率化、キャッシュ効率向上）のため、仮想メモリ空間内の連続する領域をヒープ領域として獲得・管理する。以下では連続するヒープ領域上でのオブジェクト割り当て状態の遷移について簡単に説明する。
【０００７】
図１は、連続するヒープ領域上でのオブジェクト割り当てを表した一例のイメージ図である。アプリケーションソフトから動的に生成要求のあったオブジェクトはヒープ領域上に連続して割り当てられる。オブジェクトの割り当ては、ヒープ領域の低位アドレスから高位アドレス方向に向かって順に行われる。
【０００８】
図２は、連続するヒープ領域上の空き領域が不足している様子を表した一例のイメージ図である。オブジェクト生成を繰り返し行うことにより、ヒープ領域はオブジェクト割当済み領域で埋め尽くされる。ヒープ領域は空き容量が不足し、新たにオブジェクトの生成が行えなくなる。図２の状態となったとき、ＧＣは実行される。
【０００９】
図３は、連続するヒープ領域上でＧＣを実行した直後の様子を表した一例のイメージ図である。ＧＣでは、不要と判断されたオブジェクトが開放される。また、ＧＣでは使用中と判断されたオブジェクト（以下、生存オブジェクトという）がヒープ領域内に残されている。生存オブジェクトはヒープ領域の低位アドレス側に集められる。ヒープ領域の高位アドレス側には新しいオブジェクトを割り当てるための空き領域が確保される。
【００１０】
なお、ＧＣを実行しても多数の生存オブジェクトがヒープ領域内に残り、空き領域を確保できない場合は、アウト・オブ・メモリ・エラー（Out Of Memory Error）となる。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開昭５９−１５８４５９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
上記したＧＣの一方式ではプロセスの仮想メモリ空間内の連続するメモリ領域をヒープ領域として割り当てる。しかし、ライブラリのマッピングなど、ヒープ領域以外の目的で使用される領域（以下、ヒープ領域以外のメモリ領域という）の影響で、ヒープ領域として使用可能なメモリ領域は分断され、断片化してしまうことがある。ヒープ領域として使用可能なメモリ領域が断片化してしまうと、１つの連続したヒープ領域として扱えるサイズが小さくなってしまうという問題があった。
【００１３】
図４はヒープ領域以外のメモリ領域の影響で断片化したヒープ領域として使用可能なメモリ領域を表した一例のイメージ図である。図４の例では「ヒープ領域として使用可能な連続領域１」と「ヒープ領域として使用可能な連続領域２」との間に「ヒープ領域以外のメモリ領域」が存在している。
【００１４】
「ヒープ領域以外のメモリ領域」が存在するため、「ヒープ領域として使用可能な連続領域１」と「ヒープ領域として使用可能な連続領域２」とは、どちらか一方しかヒープ領域として扱えない。結果、「ヒープ領域として使用可能な連続領域１」と「ヒープ領域として使用可能な連続領域２」とは連続領域として扱うことができなかった。
【００１５】
なお、ヒープ領域を連続するメモリ領域でなく分割されたメモリ領域から獲得・管理するＧＣの方式は従来にもあった。ヒープ領域を分割されたメモリ領域から獲得・管理するＧＣの方式は、分割された不連続なメモリ領域をヒープ領域としている為、ヒープ領域以外のメモリ領域の存在に関係なく、ヒープ領域の追加獲得が行える。
【００１６】
しかし、ヒープ領域を連続するメモリ領域でなく分割されたメモリ領域から獲得・管理するＧＣの方式は、以下のデメリットの影響が大きいため、現在、ほとんど使用されていない。
【００１７】
ヒープ領域を連続するメモリ領域でなく分割されたメモリ領域から獲得・管理するＧＣの方式は、アドレス管理テーブルを用いることで、ヒープ領域を仮想的に連続領域にみせている。このため、各オブジェクトにアクセスする際はアドレス管理テーブルを経由して実アドレスを求める必要があり性能に大きな問題があった。例えばヒープ領域を連続するメモリ領域から獲得・管理するＧＣの方式では、実アドレスでオブジェクトにアクセスするため、アドレス管理テーブルを経由しない分、処理が速い。
【００１８】
また、ヒープ領域を連続するメモリ領域でなく分割されたメモリ領域から獲得・管理するＧＣの方式は、アドレス管理テーブル分のメモリ領域を余分に必要とするという問題もあった。
【００１９】
本発明の一実施形態は、上記の点に鑑みなされたもので、ヒープ領域を連続領域として獲得した場合の処理が速い等の優位性を保持したまま、分割されたヒープ領域を連続したヒープ領域として管理することを可能にしたメモリ管理機能を有するプログラム及び装置を提供することを目的とする。
【課題を解決するための手段】
【００２０】
上記の課題を解決するため、本発明の一実施形態は、ヒープ領域以外のメモリ領域に対し、ヒープ領域内に格納されるオブジェクト用のヘッダーを付加して、前記メモリ領域を擬似的なオブジェクトとして扱い、前記メモリ領域により分割されている複数のヒープ領域を１つの連続したヒープ領域として扱うメモリ管理手段として機能させるためのメモリ管理機能を有するプログラムである。
【００２１】
なお、本発明の一実施形態の構成要素、表現または構成要素の任意の組合せを、方法、装置、システム、コンピュータプログラム、記録媒体、データ構造などに適用したものも本発明の態様として有効である。
【発明の効果】
【００２２】
上述の如く、本発明の一実施形態によれば、ヒープ領域を連続領域として獲得した場合の処理が速い等の優位性を保持したまま、分割されたヒープ領域を連続したヒープ領域として管理することを可能にしたメモリ管理機能を有するプログラム及び装置を提供可能である。
【図面の簡単な説明】
【００２３】
【図１】連続するヒープ領域上でのオブジェクト割り当てを表した一例のイメージ図である。
【図２】連続するヒープ領域上の空き領域が不足している様子を表した一例のイメージ図である。
【図３】連続するヒープ領域上でＧＣを実行した直後の様子を表した一例のイメージ図である。
【図４】ヒープ領域以外のメモリ領域の影響で断片化したヒープ領域として使用可能なメモリ領域を表した一例のイメージ図である。
【図５】メモリ管理機能を有する装置の一例のハードウェア構成図である。
【図６】メモリ管理機能を有する装置の一例のソフトウェア構成図である。
【図７】仮想マシンを実行するプロセスの仮想メモリ空間を表した模式図である。
【図８】ヒープ領域以外のメモリ領域をオブジェクトとして扱う方法を表した一例のイメージ図である。
【図９】ヒープ領域以外のメモリ領域をオブジェクトとして扱ったときの様子を表した一例のイメージ図である。
【図１０】プロセス実行中に追加の連続領域を獲得できない様子を表した一例のイメージ図である。
【図１１】擬似オブジェクト化されたヒープ領域以外のメモリ領域がＧＣを実行しても移動しない様子を表した一例のイメージ図である。
【図１２】移動不可能オブジェクト管理テーブルの一例の構成図である。
【図１３】ＧＣ対象ヒープ領域の管理用データを表した一例の説明図である。
【図１４】従来のヒープ領域の獲得・開放の処理手順を表した一例のフローチャートである。
【図１５】従来のヒープ領域に対するオブジェクト生成要求の処理手順を表した一例のフローチャートである。
【図１６】本実施例のヒープ領域の獲得・開放の処理手順を表した一例のフローチャートである。
【図１７】本実施例のヒープ領域に対するオブジェクト生成要求の処理手順を表した一例のフローチャートである。
【図１８】ヒープ領域の連続領域拡張機能の処理手順を表した一例のフローチャートである。
【図１９】ステップＳ３５の処理終了時のヒープ領域周辺の構成を表した一例のイメージ図である。
【図２０】ステップＳ４９の処理終了時のヒープ領域周辺の構成を表した一例のイメージ図である。
【図２１】ステップＳ５５の処理終了時のヒープ領域周辺の構成を表した一例のイメージ図である。
【図２２】ステップＳ３７の処理終了時のヒープ領域周辺の構成を表した一例のイメージ図である。
【発明を実施するための形態】
【００２４】
次に、本発明を実施するための形態を、以下の実施例に基づき図面を参照しつつ説明していく。
【００２５】
図５は、メモリ管理機能を有する装置の一例のハードウェア構成図である。図５のメモリ管理機能を有する装置１０は、バスＢで相互に接続されている入力装置１１，出力装置１２，ドライブ装置１３，補助記憶装置１４，主記憶装置１５，演算処理装置１６及びインターフェース装置１７を有する。図５のハードウェア構成図は入力装置１１，出力装置１２，ドライブ装置１３，補助記憶装置１４，主記憶装置１５，演算処理装置１６及びインターフェース装置１７が一つの筐体内に設けられることを示したものではなく、複数の筐体内に分離して設けてもよい。
【００２６】
入力装置１１はキーボードやマウス等である。入力装置１１は、各種信号を入力するために用いられる。出力装置１２はディスプレイ装置等である。出力装置１２は、各種ウインドウやデータ等を表示するために用いられる。インターフェース装置１７はモデム，ＬＡＮカード等である。インターフェース装置１７は、ネットワークに接続する為に用いられる。つまり、インターフェース装置１７はネットワークに接続しないのであれば必須でない。
【００２７】
本実施例のメモリ管理機能を有するプログラムは、装置１０を制御する各種プログラムの少なくとも一部である。メモリ管理機能を有するプログラムは例えば記録媒体１８の配布やネットワークからのダウンロードなどによって提供される。プログラムを記録した記録媒体１８は、ＣＤ−ＲＯＭ、フレキシブルディスク、光磁気ディスク等の様に情報を光学的，電気的或いは磁気的に記録する記録媒体、ＲＯＭ、フラッシュメモリ等の様に情報を電気的に記録する半導体メモリ等、様々なタイプの記録媒体を用いることができる。
【００２８】
また、プログラムを記録した記録媒体１８がドライブ装置１３にセットされると、プログラムは記録媒体１８からドライブ装置１３を介して補助記憶装置１４にインストールされる。ネットワークからダウンロードされたプログラムは、インターフェース装置１７を介して補助記憶装置１４にインストールされる。
【００２９】
補助記憶装置１４は、インストールされたプログラムを格納すると共に、必要なファイル，データ等を格納する。主記憶装置１５は、プログラムの起動時に補助記憶装置１４からプログラムを読み出して格納する。そして、演算処理装置１６は主記憶装置１５に格納されたプログラムに従って、後述するような各種処理を実現している。
【００３０】
図６はメモリ管理機能を有する装置の一例のソフトウェア構成図である。なお、図６では一例としてＪＶＭ実行時のソフトウェア構成図を表している。仮想マシン２０は本実施例のメモリ管理機能を実装したプロセスの一例である。
【００３１】
図６の装置１０は、ハードウェア上でＯＳ（図示せず）が動作し、ＯＳ上で仮想マシン２０が動作し、ユーザアプリケーション３０は仮想マシン２０上で動作し，共有ライブラリ４０は仮想マシン２０を実行するプロセスの仮想メモリ空間５０にロードされる。仮想マシン２０上では、クラスローダ２１，インタプリタ・動的コンパイラ２２，メモリ管理機能２３が動作している。メモリ管理機能２３は、後述の移動不可能オブジェクト管理テーブル２４及びＧＣ対象ヒープ領域の管理用データ２５を有している。
【００３２】
図７は仮想マシンを実行するプロセスの仮想メモリ空間を表した模式図である。仮想マシン２０を実行するプロセスの仮想メモリ空間５０内には起動時に指定された最大ヒープ領域サイズのヒープ領域が確保される。ヒープ領域はＧＣ対象となる。ユーザアプリケーション３０はオブジェクトを仮想マシン２０経由でＧＣ対象のヒープ領域に生成する。また、メモリ管理機能２３はＧＣで不要と判断したオブジェクトの開放を行う。なお、仮想マシン２０を実行するプロセスの仮想メモリ空間５０内には、共有ライブラリ４０のマッピングなど、ヒープ領域以外の目的で使用される領域（ヒープ領域以外のメモリ領域）も割り当てられる。
【００３３】
この時、「ヒープ領域以外のメモリ領域」が、図4のように割り当てられた場合は、ヒープ領域として使用可能な連続領域は「ヒープ領域として使用可能な連続領域１」と「ヒープ領域として使用可能な連続領域２」とに分断される。結果として、「ヒープ領域として使用可能な連続領域１」と「ヒープ領域として使用可能な連続領域２」とは、どちらか一方しかヒープ領域として扱えなくなる。
【００３４】
そこで、本実施例は図８に示すようにヒープ領域以外のメモリ領域を１つのオブジェクト（擬似的なオブジェクト）として扱うことで、ヒープ領域以外のメモリ領域をヒープ領域内に格納することが可能となる。
【００３５】
図８は、ヒープ領域以外のメモリ領域をオブジェクトとして扱う方法を表した一例のイメージ図である。ヒープ領域以外のメモリ領域を１つのオブジェクトとして扱うことにより、「ヒープ領域として使用可能な連続領域１」と「ヒープ領域として使用可能な連続領域２」とは連続する一つのヒープ領域とすることができる。ヒープ領域以外のメモリ領域や空き領域の状況はシステム関数（例：実行システムがＷｉｎｄｏｗｓ（登録商標）ならばＶｉｒｔｕａｌＱｕｅｒｙ（）を使用）などを用いて確認する。
【００３６】
ユーザアプリケーション３０から生成された通常のオブジェクトは、ヘッダー６１及びデータ域６２で構成されている。ヘッダー６１はクラス情報，サイズ情報，他からの参照情報（システムによっては別の場所で一括管理することもある）等を含む。ヒープ領域以外のメモリ領域６３をオブジェクトとして扱う為には、通常のオブジェクトと同じようにヘッダー６４を付け加える。そして、ヒープ領域以外のメモリ領域６３はデータ域として扱う。図８に示す方法では、現在のヒープ領域の終端に、常にヘッダー用の領域を確保しておく必要がある。しかし、確保しておく必要のあるヘッダー用の領域は十数バイト程度なのでユーザアプリケーション３０の実行に、ほとんど影響しない。
【００３７】
図９はヒープ領域以外のメモリ領域をオブジェクトとして扱ったときの様子を表した一例のイメージ図である。ヒープ領域以外のメモリ領域はメモリ管理機能２３から１つのオブジェクトとして認識される。
【００３８】
結果として、メモリ管理機能２３はヒープ領域以外のメモリ領域により分断されていた２つの「ヒープ領域として使用可能な連続領域」を、１つの「ヒープ領域として使用可能な連続領域」として扱うことで、より大きな１つの「ヒープ領域として使用可能な連続領域」を獲得できる。
【００３９】
プロセス起動時に指定したヒープ領域のサイズが小さすぎる場合は、ＧＣを実行してもヒープ領域内に空き領域を確保できず、アウト・オブ・メモリ・エラーとなり、システム停止に繋がる可能性がある。アウト・オブ・メモリ・エラーは、プロセス実行中に追加の連続領域を獲得することができれば避けられる。
【００４０】
しかしながら、図１０に示すように「ヒープ領域以外のメモリ領域」がヒープ領域に隣接している場合は、プロセス実行中に追加の連続領域を獲得できない。図１０はプロセス実行中に追加の連続領域を獲得できない様子を表した一例のイメージ図である。
【００４１】
図１０ではプロセス起動時に獲得したヒープ領域に隣接するようにヒープ領域以外のメモリ領域が割り当てられている。図１０では、ＧＣを実行しても多数の生存オブジェクトがヒープ領域内に残り、空き容量が確保できていない。そこで、プロセス実行中に追加の連続領域を獲得したいが、図１０の例ではプロセス起動時に獲得したヒープ領域に隣接するようにヒープ領域以外のメモリ領域が割り当てられているため、プロセス実行中に追加の連続領域を獲得できない。
【００４２】
結局、従来はプロセスを一度停止し、プロセス再起動時にヒープ領域のサイズを指定し直さなければならなかった。一方、本実施例はプロセス起動時に獲得したヒープ領域に隣接する「ヒープ領域以外のメモリ領域」をオブジェクトとして扱うことで、プロセス実行中に追加の連続領域を獲得できる。本実施例ではプロセスを停止することなくヒープ領域に連続領域を追加（ヒープ領域の拡張）することが可能となる。
【００４３】
なお、プロセスを停止せずにヒープ領域の拡張を行う場合の拡張サイズは、プロセスの起動から現在までのメモリ使用状況の統計をとり、最適な拡張サイズを算出する方法と予めユーザに許容量を指定させる方法とがある。
【００４４】
ヒープ領域以外のメモリ領域をオブジェクトとして扱う場合、擬似オブジェクト化されたヒープ領域以外のメモリ領域は、ＧＣ等のヒープ領域の管理を行うメモリ管理機能２３から、ひとつの生存オブジェクトと見なされる。しかし、擬似オブジェクト化されたヒープ領域以外のメモリ領域は、本来、ライブラリのマッピングなどに使われている領域であるため、他からのアクセスもある。
【００４５】
この為、擬似オブジェクト化されたヒープ領域以外のメモリ領域は通常のオブジェクトと異なり、常に生存オブジェクトとして残される、かつ、ＧＣを実行しても移動しないオブジェクトとして扱われる必要がある。図１１は擬似オブジェクト化されたヒープ領域以外のメモリ領域がＧＣを実行しても移動しない様子を表した一例のイメージ図である。
【００４６】
オブジェクトとして扱うヒープ領域以外のメモリ領域は複数になる場合もある為、図１２に示すような移動不可能オブジェクト管理テーブル２４によって管理される。図１２は移動不可能オブジェクト管理テーブルの一例の構成図である。移動不可能オブジェクト管理テーブル２４は領域番号，開始アドレス，サイズをデータ項目として有する。
【００４７】
領域番号はオブジェクトとして扱うヒープ領域以外のメモリ領域を識別する為のものである。開始アドレスはヒープ領域以外のメモリ領域を擬似オブジェクトとして扱うときの開始アドレスである。また、サイズは擬似オブジェクトとして扱うメモリ領域のサイズである。移動不可能オブジェクト管理テーブル２４はメモリ管理機能２３が有する。
【００４８】
メモリ管理機能２３は前述したように移動不可能オブジェクト管理テーブル２４の他にＧＣ対象ヒープ領域の管理用データ２５を有する。図１３はＧＣ対象ヒープ領域の管理用データを表した一例の説明図である。ＧＣ対象ヒープ領域の管理用データ２５は後述のフローチャートで使用するデータ（変数）名と用途とを表している。なお、各データの詳細は後述する。
【００４９】
以下では、本実施例によるメモリ管理機能についてフローチャートを参照しつつ説明していく。まず、本実施例によるメモリ管理機能の理解を容易とするため、従来の処理手順について説明する。
【００５０】
図１４は従来のヒープ領域の獲得・開放の処理手順を表した一例のフローチャートである。ステップＳ１に進み、メモリ管理機能２３はプロセス起動時に指定された最大ヒープ領域サイズ（max_heap_size）を、オブジェクトの割り当て先である仮想メモリ空間５０内のＧＣ対象のヒープ領域の最大サイズとする。
【００５１】
ステップＳ２に進み、メモリ管理機能２３は、プロセスの仮想メモリ空間５０から最大ヒープ領域サイズ分の連続領域の獲得を試みる。プロセスの仮想メモリ空間５０から最大ヒープ領域サイズ分の連続領域が獲得できれば、ステップＳ３に進む。なお、プロセスの仮想メモリ空間５０から最大ヒープ領域サイズ分の連続領域が獲得できなければ、メモリ管理機能２３はステップＳ６に進み、初期化時エラーとなる。
【００５２】
ステップＳ３ではユーザアプリケーション３０が起動される。ユーザアプリケーション３０は、ＧＣ対象のヒープ領域にオブジェクトを生成する。ステップＳ４ではユーザアプリケーション３０が終了される。ステップＳ５に進み、ステップＳ２でプロセスの仮想メモリ空間５０から獲得した最大ヒープ領域サイズ分の連続領域の開放を行う。
【００５３】
図１５は、従来のヒープ領域に対するオブジェクト生成要求の処理手順を表した一例のフローチャートである。ステップＳ１１に進み、メモリ管理機能２３はオブジェクト生成要求をユーザアプリケーション３０から受ける。
【００５４】
ステップＳ１２に進み、メモリ管理機能２３は生成要求のあったオブジェクトを割り当てる為の空き容量がヒープ領域にあるか否かを判定する。生成要求のあったオブジェクトを割り当てる為の空き容量がヒープ領域にあれば、メモリ管理機能２３はステップＳ１５に進み、ＧＣ対象のヒープ領域に生成要求のあったオブジェクトを割り当てる。生成要求のあったオブジェクトを割り当てる為の空き容量がヒープ領域に無ければ、メモリ管理機能２３はステップＳ１３に進み、ＧＣを実行する。
【００５５】
ステップＳ１４に進み、メモリ管理機能２３は生成要求のあったオブジェクトを割り当てる為の空き容量を、ＧＣの実行により確保できた場合、ステップＳ１５に進み、ＧＣ対象のヒープ領域に生成要求のあったオブジェクトを割り当てる。なお、メモリ管理機能２３は生成要求のあったオブジェクトを割り当てる為の空き容量を、ＧＣの実行により確保できなかった場合、ステップＳ１６に進み、アウト・オブ・メモリ・エラーとなる。
【００５６】
図１６は本実施例のヒープ領域の獲得・開放の処理手順を表した一例のフローチャートである。なお、図１６のステップＳ２１〜Ｓ２５の処理は図１４のステップＳ１〜Ｓ５の処理と同様であるため、説明を省略する。
【００５７】
ステップＳ２２において、プロセスの仮想メモリ空間５０から最大ヒープ領域サイズ分の連続領域が獲得できなければ、メモリ管理機能２３はステップＳ２６に進む。ステップＳ２６に進み、メモリ管理機能２３は、管理用データ「want_size」に最大ヒープ領域サイズ（max_heap_size）を代入する。また、メモリ管理機能２３は管理用データ「start_addr」に「０」を代入する。
【００５８】
管理用データ「want_size」は新たに獲得したいヒープ領域サイズのうち、未獲得分のヒープ領域サイズを表す。また、管理用データ「start_addr」は獲得したいヒープ領域の先頭アドレスを表す。
【００５９】
ステップＳ２７に進み、メモリ管理機能２３は後述するヒープ領域の連続領域拡張機能を行うことで、プロセスの仮想メモリ空間５０から最大ヒープ領域サイズ分の連続領域の獲得を試みる。
【００６０】
ステップＳ２８に進み、メモリ管理機能２３はステップＳ２７のヒープ領域の連続領域拡張機能を行うことにより、管理用データ「want_size」が０以下になっているか否かを判定する。管理用データ「want_size」が０以下になっていれば、新たに獲得したいヒープ領域サイズを獲得できているため、メモリ管理機能２３はステップＳ２３に進む。
【００６１】
管理用データ「want_size」が０以下になっていなければ、新たに獲得したいヒープ領域サイズを獲得できていないため、メモリ管理機能２３はステップＳ２９に進み、初期化時エラーとなる。
【００６２】
図１６に表した本実施例のヒープ領域の獲得・開放の処理手順では、プロセスの仮想メモリ空間５０から最大ヒープ領域サイズ分の連続領域が獲得できない場合に、ヒープ領域の連続領域拡張機能を行うことで、初期化時エラーを発生しにくくできる。
【００６３】
図１７は本実施例のヒープ領域に対するオブジェクト生成要求の処理手順を表した一例のフローチャートである。ステップＳ３１に進み、メモリ管理機能２３はオブジェクト生成要求をユーザアプリケーション３０から受ける。
【００６４】
ステップＳ３２に進み、メモリ管理機能２３はヘッダー分の領域（十数バイト）と生成要求のあったオブジェクトを割り当てる為の空き容量とがヒープ領域にあるか否かを判定する。ヘッダー分の領域と生成要求のあったオブジェクトを割り当てる為の空き容量とがヒープ領域にあれば、メモリ管理機能２３はステップＳ３８に進み、ＧＣ対象のヒープ領域に生成要求のあったオブジェクトを割り当てる。
【００６５】
一方、ヘッダー分の領域と生成要求のあったオブジェクトを割り当てる為の空き容量とがヒープ領域に無ければ、メモリ管理機能２３はステップＳ３３に進む。ステップＳ３３ではメモリ管理機能２３がＧＣを実行する。
【００６６】
ステップＳ３４に進み、メモリ管理機能２３はヘッダー分の領域と生成要求のあったオブジェクトを割り当てる為の空き容量とを、ＧＣの実行により確保できた場合、ステップＳ３８に進み、ＧＣ対象のヒープ領域に生成要求のあったオブジェクトを割り当てる。
【００６７】
なお、メモリ管理機能２３はヘッダー分の領域と生成要求のあったオブジェクトを割り当てる為の空き容量とを、ＧＣの実行により確保できなかった場合、ステップＳ３５に進む。ステップＳ３５では、メモリ管理機能２３が、追加で獲得するヒープ領域のサイズを算出する。メモリ管理機能２３は、管理用データ「want_size」に算出した追加で獲得するヒープ領域のサイズを代入する。また、メモリ管理機能２３は管理用データ「start_addr」に現在のヒープ領域の終端を代入する。
【００６８】
ステップＳ３６に進み、メモリ管理機能２３は後述するヒープ領域の連続領域拡張機能を行うことで、プロセスの仮想メモリ空間５０から算出した追加で獲得するヒープ領域のサイズ分の連続領域の獲得を試みる。
【００６９】
ステップＳ３７に進み、メモリ管理機能２３はステップＳ３６のヒープ領域の連続領域拡張機能を行うことにより、管理用データ「want_size」が０以下になっているか否かを判定する。管理用データ「want_size」が０以下になっていれば、新たに獲得したいヒープ領域サイズを獲得できているため、メモリ管理機能２３はステップＳ３８に進む。
【００７０】
管理用データ「want_size」が０以下になっていなければ、新たに獲得したいヒープ領域サイズを獲得できていないため、メモリ管理機能２３はステップＳ３９に進み、アウト・オブ・メモリ・エラーとなる。となる。
【００７１】
図１７に表した本実施例のヒープ領域の獲得・開放の処理手順ではＧＣ実行後、ヒープ領域にオブジェクトを割り当てる空き領域を確保できない場合、ヒープ領域の連続領域拡張機能を行うことで、アウト・オブ・メモリ・エラーを発生しにくくできる。
【００７２】
図１８は、ヒープ領域の連続領域拡張機能の処理手順を表した一例のフローチャートである。ステップＳ４１に進み、メモリ管理機能２３は管理用データ「attempt_size」に管理用データ「want_size」の値を代入する。管理用データ「attempt_size」は仮想メモリ空間５０から実際にヒープ領域の獲得を試みるサイズを表す。
【００７３】
ステップＳ４２に進み、メモリ管理機能２３は管理用データ「start_addr」と「attempt_size」とを加算したアドレスが、管理用データ「limit_addr」のアドレスより小さいか否かを判定する。管理用データ「limit_addr」は仮想メモリ空間５０内でヒープ領域が獲得できる限界のアドレスを表す。
【００７４】
メモリ管理機能２３は、管理用データ「start_addr」と「attempt_size」とを加算したアドレスが、管理用データ「limit_addr」のアドレスより小さければ、ステップＳ４３に進み、プロセスの仮想メモリ空間５０の管理用データ「start_addr」から「attempt_size」分をヒープ領域とするメモリ領域の獲得に成功するかを判定する。
【００７５】
ステップＳ４３でメモリ領域の獲得に成功すれば、メモリ管理機能２３はステップＳ４６に進み、管理用データ「want_size」から「attempt_size」を減算する。ステップＳ４７に進み、メモリ管理機能２３は管理用データ「want_size」が０以下になっているか否かを判定する。管理用データ「want_size」が０以下になっていれば、新たに獲得したいヒープ領域サイズを獲得できているため、メモリ管理機能２３は図１８のフローチャートの処理を終了する。
【００７６】
管理用データ「want_size」が０以下になっていなければ、新たに獲得したいヒープ領域サイズを獲得できていないため、メモリ管理機能２３はステップＳ４８に進み、ステップＳ４３で獲得したメモリ領域の終端を管理用データ「start_addr」に代入する。ステップＳ４８の処理後、メモリ管理機能２３はステップＳ４９に進む。
【００７７】
ステップＳ４３でメモリ領域の獲得に失敗すれば、メモリ管理機能２３はステップＳ４４に進み、管理用データ「attempt_size」から「align_size」を減算する。管理用データ「align_size」はヒープ領域獲得時のアライメントサイズを表す。メモリ管理機能２３はアライメントサイズ毎に管理用データ「attempt_size」を調整する。ステップＳ４５に進み、メモリ管理機能２３は管理用データ「attempt_size」が「align_size」より小さいかを判定する。
【００７８】
管理用データ「attempt_size」が「align_size」より小さくなければ、メモリ管理機能２３はステップＳ４３に戻る。管理用データ「attempt_size」が「align_size」より小さければ、メモリ管理機能２３はステップＳ４９に進む。
【００７９】
ステップＳ４９では、メモリ管理機能２３が、管理用データ「start_addr」のアドレスから管理用データ「align_size」分の領域のメモリ獲得状況を調査し、管理用データ「start_addr」のアドレスから管理用データ「align_size」分の領域にマッピングされている「ヒープ領域以外のメモリ領域」の確認を行う。管理用データ「start_addr」のアドレスから管理用データ「align_size」分の領域にマッピングされている「ヒープ領域以外のメモリ領域」があれば、メモリ管理機能２３は「ヒープ領域以外のメモリ領域」の先頭アドレスを管理用データ「om_bottom」に代入し、サイズを管理用データ「om_size」に代入する。
【００８０】
ステップＳ５０に進み、メモリ管理機能２３は管理用データ「start_addr」のアドレスから管理用データ「om_bottom」のアドレスまでの領域を、ヒープ領域として追加獲得する。
【００８１】
ステップＳ５１に進み、メモリ管理機能２３は管理用データ「om_bottom」のアドレスの前にオブジェクトのヘッダー６４を付け加え、管理用データ「om_bottom」から管理用データ「om_size」のサイズ分がデータ域６３となるオブジェクトとして扱えるようにする。
【００８２】
ステップＳ５２に進み、メモリ管理機能２３は図１２に示した移動不可能オブジェクト管理テーブルに、ヒープ領域以外のメモリ領域を有したオブジェクトとして登録する。図１２の移動不可能オブジェクト管理テーブルにはヒープ領域以外のメモリ領域を有したオブジェクトの開始アドレス及びサイズが登録される。開始アドレスは管理用データ「om_bottom」のアドレスからヘッダー６４のサイズを減算したものである。サイズは管理用データ「om_size」のサイズにヘッダー６４のサイズを加算したものである。
【００８３】
ステップＳ５３に進み、メモリ管理機能２３は管理用データ「om_bottom」のアドレスから管理用データ「start_addr」のアドレスを減算したサイズを管理用データ「want_size」から減算する。そして、メモリ管理機能２３は管理用データ「attempt_size」に管理用データ「want_size」の値を代入する。
【００８４】
ステップＳ５４に進み、メモリ管理機能２３は管理用データ「want_size」が０以下になっているか否かを判定する。管理用データ「want_size」が０以下になっていれば、新たに獲得したいヒープ領域サイズを獲得できているため、メモリ管理機能２３は図１８のフローチャートの処理を終了する。管理用データ「want_size」が０以下になっていなければ、メモリ管理機能２３はステップＳ５５に進み、管理用データ「om_bottom」のアドレスに「om_size」のサイズを加算したアドレスを管理用データ「start_addr」のアドレスに代入する。ステップＳ５５の処理後、メモリ管理機能２３はステップＳ４３に戻り処理を続ける。
【００８５】
なお、ステップＳ４２において、メモリ管理機能２３は、管理用データ「start_addr」と「attempt_size」とを加算したアドレスが、管理用データ「limit_addr」のアドレスより小さくなければ、新たに獲得したいヒープ領域サイズを獲得することができないので、図１８のフローチャートの処理を終了する。
【実施例１】
【００８６】
以下では図１７及び図１８に表したフローチャートの処理の具体例を、図１９〜図２２のイメージ図を参照しつつ説明する。現在のヒープ領域は、１００〜３００番地であるとする。１００〜２９０番地はオブジェクト割当済み領域であるとする。２９０〜３００番地はヒープ領域内の空き領域であるとする。３００〜３３０番地はヒープ領域として使用可能な領域であるとする。３３０〜３５０番地はヒープ領域以外のメモリ領域であるとする。３５０〜１０００番地はヒープ領域として使用可能な領域であるとする。１０００番地はプロセスの使用可能な上限とする。なお、オブジェクトのヘッダーサイズは「２」とする。
【００８７】
ユーザアプリケーション３０からサイズ「２０」のオブジェクト生成要求があった場合を一例として、図１７及び図１８のフローチャートの処理を順番に追う。
【００８８】
ステップＳ３１に進み、メモリ管理機能２３はサイズ「２０」のオブジェクト生成要求をユーザアプリケーション３０から受ける。ステップＳ３２に進み、メモリ管理機能２３はヘッダー分の領域（サイズ２）とオブジェクト生成要求のあったサイズ「２０」とを割り当てる為の空き容量がヒープ領域内にあるか否かを判定する。
【００８９】
ヘッダー分の領域（サイズ２）とオブジェクト生成要求のあったサイズ「２０」とを割り当てる為の空き容量がヒープ領域内に無いため、メモリ管理機能２３はステップＳ３３に進む。ステップＳ３３ではメモリ管理機能２３がＧＣを実行する。ここでは空き容量を増やせなかったものとして説明を続ける。
【００９０】
ステップＳ３４に進み、メモリ管理機能２３は、ヘッダー分の領域（サイズ２）とオブジェクト生成要求のあったサイズ「２０」とを割り当てる為の空き容量を、ＧＣの実行により確保できなかった為、ステップＳ３５に進む。ステップＳ３５では、メモリ管理機能２３が、追加で獲得するヒープ領域のサイズとして例えば「６０」を算出する。
【００９１】
メモリ管理機能２３は、管理用データ「want_size」に算出した追加で獲得するヒープ領域のサイズ「６０」を代入する。また、メモリ管理機能２３は管理用データ「start_addr」に現在のヒープ領域の終端「３００番地」を代入する。
【００９２】
ステップＳ３５の処理終了時のヒープ領域周辺の構成と各データの示す位置とは図１９のようになる。図１９はステップＳ３５の処理終了時のヒープ領域周辺の構成を表した一例のイメージ図である。
【００９３】
ステップＳ３６の処理は図１８のフローチャートを用いて説明する。ステップＳ４１に進み、メモリ管理機能２３は管理用データ「attempt_size」に管理用データ「want_size」の値「６０」を代入する。
【００９４】
ステップＳ４２に進み、メモリ管理機能２３は管理用データ「start_addr」の値「３００番地」と「attempt_size」の値「６０」とを加算したアドレス「３６０番地」が、管理用データ「limit_addr」のアドレス「１０００番地」より小さいため、ステップＳ４３に進む。
【００９５】
ステップＳ４３に進み、メモリ管理機能２３は、３３０〜３５０番地にヒープ領域以外のメモリ領域が存在するため、管理用データ「start_addr」の値「３００番地」から「attempt_size」の値「６０」分のメモリ領域の獲得に失敗し、ステップＳ４４に進む。
【００９６】
ステップＳ４４に進み、メモリ管理機能２３は管理用データ「attempt_size」の値「６０」から「align_size」の値として例えば「４」を減算し、新たな管理用データ「attempt_size」の値として「５６」を代入する。
【００９７】
ステップＳ４５に進み、メモリ管理機能２３は管理用データ「attempt_size」の値「５６が「align_size」の値「４」より小さくないため、ステップＳ４３に戻る。メモリ管理機能２３は管理用データ「attempt_size」の値が「２８」になるまでステップＳ４３〜Ｓ４５の処理を繰り返す。
【００９８】
ステップＳ４３に進み、メモリ管理機能２３は、３３０〜３５０番地にヒープ領域以外のメモリ領域が存在するが、管理用データ「start_addr」の値「３００番地」から「attempt_size」の値「２８」分のメモリ領域の獲得に成功する。メモリ管理機能２３はステップＳ４６に進み、管理用データ「want_size」の値「６０」から「attempt_size」の値「２８」を減算し、新たな管理用データ「want_size」の値として「３２」を代入する。
【００９９】
ステップＳ４７に進み、メモリ管理機能２３は管理用データ「want_size」が０以下になっていないため、ステップＳ４８に進む。ステップＳ４８では、メモリ管理機能２３がステップＳ４３で獲得したメモリ領域の終端である「３２８番地」を管理用データ「start_addr」に代入する。
【０１００】
ステップＳ４９に進み、メモリ管理機能２３は、管理用データ「start_addr」のアドレス「３２８番地」から管理用データ「align_size」の値「４」分の領域のメモリ獲得（メモリマッピング）状況を調査し、「ヒープ領域以外のメモリ領域」の確認を行う。「ヒープ領域以外のメモリ領域」があるため、メモリ管理機能２３は「ヒープ領域以外のメモリ領域」の先頭アドレス「３３０番地」を管理用データ「om_bottom」に代入し、「ヒープ領域以外のメモリ領域」のサイズ「２０」を管理用データ「om_size」に代入する。
【０１０１】
ステップＳ４９の処理終了時のヒープ領域周辺の構成と各データの示す位置とは図２０のようになる。図２０はステップＳ４９の処理終了時のヒープ領域周辺の構成を表した一例のイメージ図である。
【０１０２】
ステップＳ５０に進み、メモリ管理機能２３は管理用データ「start_addr」のアドレス「３２８番地」から管理用データ「om_bottom」のアドレス「３３０番地」までの領域を、ヒープ領域として追加獲得する。
【０１０３】
ステップＳ５１に進み、メモリ管理機能２３は管理用データ「om_bottom」のアドレス「３３０番地」の前に、サイズが「２」のオブジェクトのヘッダー６４を付け加えることで、３２８〜３５０番地を１つのオブジェクトとして扱えるようにする。
【０１０４】
ステップＳ５２に進み、メモリ管理機能２３は図１２に示した移動不可能オブジェクト管理テーブルに、開始アドレス「３２８番地」、サイズ「２２」のヒープ領域以外のメモリ領域として登録する。
【０１０５】
ステップＳ５３に進み、メモリ管理機能２３は管理用データ「om_bottom」のアドレス「３３０番地」から管理用データ「start_addr」のアドレス「３２８番地」を減算したサイズ「２」を管理用データ「want_size」の値「３２」から減算する。メモリ管理機能２３は管理用データ「attempt_size」に管理用データ「want_size」の値「３０」を代入する。
【０１０６】
ステップＳ５４に進み、メモリ管理機能２３は管理用データ「want_size」の値が０以下になっていないため、ステップＳ５５に進み、管理用データ「om_bottom」のアドレス「３３０番地」に「om_size」のサイズ「２０」を加算したアドレス「３５０番地」を管理用データ「start_addr」のアドレスに代入する。ステップＳ５５の処理後、メモリ管理機能２３はステップＳ４２の処理に戻る。
【０１０７】
ステップＳ５５の処理終了時のヒープ領域周辺の構成と各データの示す位置とは図２１のようになる。図２１はステップＳ５５の処理終了時のヒープ領域周辺の構成を表した一例のイメージ図である。
【０１０８】
ステップＳ４３に進み、メモリ管理機能２３は、管理用データ「start_addr」の値「３５０番地」から「attempt_size」の値「３０」分のメモリ領域の獲得に成功し、ステップＳ４６に進む。
【０１０９】
メモリ管理機能２３はステップＳ４６に進み、管理用データ「want_size」の値「３０」から「attempt_size」の値「３０」を減算し、新たな管理用データ「want_size」の値として「０」を代入する。ステップＳ４７に進み、メモリ管理機能２３は管理用データ「want_size」が０以下になっているため、図１８のフローチャートの処理、言い換えれば図１７のステップＳ３６の処理を終了する。
【０１１０】
ステップＳ３７に進み、メモリ管理機能２３は管理用データ「want_size」が０以下になっているため、ステップＳ３８に進む。ステップＳ３７の処理終了時のヒープ領域周辺の構成と各データの示す位置とは図２２のようになる。図２２はステップＳ３７の処理終了時のヒープ領域周辺の構成を表した一例のイメージ図である。
【０１１１】
ステップＳ３８に進み、メモリ管理機能２３は新たに獲得した空き領域を含む「２９０〜３１０番地」に対し、ユーザアプリケーション３０から生成要求のあったサイズ「２０」のオブジェクトが割り当て可能となると同時に、「３１０〜３２８番地」および、「３３０〜３５０番地」の領域もヒープ領域として使用可能な領域となる。
【０１１２】
本発明は、以下に記載する付記のような構成が考えられる。
（付記１）
コンピュータを、
ヒープ領域以外のメモリ領域にオブジェクト用のヘッダーを付加して、前記メモリ領域を擬似的なオブジェクトとして扱い、前記メモリ領域により分割されている複数のヒープ領域を１つの連続したヒープ領域として扱うメモリ管理手段として機能させるためのメモリ管理機能を有するプログラム。
（付記２）
前記メモリ管理手段は、前記メモリ領域の存在により、指定された最大ヒープ領域サイズの獲得ができなければ、ヒープ領域以外のメモリ領域にオブジェクト用のヘッダーを付加して前記メモリ領域を擬似的なオブジェクトとして扱い、前記メモリ領域により分割されている複数のヒープ領域を１つの連続したヒープ領域として扱うことで、前記ヒープ領域を拡張し、指定された最大ヒープ領域サイズを獲得する付記１記載のメモリ管理機能を有するプログラム。
（付記３）
前記メモリ管理手段は、前記オブジェクトが前記ヒープ領域へ動的に割り当てられたことにより前記ヒープ領域に空き領域がなくなると、前記ヒープ領域へ動的に割り当てられた前記オブジェクトのうち使用されなくなった前記オブジェクトを開放すると共に、前記ヒープ領域へ動的に割り当てられた前記オブジェクトのうち使用されている前記オブジェクトを集めて、前記ヒープ領域に連続した空き領域を生成する付記１記載のメモリ管理機能を有するプログラム。
（付記４）
前記メモリ管理手段は、前記ヒープ領域へ動的に割り当てられた前記オブジェクトのうち使用されている前記オブジェクトを集める際、前記擬似的なオブジェクトを管理するテーブルを参照して、前記擬似的なオブジェクトを移動させない付記３記載のメモリ管理機能を有するプログラム。
（付記５）
メモリ管理機能を有する装置であって、
ヒープ領域以外のメモリ領域にオブジェクト用のヘッダーを付加して、前記メモリ領域を擬似的なオブジェクトとして扱い、前記メモリ領域により分割されている複数のヒープ領域を１つの連続したヒープ領域として扱うメモリ管理手段
を有する装置。
【０１１３】
本発明は、具体的に開示された実施例に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。
【符号の説明】
【０１１４】
１０    メモリ管理機能を有する装置
１１    入力装置
１２    出力装置
１３    ドライブ装置
１４    補助記憶装置
１５    主記憶装置
１６    演算処理装置
１７    インターフェース装置
１８    記録媒体
２０    仮想マシン
２１    クラスローダ
２２    インタプリタ・動的コンパイラ
２３    メモリ管理機能
２４    移動不可能オブジェクト管理テーブル
２５    ＧＣ対象ヒープ領域の管理用データ
３０    ユーザアプリケーション
４０    共有ライブラリ
６１，６４    ヘッダー
６２    データ域
６３    ヒープ領域以外のメモリ領域
【図４】
0005381624.tif 000002
【図５】
0005381624.tif 000003
【図６】
0005381624.tif 000004
【図７】
0005381624.tif 000005
【図８】
0005381624.tif 000006
【図９】
0005381624.tif 000007
【図１２】
0005381624.tif 000008
【図１３】
0005381624.tif 000009
【図１４】
0005381624.tif 000010
【図１５】
0005381624.tif 000011
【図１６】
0005381624.tif 000012
【図１７】
0005381624.tif 000013
【図１８】
0005381624.tif 000014
【図１】
0005381624.tif 000015
【図２】
0005381624.tif 000016
【図３】
0005381624.tif 000017
【図１０】
0005381624.tif 000018
【図１１】
0005381624.tif 000019
【図１９】
0005381624.tif 000020
【図２０】
0005381624.tif 000021
【図２１】
0005381624.tif 000022
【図２２】
0005381624.tif 000023