(57)【要約】【課題】動的に確保したメモリ領域の解放に要する処理時間を短縮する。【解決手段】コンピュータにより実行されるプログラムによりメモリ領域を確保し、プログラムの実行に応じてメモリ領域にオブジェクトを格納し、プログラムによるメモリ領域の解放の指示に応じて、メモリ領域を解放予約状態にし、解放予約状態にない解放対象外メモリ領域の他のオブジェクトが、解放予約状態にある解放対象メモリ領域のオブジェクトを参照しているとき、そのオブジェクトを解放対象外メモリ領域に移動し、解放対象メモリ領域を解放する。【選択図】図１
2010073127.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータにより実行されるプログラムによりメモリ領域を確保し、
前記プログラムの実行に応じて前記メモリ領域にオブジェクトを格納し、
前記プログラムによる前記メモリ領域の解放の指示に応じて、前記メモリ領域を解放予約状態にし、
前記解放予約状態にない解放対象外メモリ領域の他のオブジェクトが、前記解放予約状態にある前記メモリ領域を含む解放対象メモリ領域の前記オブジェクトを参照しているとき、前記オブジェクトを前記解放対象外メモリ領域に移動し、
前記解放対象メモリ領域を解放することを特徴とするメモリ管理方法。
【請求項２】
前記オブジェクトの前記解放対象外メモリ領域への移動及び前記解放対象メモリ領域の解放を、所定の契機に実行することを特徴とする請求項１記載のメモリ管理方法。
【請求項３】
前記所定の契機は、前記解放予約状態の前記解放対象メモリ領域にある前記メモリ領域を含むメモリ領域数が所定の値を超えているとき、及び前記解放予約状態の前記解放対象メモリ領域のサイズが所定のサイズを超えているときの少なくとも一方であることを特徴とする請求項2記載のメモリ管理方法。
【請求項４】
前記所定の契機は、前記メモリ領域は他のメモリ領域と共にグループ化されており、前記メモリ領域が前記他のメモリ領域と共に前記解放予約状態にあるときであることを特徴とする請求項2記載のメモリ管理方法。
【請求項５】
前記コンピュータに構築されたJava仮想マシンにより前記プログラムは実行され、前記Java仮想マシンによりメモリ管理されるJavaヒープ領域に対してガベージコレクションが実行されるタイミングを前記所定の契機とすることを特徴とする請求項2記載のメモリ管理方法。
【請求項６】
メモリ、及び
前記メモリにメモリ領域を確保し、前記確保したメモリ領域にオブジェクトを格納し、前記メモリ領域を解放予約状態にするプログラムと、前記メモリ上の前記解放予約状態にない解放対象外メモリ領域の他のオブジェクトが、前記解放予約状態にある前記メモリ領域を含む解放対象メモリ領域の前記オブジェクトを参照しているとき、前記オブジェクトを前記解放対象外メモリ領域に移動し、前記解放対象メモリ領域を解放するメモリ処理部とを実行するプロセッサを有するコンピュータ。
【請求項７】
前記メモリ処理部は、前記オブジェクトの前記解放対象外メモリ領域への移動及び前記解放対象メモリ領域の解放を、所定の契機に従って実行することを特徴とする請求項6記載のコンピュータ。
【請求項８】
前記所定の契機は、前記解放予約状態の前記解放対象メモリ領域にある前記メモリ領域を含むメモリ領域数が所定の値を超えているとき、及び前記解放予約状態の前記解放対象メモリ領域のサイズが所定のサイズを超えているときの少なくとも一方であることを特徴とする請求項7記載のコンピュータ。
【請求項９】
前記所定の契機は、前記メモリ領域は他のメモリ領域と共にグループ化されており、前記メモリ領域が前記他のメモリ領域と共に前記解放予約状態にあるときであることを特徴とする請求項7記載のコンピュータ。
【請求項１０】
Java仮想マシンを構築し、Java仮想マシンにより前記プログラムを実行し、前記Java仮想マシンによりメモリ管理される、前記メモリ上のJavaヒープ領域に対してガベージコレクションが実行されるタイミングを前記所定の契機とすることを特徴とする請求項7記載のコンピュータ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータのメモリを動的に確保、解放するメモリ管理方法およびそれを用いたコンピュータに関する。
【背景技術】
【０００２】
コンピュータプログラムを開発する上で、プログラムが利用するメモリ領域の確保・解放処理は不正領域参照などの、プログラムの不具合を起こしやすいことが知られている。特に、複数人によるプログラム開発や、大規模なプログラム開発においては、全てのメモリ確保・解放処理を完全に把握することは困難になりつつある。
【０００３】
これを解決するために、プログラム中でのメモリ管理を自動化するガベージコレクタが利用される。ガベージコレクタの利用によるメモリ管理機能を備えた言語処理系の１つであるJava（Javaは、米国、Sun Microsystems, Inc.の商標である。）では、メモリ確保のためのAPI（Application Program Interface、ここではプログラミングのための記述）は用意されているが、解放用APIは存在しない。すなわち、Javaプログラム開発者はメモリ領域の確保は明示（記述）する必要があるが、メモリ領域の解放処理を記述する必要はない。プログラム実行の過程で確保されたメモリ領域は、プログラムを実行するJava仮想マシンに実装されたガベージコレクタが解放し、解放した領域を再利用可能とする。ガベージコレクタが実行する機能がガベージコレクション（以下、GC）である。すなわちGCとは、プログラムが動的に(実行中に)確保したメモリ領域のうち、不要になったデータを回収(削除)し、不要データを回収した領域を解放する機能である。
【０００４】
一般的に用いられるGC手法では、全てのJavaプログラム実行スレッドを停止させて、不要なデータを回収する。Java仮想マシンがガベージコレクタを起動するのは、プログラムで生成されるデータ（オブジェクト）を格納するJavaヒープメモリ（以下、Javaヒープ）の使用量が、ある閾値を越えたときである。
【０００５】
近年、Java言語で記述したプログラムをJava仮想マシン上で実行するJavaシステムがサーバシステムや、携帯電話、カー・ナビゲーションのような組込みシステムで用いられるようになってきた。これらのシステムでは、GCによるJavaプログラム実行スレッドの停止による、システムの応答性能の低下が問題となっている。
【０００６】
これを解決する方法が非特許文献１及び非特許文献２に開示されている。これらの文献に開示されている方法では、Java仮想マシンによるGCの対象であるヒープメモリ（Javaヒープ）の他に、GCの対象外であるヒープメモリ（以下、外部ヒープ）を有する。外部ヒープとは、プログラムによりメモリ管理が可能なメモリ領域ある。すなわち外部ヒープからのメモリ領域の確保、オブジェクトの生成およびメモリ領域の解放は、プログラマによるプログラムのソースコード中への記述に従う。外部ヒープのメモリ領域の解放処理では、そのメモリ領域に生成されたオブジェクトに関与せずに解放するために、確保したメモリ領域に生成するオブジェクトの参照関係に制限を設けている。この制限は、外部ヒープのあるメモリ領域にオブジェクトを生成するスレッドが1つもなくなった時点で、このメモリ領域を解放しても、プログラムの実行には影響がないことを保証ためのものである。このように、プログラムによりメモリ領域管理が可能な領域、すなわちJava仮想マシンによるGCの対象外である外部ヒープを用い、オブジェクトの参照関係に制限を設けることにより、Javaプログラム実行スレッドの長時間停止の発生を抑制している。
【０００７】
【非特許文献１】Angelo Corsaro and Ron K. Cytron, Efficient Memory-Reference Checks for Real-time Java, Proceedings of the 2003 Conference on Languages, Compilers, and Tools 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 Internal Symposium on Object-Oriented Real-Time Distributed Computing, 2004.
【発明の開示】
【発明が解決しようとする課題】
【０００８】
非特許文献１及び非特許文献２に開示されている方法では、オブジェクト間の参照関係の制約事項は、このメモリ領域の利便性を著しく損ねる。つまり、プログラムが実行中に確保した、外部ヒープのメモリ領域が存続する条件として、そのメモリ領域に対してオブジェクトを生成する区間を1つ以上のスレッドが実行中である必要があるが、この条件はプログラミングに著しい制約を課している。また、オブジェクト間の参照関係の制限を受けるため、プログラマは常にその制限に留意しながらプログラミングする必要があるが、プログラムの大規模化や、ユーザプログラムで記述されていない暗黙的データ生成の発生により、オブジェクト間の参照関係の把握は極めて困難である。プログラム実行時のチェックにより、この制限に反する参照関係が検出されると、例外処理(Exception)が発生し、プログラムは正常に実行されないこともある。
【０００９】
このような問題に対処するために、オブジェクト間の参照関係に制限を設けず、外部ヒープの、あるメモリ領域を解放する際に、解放しようとするメモリ領域にあるオブジェクトと他の領域（GC対象のJavaヒープや、外部ヒープの解放対象外のメモリ領域）にあるオブジェクトとの関係を調査(チェック)し、そのメモリ領域の解放が、プログラムの実行に支障がないことを確認した上で、メモリ領域を解放する。
【００１０】
このオブジェクト間の参照関係の調査は、Javaヒープおよび外部ヒープに含まれるオブジェクトの数に依存した処理時間を要する。一般に、Javaヒープおよび外部ヒープの容量が大きいほど、そこに含まれるオブジェクトの数も多くなるため、大容量メモリを有するシステムでは、安全なメモリ解放に多くの処理時間を要することになる。
【課題を解決するための手段】
【００１１】
本発明は、次のようなメモリ管理方法及びそれを用いたコンピュータである。コンピュータにより実行されるプログラムによりメモリ領域を確保し、プログラムの実行に応じてメモリ領域にオブジェクトを格納し、プログラムによるメモリ領域の解放の指示に応じて、メモリ領域を解放予約状態にし、解放予約状態にない解放対象外メモリ領域の他のオブジェクトが、解放予約状態にある解放対象メモリ領域のオブジェクトを参照しているとき、そのオブジェクトを解放対象外メモリ領域に移動し、解放対象メモリ領域を解放する。
【００１２】
本発明の望ましい他の態様は、オブジェクトの解放対象外メモリ領域への移動及び解放対象メモリ領域の解放を、所定の契機に実行する。
【発明の効果】
【００１３】
本発明によれば、動的に確保したメモリ領域の解放に要する処理時間を短縮することができる。
【発明を実施するための最良の形態】
【００１４】
本発明を実施するための最良の形態を、実施例1及び実施例2として説明する。
【実施例１】
【００１５】
本実施例は、メモリ解放方法およびそれを用いたコンピュータである。本実施例ではJavaシステムを対象として説明するが、メモリ解放に際して、解放するメモリに格納されているデータ（オブジェクト）の要否を管理可能なシステムであれば、そのようなシステムを対象としてもよい。
【００１６】
図1は、本実施例のコンピュータ100の構成を示す図である。コンピュータ100は、各処理を実行するプロセッサ（CPU）1、メモリ2および外部記憶装置4を有する。図1では、分かり易くするために、Java仮想マシン（Java VM）10がプロセッサ1に搭載され、プロセッサ1により実行されている状態を示しているが、Java仮想マシン（Java VM）10がソフトウエアで構築される場合は、そのソフトウエアは外部記憶装置４に格納され、コンピュータ100の起動に伴ってメモリ2にロードされ、ロードしたソフトウエアをプロセッサ1が実行することにより、仮想的なJavaマシンとしてのJava仮想マシン10が構築される。
【００１７】
Java仮想マシン10は、プログラム読込み部11でJavaプログラム20を読み込み、プログラム実行部12で読み込んだJavaプログラム20を実行する。プログラム実行部12は、インタプリタやJIT（Just-In-Time Compiler）コンパイラである。
【００１８】
メモリ2には、Java仮想マシン10が実行するJavaプログラム20、Java仮想マシン10が用いるJavaヒープメモリ(以下、Javaヒープ)21、及び外部ヒープメモリ(以下、外部ヒープ)30を含んでいる。Javaヒープ21は、Java仮想マシン10によるガベージコレクション（GC）対象のメモリであり、Java仮想マシン10に実装されたガベージコレクタ13によって、GC等のメモリ管理がなされるが、Javaプログラム20がJavaヒープ21に確保したメモリ領域を、Javaプログラム20からは解放できない。
【００１９】
外部ヒープ30は、Java仮想マシン10のガベージコレクタ13によるGC対象外のメモリであり、Javaプログラム20に記述された外部ヒープ生成文の実行に応じて外部ヒープ30にメモリ領域が生成される。メモリ領域の生成の実体はメモリ領域の確保であるが、Javaプログラム20からは、使用可能なメモリ領域が生成されるように見えるので、ここでは生成と呼ぶ。図１では、生成されるメモリ領域を、外部ヒープｉ、具体的には外部ヒープ１（31）、外部ヒープ２（32）、外部ヒープ３（33）、・・・として示す。Javaプログラム20はメモリ2上ではなく、外部記憶装置4に格納されていることもある。
【００２０】
Javaプログラム20には、アプリケーションプログラムとしての所要の処理に加えて、その処理の実行のために、外部ヒープの生成、外部ヒープへのオブジェクトの生成、外部ヒープの解放といった記述がなされており、これらをJava仮想マシン10が実行することで、外部ヒープｉが生成され、利用され、解放される。外部ヒープｉの生成、利用、及び解放のために、Java仮想マシン10には外部ヒープ処理部14が実装され、外部ヒープ処理部14は外部ヒープ生成部15、外部ヒープへのデータ生成部16、外部ヒープ解放部17、および外部ヒープ解放予約部18を有する。
【００２１】
図２に、外部ヒープｉ(図２の記述ではem)の生成、外部ヒープｉへのデータ生成、外部ヒープｉの解放のための記述を含んだJavaプログラム20の記述例を示す。2行目の文201は、外部ヒープｉを生成する記述(前述の外部ヒープ生成文)であり、4行目のenterメソッドから6行目のexitメソッドまでの処理202（処理202をデータ生成区間と呼ぶ。）において生成したデータ(オブジェクト)は、外部ヒープｉ上に生成される。9行目の文203は、外部ヒープｉを解放する記述reclaimメソッドである。このreclaimメソッドの実行により、内部に生成したデータを回収(削除)し、外部ヒープｉを解放する。
【００２２】
reclaimメソッドにより、メモリ領域解放の対象となる外部ヒープｉを単純に解放すると、そこに含まれるデータ（オブジェクト）を参照している他のオブジェクトが存在する場合、他のオブジェクトからの参照が不正(参照先のオブジェクトが無い状態)となり、不具合を発生する。そこで外部ヒープ解放部17は、解放対象である外部ヒープｉを解放する前に、外部ヒープｉに含まれるオブジェクトを参照する、解放対象外のメモリ領域（Javaヒープ又は他の外部ヒープ）に含まれる他のオブジェクトが存在するか否かを調査し、そのような参照がある場合は、参照されているオブジェクト(対象オブジェクトと呼ぶ。)を解放対象外のメモリ領域に移動し、オブジェクト間の参照関係を修正することによって、外部ヒープｉを解放した後も、Javaプログラム20の実行を継続できるようにする。
【００２３】
外部ヒープを解放してもJavaプログラム20の正常な実行を継続させるための、外部ヒープ解放ルーチン19の処理フローチャートを図３に示す。後述する外部ヒープ解放予約部18の処理を考慮しない場合は、図３に示す外部ヒープ解放ルーチン19の処理が、外部ヒープ解放部17の処理となる。
【００２４】
解放対象外メモリ領域の他のオブジェクトからの、解放対象である外部ヒープｉにある対象オブジェクトへの参照の有無を調査する(ステップ190)。参照がある場合は(ステップ192)、その対象オブジェクトを解放対象外メモリ領域（解放対象外メモリ領域が複数ある場合は、対象オブジェクトを参照しているオブジェクトが格納されている解放対象外メモリ領域を選択することが望ましい。）に移動させ、移動した対象オブジェクトへの他のオブジェクトからの参照を、対象オブジェクトの移動先に修正する(ステップ194)。ステップ190に戻り、解放対象の外部ヒープｉにあるすべてのオブジェクトに関して、解放対象外メモリ領域の他のオブジェクトからの参照がなくなるまで、ステップ194を繰り返す。解放対象外メモリ領域の他のオブジェクトからの、解放対象である外部ヒープｉにあるオブジェクトへの参照がないならば(ステップ192)、解放対象である外部ヒープｉを解放する。
【００２５】
以上の解放処理を、図４に示す例を用いて説明する。図４は、解放対象メモリ領域を外部ヒープ、解放対象外メモリ領域をJavaヒープ21とし、図４(A)の状態において、外部ヒープを解放する例である。解放対象外メモリ領域であるJavaヒープ21にはオブジェクト(a)及び(b)があり、解放対象メモリ領域である外部ヒープにはオブジェクト(c)及び(d)があり、オブジェクト(a)からオブジェクト(c)への参照ac、オブジェクト(c)からオブジェクト(d)への参照cd、オブジェクト(d)からオブジェクト(b)への参照dbが存在している。図中、参照jkは、参照元のオブジェクトjから参照先のオブジェクトkへの矢印で示している。
【００２６】
図３のステップ190を実行すると、解放対象外メモリ領域（Javaヒープ21）のオブジェクト(a)から解放対象メモリ領域（外部ヒープ）のオブジェクト(c)への参照acがあるので（ステップ192）、ステップ194を実行する。このとき、オブジェクト(c)が対象オブジェクトである。ステップ194を実行すると、対象オブジェクトであるオブジェクト(c)を解放対象外メモリ領域（Javaヒープ21）に移動させ、オブジェクト(a)からオブジェクト(c)への参照acを、移動したオブジェクト(c)への参照N-acに修正する。オブジェクト(c)が解放対象外メモリ領域（Javaヒープ21）に移動することにより、移動したオブジェクト(c)からオブジェクト(d)への参照N-cdが新たに生じる。図４(B)に、以上の処理結果としてのオブジェクト配置及びオブジェクト間の参照を示す。
【００２７】
図４(B)に示す状態において、再びステップ190実行すると、解放対象外メモリ領域（Javaヒープ21）のオブジェクト(c)から解放対象メモリ領域（外部ヒープ）のオブジェクト(d)への参照N-cdがあるので（ステップ192）、ステップ194を実行する。このとき、オブジェクト(d)が対象オブジェクトである。ステップ194を実行すると、対象オブジェクトであるオブジェクト(d)を解放対象外メモリ領域（Javaヒープ21）に移動させ、オブジェクト(c)からオブジェクト(d)への参照N-cdを、移動したオブジェクト(d)への参照NN-cdに修正する。オブジェクト(d)が解放対象外メモリ領域（Javaヒープ21）に移動することにより、移動したオブジェクト(d)からオブジェクト(b)への参照N-dbが新たに生じる。図４(C)に、以上の処理結果としてのオブジェクト配置及びオブジェクト間の参照を示す。
【００２８】
図４(C)に示す状態において、再びステップ190実行すると、解放対象メモリ領域(外部ヒープ)のオブジェクトを参照する、解放対象外メモリ領域(Javaヒープ21)のオブジェクトが存在しない、すなわち解放対象メモリ領域(外部ヒープ)のオブジェクトへの参照が存在しないので、解放対象メモリ領域である外部ヒープを解放する(ステップ196)。以上から明らかなように、外部ヒープ上のオブジェクトに対する参照が存在しないので、このメモリ領域としての外部ヒープを解放してもプログラムの実行に問題を生じない。
【００２９】
なお、オブジェクト(d)からオブジェクト(b)への参照dbは、参照元オブジェクト(d)が解放対象メモリ領域である外部ヒープにあるので、外部ヒープが解放された後にはオブジェクト(b)は参照されないので、参照dbの存在がJavaプログラムのその後の実行に影響を及ぼすことはない。
【００３０】
図３及び図４を用いて説明したように、解放対象メモリ領域に存在する対象オブジェクトに対する、解放対象外メモリ領域に存在する他のオブジェクトからの参照の有無の確認と、そのような参照がある場合の対象オブジェクトの移動、更に移動した対象オブジェクトへの参照の修正に係る処理は、解放対象メモリ領域及び解放対象外メモリ領域に存在するオブジェクトの数が多ければ多いほど、長い処理時間を要する可能性が高くなる。換言すると、大容量メモリを必要とするシステムほど、安全に（プログラム実行に影響を与えないで）メモリ解放するために多くの処理時間を要することになる。
【００３１】
この新たな課題に次のように対処する。図４の例では、一つの外部ヒープを解放対象メモリ領域とした。また、解放対象外メモリ領域をJavaヒープ21とした。実際には、ある一つの外部ヒープ(たとえば、図１の外部ヒープ１(31))を解放対象メモリ領域とした場合、解放対象外メモリ領域はJavaヒープ21だけではなく、図１に示すように解放対象以外の外部ヒープ(たとえば、図１の外部ヒープ２(32)、外部ヒープ３(33)、・・・)も解放対象外メモリ領域である。そこで、いくつかの外部ヒープを纏めて解放するように制御する。いくつかの外部ヒープを纏めると、外部ヒープを個別に解放する場合に比べて、解放対象外メモリ領域のオブジェクトから解放対象メモリ領域のオブジェクトへの参照の確認、オブジェクトの移動及び参照の修正の対象になるオブジェクトの数が少なくなる可能性が高い。いくつかの外部ヒープを纏めて解放対象メモリ領域とすることにより、解放対象外メモリ領域のオブジェクトから解放対象メモリ領域のオブジェクトへの参照が、解放対象メモリ領域内のオブジェクト間の参照になる可能性があるからである。換言すると、解放対象のメモリ領域の容量を大きくしても同様の効果が期待できるが、各外部ヒープの容量を大きくすることは、それらを用いる機能を纏めたJavaプログラムを開発することになり、Javaプログラムの開発効率を低下させることもある。以下、外部ヒープを纏めて解放することを具体的に説明する。
【００３２】
プログラム実行部12が、Javaプログラム20の外部ヒープｉを生成する文(図２の201)を実行すると外部ヒープ生成部15で外部ヒープｉを生成する。Javaプログラム20に記述された外部ヒープｉへのデータ生成区間(図２の202)において、外部ヒープへのデータ生成部16によって外部ヒープｉ内にデータ(オブジェクト)を生成する。Javaプログラム20上で外部ヒープｉの解放が明示的に指示された場合は(図２の203)、外部ヒープ解放予約部18において、指定された外部ヒープｉを解放予約状態にすると共に、外部ヒープ解放予約管理表22に、指定された外部ヒープｉを一意に特定できる値（以下、外部ヒープID）とそのヒープサイズを登録する。ここで解放予約状態とは、解放してもよい状態を表す。
【００３３】
Java仮想マシン10は、ある契機(具体的には後述する。)を迎えたとき、Javaプログラム20の実行に必要なオブジェクト（解放対象外のメモリ領域のオブジェクトから参照されているオブジェクト）であり、外部ヒープ解放予約管理表22で解放予約状態の外部ヒープｉにある対象オブジェクトを、外部ヒープ解放部17が、解放対象外のメモリ領域に移動させ、解放予約された外部ヒープｉを解放する。
【００３４】
図５に、外部ヒープ解放予約管理表22の一例を示す。この例では、各行に外部ヒープIDとそのヒープサイズ(メモリ容量)を対応付けて登録している。図５では、外部ヒープIDとして図１に対応させてＥＨ１、ＥＨ２、ＥＨ３、・・・、ＥＨｍ、それらのヒープサイズＥh１(Kbytes)、Ｅh２(Kbytes)、Ｅh３(Kbytes)、・・・、Ｅhｍ(Kbytes)が登録されている状態を示すが、外部ヒープIDは、各外部ヒープｉを一意に特定できるものであればよく、ヒープサイズは後述するように必要に応じて登録すればよい。
【００３５】
図６に、外部ヒープの解放指示203に応答して、実行する外部ヒープ解放予約部18の処理フローチャートを示す。解放指示された外部ヒープの外部ヒープIDが外部ヒープ解放予約管理表22に登録されているかどうかを調査する(ステップ180)。登録済みならば、処理を終了し、登録されていないならば(ステップ182)、解放予約する外部ヒープID及びそのヒープサイズを外部ヒープ解放予約管理表22に登録する(ステップ184)。登録済みとは、複雑なプログラムでは同じ外部ヒープを複数箇所で解放指示する可能性があるために発生する状態である。
【００３６】
図７に解放予約された外部ヒープを解放する外部ヒープ解放部17の処理フローチャートを示す。外部ヒープ解放予約管理表22に外部ヒープIDが登録されているかを調査する(ステップ170)。外部ヒープ解放予約管理表22に外部ヒープIDがなければ、処理を終了する(ステップ172)。外部ヒープ解放予約管理表22に外部ヒープIDが登録されているならば(ステップ172)、解放対象メモリ領域として外部ヒープ解放予約管理表22に存在する外部ヒープIDに対応する外部ヒープを纏めて(ステップ174)、外部ヒープ解放ルーチン19を実行する。図３を用いて説明した外部ヒープ解放ルーチン19は、纏めた外部ヒープを解放対象メモリ領域として処理を実行する。外部ヒープ解放ルーチン19の実行により解放された、外部ヒープ解放予約管理表22に存在する外部ヒープIDを削除する(ステップ176)。
【００３７】
図８及び図９を用いて、図７のステップ174により纏められる外部ヒープの数の差異による、解放対象メモリ領域の解放に伴う個々のオブジェクトやオブジェクト間の参照の状態を例示する。図８(A)は、Javaヒープ21にオブジェクト(a)及び(b)があり、外部ヒープ30の外部ヒープ1にオブジェクト(c)、外部ヒープ２にオブジェクト(d)及び(e)、外部ヒープｍにオブジェクト(f)があり、オブジェクト(a)からオブジェクト(c)への参照ac、オブジェクト(d)からオブジェクト(b)及び(c)への各々の参照db及びdc、およびオブジェクト(f)からオブジェクト(e)への参照feがあることを示す。図８(A)に示す各オブジェクト及びオブジェクト間の参照の状態を元に、外部ヒープ解放予約管理表22に登録されている外部ヒープIDに応じて解放対象メモリ領域を解放した場合（図７において外部ヒープ解放ルーチン19の実行を完了した場合）の状態を以下に説明する。
【００３８】
図８(B)は、外部ヒープ解放予約管理表22に外部ヒープIDとして外部ヒープ1が登録されており、外部ヒープ1を解放対象メモリ領域として解放した状態である。図中、解放対象メモリ領域である外部ヒープ1を破線で示す。図８(A)の状態で、解放対象外メモリ領域であるJavaヒープ21のオブジェクト(a)及び外部ヒープ２のオブジェクト(d)から、解放対象メモリ領域である外部ヒープ1のオブジェクト(c)への参照ac及びdcがあるので、オブジェクト(c)を対象オブジェクトとして解放対象外メモリ領域であるJavaヒープ21へ移動し、参照ac及びdcを新たな参照N-ac及びN-dcに修正している。
【００３９】
図９(A)は、図８(A)の状態を元に、外部ヒープ解放予約管理表22に外部ヒープIDとして外部ヒープ1及び外部ヒープ２が登録されており、外部ヒープ1及び外部ヒープ２を纏めて解放対象メモリ領域として解放した状態である。図中、解放対象メモリ領域である外部ヒープ1及び外部ヒープ２を破線で示す。図８(A)の状態を元にして解放しているので、オブジェクト(a)〜(d)及びそれらのオブジェクト間の参照は、図８(B)の状態と同様である。解放対象メモリ領域である外部ヒープ２のオブジェクト(e)へは、解放対象外メモリ領域である外部ヒープｍのオブジェクト(f)から参照feがあるので、オブジェクト(e)を対象オブジェクトとして解放対象外メモリ領域である外部ヒープｍへ移動し、参照feを新たな参照N-feに修正している。
【００４０】
図９(B)は、図８(A)の状態を元に、外部ヒープ解放予約管理表22に外部ヒープIDとして外部ヒープ1〜ｍ（説明を単純にするために、1〜ｍを連続番号とするが、不連続であっても良い。）が登録されており、外部ヒープ1〜ｍを纏めて解放対象メモリ領域として解放した状態である。図中、解放対象メモリ領域である外部ヒープ1〜ｍを破線で示す。図８(A)の状態を元にして解放しているので、オブジェクト(a)〜(d)及びそれらのオブジェクト間の参照は、図８(B)の状態と同様である。図９(A)で説明したオブジェクト(f)からオブジェクト(e)への参照feは、オブジェクト(e)がある外部ヒープ２及びオブジェクト(f)がある外部ヒープｍが共に解放対象メモリ領域であるので、オブジェクトの移動及び新たな参照へ修正が発生しない。
【００４１】
図９(A)と図９(B)との差異（参照fe）から分かるように、いくつかの外部ヒープを纏めると、解放対象外メモリ領域のオブジェクトから解放対象メモリ領域のオブジェクトへの参照の確認、オブジェクトの移動及び参照の修正の対象になるオブジェクトの数が少なくなる。大規模システムになればなるほど、外部ヒープの数や容量が増加し、オブジェクトや参照の数が増大するので、外部ヒープ解放の際の処理時間短縮効果が大きくなる。
【００４２】
以上の考え方を推し進めると、Javaプログラム20の実行完了後に、一括して外部ヒープ30を解放することが、処理時間を最も短くすることになる。このようにすると、Javaプログラム20の実行中に、動的にメモリ領域を確保し、そのメモリ領域の使用を完了したら、再利用するためにそれを動的に解放するという、メモリ領域の使用効率を高くし、結果としてコンピュータ100に実装するメモリを大容量にしなくて良いという特長を損なうことになる。また、アプリケーションによっては、コンピュータを連続運転するので、外部ヒープ30を解放するタイミングが得られないこともある。そこで、外部ヒープのメモリ容量と外部ヒープの解放に伴う処理時間とのトレードオフをとることが必要となる。このトレードオフは、オブジェクトや参照の数に依存するので、Javaプログラム20の実行によるアプリケーションに依存することになる。
【００４３】
外部ヒープのメモリ容量と外部ヒープの解放に伴う処理時間とのトレードオフをとるために必要な、外部ヒープ30を解放するタイミングとしての、ある契機について説明する。ある契機とは、言い換えると、外部ヒープ解放部１７の実行タイミングである。以下に説明するように幾つかの実行タイミング決定方法は、アプリケーションなどに基づいて選択される。
【００４４】
（１）ある契機をGC発生時とする。Java仮想マシン10は、Javaヒープ21の使用量がある閾値を超えたときに、ガベージコレクタ13を動作させ、Javaヒープ21を対象にGCを実行する。そこで、このGCの発生を、外部ヒープ30を解放するタイミングの目安として利用する。そのためにJava仮想マシン10は、Javaヒープ21の使用量がある閾値を超えたときに、外部ヒープ解放部17（図７）を実行し、引き続いてガベージコレクタ13を実行するように制御する。外部ヒープ解放部17の実行に伴う外部ヒープ解放ルーチン19(図３)のステップ190における、解放対象外メモリ領域から解放対象メモリ領域への参照の調査は、GCにおけるオブジェクトの参照をたどる処理と同様であるので、Java仮想マシン10の開発においてガベージコレクタ13の一部（参照の調査）の処理を外部ヒープ解放処理で補うことができる。これにより、GCによる停止時間と外部ヒープ解放による（外部ヒープ解放ルーチン19の実行に伴う）停止時間を合わせた全体の停止時間を削減できる。
【００４５】
（２）ある契機を、外部ヒープ解放予約数がある閾値を越えているときとする。図６を用いて、外部ヒープの解放指示203に応答して、外部ヒープ解放予約部18が実行を開始することを説明した。外部ヒープ解放予約部18の実行開始を制御する処理として、外部ヒープ解放タイミング決定ルーチンをJava仮想マシン10に設ける(図１では、図示略)。外部ヒープ解放タイミング決定ルーチンの例の処理フローチャートを図10(a)に示す。図６と同様に、外部ヒープの解放指示203に応答して、まず外部ヒープ解放予約部18を実行する。外部ヒープ解放予約部18の実行に伴って、外部ヒープ解放予約管理表22に登録される解放予約された外部ヒープの数が所定の閾値を超えているかを調査し(ステップ140)、超えているならば（ステップ142）、外部ヒープ解放部17を実行する。所定の閾値は、アプリケーションや設計の経験則に基づいて決められる。なお、外部ヒープ解放予約部18のステップ182において登録済であった場合、ステップ140以降の処理は不要となるが、実行しても支障のない設計上の選択事項である。
【００４６】
アプリケーションや設計の経験則に基づいて決められる所定の閾値に、外部ヒープ30の使用効率が依存するが、外部ヒープの解放に要する処理時間とのトレードオフをとる一方法である。
【００４７】
（３）ある契機を、解放予約された外部ヒープの合計ヒープサイズ(メモリ容量)がある閾値を超えているときとする。外部ヒープ解放タイミング決定ルーチンの他の例を図10(ｂ)に示す。図10(ｂ)の例は、ステップ１４４及びステップ１４６において、外部ヒープ解放予約管理表22に登録される解放予約された外部ヒープサイズ(メモリ容量)の合計が所定の閾値を超えているかを調査し、判定していることが、図10(a)の例と異なっている。
【００４８】
合計ヒープサイズ(メモリ容量)を基準としても、外部ヒープ30の使用効率と外部ヒープの解放に要する処理時間とのトレードオフをとることができる。
【００４９】
以上、外部ヒープを解放する所定のタイミング（ある契機）を決定する方法を（1）〜（3）で説明したが、他にも周期タイマを用いて、周期的に外部ヒープ解放部１７を実行しても良いし、Javaプログラム20がトランザクションを処理するプログラムである場合は、処理したトランザクションの数やトランザクション処理に必要なデータベースにデータをコミットした回数に依存して外部ヒープ解放部１７を実行しても良い。さらに、これらの決定する方法を組み合わせて用いても良い。
【００５０】
本実施例によれば、所定の契機(タイミング)で解放予約されている一つ以上の外部ヒープを纏めて解放するので、外部ヒープに割当てているメモリの使用効率を維持しながら、外部ヒープの解放に要する処理時間を短縮することができる。
【実施例２】
【００５１】
図１１に本実施例のコンピュータ101の構成を示す。コンピュータ101の構成は、Java仮想マシン（JavaVM）10に含まれる外部ヒープ生成部45、外部ヒープ解放部47、及び外部ヒープ解放予約部48、並びにJavaヒープ21上の外部ヒープ解放予約管理表23及び外部ヒープ生成管理表24の他は、実施例１のコンピュータ100と同じである。なお、外部ヒープ生成管理表24は外部ヒープ30上に設けても良い。実施例１との差異は、各外部ヒープをグループ管理する点にあり、以下に説明する。
【００５２】
図１２に、外部ヒープ解放予約管理表23の一例を示す。この例では、各行に外部ヒープIDとその外部ヒープが属するグループのグループIDを対応付けて登録している。図１２では、たとえば、外部ヒープIDがＥＨ１の外部ヒープはグループIDがＧ１のグループに属していることを示す。
【００５３】
なお、各々の外部ヒープが属するグループのグループIDは、設計事項として決定され、Javaプログラム20の外部ヒープの生成文に記述される。たとえば、アプリケーションプログラムを構成する複数のサブプログラムごとにグループIDを設ける。
【００５４】
図１３に外部ヒープ生成管理表24の一例を示す。外部ヒープ生成管理表24は、グループIDと、そのグループIDでグループ化され、生成されている外部ヒープの数(生成数と呼ぶ。)とを対応付けて格納する。図示するように、たとえば、グループIDがG-1にグループ化された外部ヒープが12個生成されたことを示す。
【００５５】
図１４に外部ヒープ生成部45の処理フローチャートを示す。外部ヒープ生成管理表24に、生成する外部ヒープのグループIDが登録されているかを調査する(ステップ450)。登録されていない場合(ステップ452)、外部ヒープ生成管理表24に、生成する外部ヒープのグループIDを登録し、それに対応する生成数を1とする(ステップ454)。既に登録されている場合（ステップ452）、生成する外部ヒープのグループIDに対応する生成数をカウントアップ（＋１）する（ステップ456）。
【００５６】
図１５に、Java仮想マシン10が実行する、外部ヒープ解放タイミング決定ルーチンの例の処理フローチャートを示す。図中、ステップ500〜504が外部ヒープ解放予約部48の処理であり、ステップ510〜514が外部ヒープ解放部47の処理である。
【００５７】
外部ヒープの解放指示に応答して、解放指示された外部ヒープの外部ヒープIDが外部ヒープ解放予約管理表23に登録されているかどうかを調査する(ステップ500)。登録済みならば(ステップ502)、処理を終了し、登録されていないならば(ステップ502)、解放予約する外部ヒープID及びそのグループIDを外部ヒープ解放予約管理表23に登録する(ステップ504)。
【００５８】
登録したグループIDが外部ヒープ解放予約管理表23に登録されている数（解放予約外部ヒープ数）と、外部ヒープ生成管理表24中のそのグループIDに対応する生成数とを調査する(ステップ506)。解放予約外部ヒープ数が生成数未満の場合(ステップ508)、処理を終了する。解放予約外部ヒープ数が生成数以上の場合(ステップ508)、そのグループに属し、生成された外部ヒープが全て解放予約されたことになるので、外部ヒープ解放予約管理表23に登録されている、そのグループIDを持つ外部ヒープを解放対象メモリ領域として纏める(ステップ510)。外部ヒープを纏めた解放対象メモリ領域を解放するために外部ヒープ解放ルーチン19を実行する。解放対象メモリ領域とした外部ヒープIDを外部ヒープ解放予約管理表23から削除し(ステップ512)、解放対象メモリ領域としたグループIDを外部ヒープ生成管理表24から削除する(ステップ514)。
【００５９】
本実施例によれば、グループ化されている一つ以上の外部ヒープを、生成したものがすべて解放予約されたと見なせるタイミングで、纏めて解放するので、外部ヒープに割当てているメモリの使用効率を維持しながら、外部ヒープの解放に要する処理時間を短縮することができる。
【００６０】
なお、本実施例の、外部ヒープのあるグループを対象として、実施例1を適用できる。逆に言えば、実施例1は、本実施例において外部ヒープのグループの数が一つの場合である。したがって、本実施例のあるグループの外部ヒープの解放タイミングとして、本実施例の解放タイミングと共に、実施例1で説明した解放タイミングを併用することができる。この併用を、プログラム設計上、あるグループの外部ヒープの数やメモリ容量を大きくせざるを得ない場合に適用すると、好都合である。
【００６１】
以上説明した実施形態によれば、動的に確保したメモリ領域（外部ヒープ）の解放に要する処理時間を短縮することができる。
【図面の簡単な説明】
【００６２】
【図１】実施例1のコンピュータの構成を示す図である。
【図２】Javaプログラムの記述例を示す図である。
【図３】外部ヒープ解放ルーチンの処理フローチャートである。
【図４】外部ヒープ解放処理の例を示す図である。
【図５】外部ヒープ解放予約管理表の一例を示す図である。
【図６】外部ヒープ解放予約部の処理フローチャートである。
【図７】外部ヒープ解放部の処理フローチャートである。
【図８】オブジェクトやオブジェクト間の参照の状態を例示する図である。
【図９】オブジェクトやオブジェクト間の参照の状態を例示する図である。
【図１０】外部ヒープ解放タイミング決定ルーチンの例の処理フローチャートである。
【図１１】実施例２のコンピュータの構成を示す図である。
【図１２】外部ヒープ解放予約管理表の一例を示す図である。
【図１３】外部ヒープ生成管理表の一例を示す図である。
【図１４】外部ヒープ生成部の処理フローチャートである。
【図１５】外部ヒープ解放タイミング決定ルーチンの例の処理フローチャートである。
【符号の説明】
【００６３】
1：CPU、2：メモリ、4：外部記憶装置、10：JavaVM、11：プログラム読み込み部、12：プログラム実行部、13：ガベージコレクタ、14：外部ヒープ処理部、15：外部ヒープ生成部、16：データ生成部、17：外部ヒープ解放部、18：外部ヒープ解放予約部、19；外部ヒープ解放ルーチン、20：Javaプログラム、21：Javaヒープ、22,23：外部ヒープ解放予約管理表、24：外部ヒープ生成管理表、30：外部ヒープ、45：外部ヒープ生成部、47：外部ヒープ解放部、48：外部ヒープ解放予約部、100,101：コンピュータ。
【図１】
2010073127.tif 000003
【図２】
2010073127.tif 000004
【図３】
2010073127.tif 000005
【図４】
2010073127.tif 000006
【図５】
2010073127.tif 000007
【図６】
2010073127.tif 000008
【図７】
2010073127.tif 000009
【図８】
2010073127.tif 000010
【図９】
2010073127.tif 000011
【図１０】
2010073127.tif 000012
【図１１】
2010073127.tif 000013
【図１２】
2010073127.tif 000014
【図１３】
2010073127.tif 000015
【図１４】
2010073127.tif 000016
【図１５】
2010073127.tif 000017