(57)【特許請求の範囲】
【請求項１】
演算装置とメモリを備えた計算機システムで、
前記メモリに格納されて前記演算装置で実行されるプログラムが使用するメモリ領域中の不要になった領域を開放するメモリ管理方法であって、
前記演算装置が、前記プログラムを実行するために利用する第１のメモリ領域を前記メモリに設定するステップと、
前記演算装置が、前記プログラムから操作可能な第２のメモリ領域を前記メモリに設定するステップと、
前記演算装置が、前記プログラムからの指令に基づいて前記第２のメモリ領域内に利用領域を設定するステップと、
前記演算装置が、前記プログラムからの指令に基づいて前記第２のメモリ領域の前記利用領域にデータを含むオブジェクトを格納するステップと、
前記演算装置が、前記第２のメモリ領域内の利用領域に格納されたオブジェクトのうち前記プログラムが利用するか否かを判定するステップと、
前記演算装置が、前記利用領域に格納されたオブジェクトのうち前記プログラムが利用しないオブジェクトが占有する利用領域を解放するステップと、
を含み、
前記演算装置が、前記利用領域に格納されたオブジェクトのうち前記プログラムが利用しないオブジェクトが占有する利用領域を解放するステップは、
前記第２のメモリ領域内に生成した新たな利用領域の数が、予め設定した閾値を超えたときに、前記第２のメモリ領域に新たな利用領域を生成するステップと、
前記プログラムが利用しないオブジェクトが存在する前記利用領域内で、前記プログラムが利用するオブジェクトを前記新たな利用領域へ移動するステップと、
前記プログラムが利用しないオブジェクトが存在する前記利用領域を解放するステップと、
を有することを特徴とするメモリ管理方法。
【請求項２】
請求項１に記載のメモリ管理方法であって、
前記演算装置が、前記利用領域に格納されたオブジェクトのうち前記プログラムが利用しないオブジェクトが占有する利用領域を解放するステップは、
前記利用領域が予め設定した条件を満たしたときに、前記プログラムが利用しないオブジェクトが占有する利用領域を解放することを特徴とするメモリ管理方法。
【請求項３】
請求項２に記載のメモリ管理方法であって、
前記予め設定した条件は、前記利用領域内で前記プログラムが利用しないオブジェクトの数またはサイズが予め設定した閾値を超えたときであることを特徴とするメモリ管理方法。
【請求項４】
請求項２に記載のメモリ管理方法であって、
前記予め設定した条件は、前記第２のメモリ領域内で前記利用領域が占有するサイズの総和が予め設定した閾値を超えたときであることを特徴とするメモリ管理方法。
【請求項５】
計算機を制御する第１のプログラムであって、
前記計算機は、第２のプログラムが格納されるメモリと、前記メモリに格納された前記第２のプログラムを実行する演算装置と、を備え、
前記第２のプログラムを実行するために利用する第１のメモリ領域を前記メモリに設定する手順と、
前記第２のプログラムから操作可能な第２のメモリ領域を前記メモリに設定する手順と、
前記第２のプログラムからの指令に基づいて前記第２のメモリ領域内に利用領域を設定する手順と、
前記第２のプログラムからの指令に基づいて前記第２のメモリ領域の前記利用領域にデータを含むオブジェクトを格納する手順と、
前記第２のメモリ領域内の利用領域に格納されたオブジェクトのうち前記第２のプログラムが利用するか否かを判定する手順と、
前記第２のメモリ領域内に生成した新たな利用領域の数が、予め設定した閾値を超えたときに、前記第２のメモリ領域に新たな利用領域を生成する手順と、
前記第２のプログラムが利用しないオブジェクトが存在する前記利用領域内で、前記第２のプログラムが利用するオブジェクトを前記新たな利用領域へ移動する手順と、
前記第２のプログラムが利用しないオブジェクトが占有する利用領域を解放する手順と、
を前記演算装置に実行させることを特徴とする第１のプログラム。
【請求項６】
演算装置とメモリを備えてプログラムを実行し、前記プログラムが使用するメモリ領域中の不要になった領域を開放する計算機システムであって、
前記プログラムを実行するために利用する第１のメモリ領域を前記メモリに設定する管理部と、
前記プログラムから操作可能な第２のメモリ領域を前記メモリに設定する外部ヒープ処理部と、を備え、
前記外部ヒープ処理部は、
前記第２のメモリ領域内に前記プログラムが操作可能な利用領域を設定する外部メモリ生成部と、
前記第２のメモリ領域の前記利用領域にデータを含むオブジェクトを格納するデータ生成部と、
前記第２のメモリ領域内の利用領域に格納されたオブジェクトのうち前記プログラムが利用するか否かを判定し、前記第２のメモリ領域内に生成した新たな利用領域の数が、予め設定した閾値を超えたときに、前記第２のメモリ領域に新たな利用領域を生成し、前記プログラムが利用しないオブジェクトが存在する前記利用領域内で、前記プログラムが利用するオブジェクトを前記新たな利用領域へ移動し、前記プログラムが利用しないオブジェクトが占有する利用領域を解放する部分解放部と、
を備えたことを特徴とする計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ管理方法、コンピュータ及びプログラムに係り、特に、メモリに格納されたデータがプログラムの実行に必要か否かを管理することでメモリの利用効率を制御するメモリ管理方法、コンピュータ及びプログラムに関する。
【背景技術】
【０００２】
コンピュータプログラムを開発する上で、プログラムで利用するメモリ領域の確保処理または解放処理は不正領域の参照などプログラムの不具合を起こしやすいことが知られている。特に、大規模なプログラム開発においては、プログラマが全てのメモリ領域の確保または解放処理を完全に把握することは困難になりつつある。
【０００３】
これを解決する手段として、プログラム中でのメモリ管理を自動化するガベージコレクタの利用が挙げられる。ガベージコレクタを利用するメモリ管理機能を備えた言語処理系の１つであるJava（登録商標、以下同じ）ではメモリ領域確保のための手段は用意されているが、解放はガベージコレクタが実施する。そのため、Javaプログラム開発者はメモリ領域の確保は明示するが、メモリ領域の解放処理を記述する必要はない。ガベージコレクタが実行するメモリ解放機能がガベージコレクション（以下、「ＧＣ」という。）である。すなわちＧＣとは、プログラムが動的に確保したメモリ領域のうち、不要になったデータ（オブジェクト）を判別し、そのオブジェクトが占有していた領域を自動的に解放する機能である。一般的に用いられるＧＣの手法では、全てのJavaプログラムの実行スレッドを停止させて、不要なデータを回収してメモリ領域を解放する。
【０００４】
近年、ＧＣによる長時間停止が発生することによる応答性能の低下が問題となっている。これを解決する方法が提案・開発されている。その１つに、ＧＣ対象となるヒープメモリの他に、ＧＣ対象外のヒープメモリ（以下、外部ヒープ）を有するJava仮想マシンが知られている（例えば、特許文献１）。Java仮想マシンが従来から備えるヒープメモリはＧＣによるメモリ管理を行っている。それに対し、外部ヒープは、プログラマによるメモリ領域の管理を可能とする領域である。すなわち外部ヒープからのメモリ領域の確保と、確保したメモリ領域へのオブジェクトの生成およびメモリ領域の解放指示をソースコード中に記述する。これにより、外部ヒープはプログラムから管理可能なヒープメモリとして扱うことができる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−０３７５４７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上記従来例において、プログラムが外部ヒープに確保したメモリ領域を外部メモリ領域とする。外部メモリ領域にはプログラムが生成したオブジェクトを、外部メモリ領域の解放処理が実施されるまで格納し続ける。そのため、Ｊａｖａプログラムの実行に必要なオブジェクトと不要なオブジェクトが外部メモリ領域に混在するため、外部メモリ領域の利用効率が低下する。外部メモリ領域の確保から解放までの間隔が長期化するほど、外部メモリ領域内の不要なオブジェクトが増える可能性が高くなり、外部メモリ領域の利用効率が低下する可能性が高くなる、という問題があった。
【０００７】
そこで本発明は、上記問題点に鑑みてなされたもので、外部ヒープを有する処理系において、外部ヒープに格納されたデータがプログラムの実行に必要か否かを管理して、外部メモリ領域を効率的に利用することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、演算装置とメモリを備えた計算機システムで、前記メモリに格納されて前記演算装置で実行されるプログラムが使用するメモリ領域中の不要になった領域を開放するメモリ管理方法であって、前記演算装置が、前記プログラムを実行するために利用する第１のメモリ領域を前記メモリに設定するステップと、前記演算装置が、前記プログラムから操作可能な第２のメモリ領域を前記メモリに設定するステップと、前記演算装置が、前記プログラムからの指令に基づいて前記第２のメモリ領域内に利用領域を設定するステップと、前記演算装置が、前記プログラムからの指令に基づいて前記第２のメモリ領域の前記利用領域にデータを含むオブジェクトを格納するステップと、前記演算装置が、前記第２のメモリ領域内の利用領域に格納されたオブジェクトのうち前記プログラムが利用するか否かを判定するステップと、前記演算装置が、前記利用領域に格納されたオブジェクトのうち前記プログラムが利用しないオブジェクトが占有する利用領域を解放するステップと、を含み、前記演算装置が、前記利用領域に格納されたオブジェクトのうち前記プログラムが利用しないオブジェクトが占有する利用領域を解放するステップは、前記第２のメモリ領域内に生成した新たな利用領域の数が、予め設定した閾値を超えたときに、前記第２のメモリ領域に新たな利用領域を生成するステップと、前記プログラムが利用しないオブジェクトが存在する前記利用領域内で、前記プログラムが利用するオブジェクトを前記新たな利用領域へ移動するステップと、前記プログラムが利用しないオブジェクトが存在する前記利用領域を解放するステップと、を有する。
【発明の効果】
【０００９】
したがって、本発明によれば、外部ヒープの領域の利用効率が向上する。
【図面の簡単な説明】
【００１０】
【図１】本発明の第１の実施形態を示し、コンピュータの構成を示すブロック図である。
【図２】本発明の第１の実施形態を示し、外部ヒープ処理部１４による外部メモリ領域３１の生成、外部メモリ領域３１へのデータ生成、外部メモリ領域３１の解放のための記述を含んだＪａｖａプログラム２０の一例を示す説明図である。
【図３】本発明の第１の実施形態を示し、外部ヒープ３０を利用するときの外部メモリ領域３１の状態遷移の一例を示す説明図である。
【図４】本発明の第１の実施形態を示し、外部メモリの部分解放部１８が行う処理の一例を示すフローチャートである。
【図５】本発明の第１の実施形態を示し、外部メモリの部分解放部１８が行う処理の変形例を示すフローチャートである。
【図６】本発明の第１の実施形態を示し、外部メモリの部分解放部１８が行う処理の他の変形例を示すフローチャートである。
【図７】本発明の第１の実施形態を示し、部分解放処理による外部メモリ領域３１の状態遷移の一例を示す説明図である。
【図８】本発明の第１の実施形態を示し、部分解放処理による外部メモリ領域３１の状態遷移の詳細を示す説明図である。
【図９】本発明の第２の実施形態を示し、外部メモリの部分解放部１８で行われる処理の一例を示すフローチャートである。
【図１０】本発明の第２の実施形態を示し、外部メモリの部分解放部１８で行われる処理の他の例を示すフローチャートである。
【図１１】本発明の第２の実施形態を示し、外部メモリの部分解放部１８で行われる処理のさらに他の例を示すフローチャートである。
【図１２】本発明の第２の実施形態を示し、外部ヒープ３０を利用するときの外部メモリ領域３１の状態遷移の一例を示す説明図である。
【発明を実施するための形態】
【００１１】
以下、本発明の一実施形態を添付図面に基づいて説明する。
【００１２】
発明の第１の実施形態を示し、コンピュータの構成を示すブロック図である。
【００１３】
図１は、ＣＰＵ（またはプロセッサ）１、メモリ（主記憶）２および外部記憶装置４を有するコンピュータ１００において、外部ヒープ３０を有するＪａｖａ仮想マシン（ＶＭ）１０の構成と、メモリ２に設定されたＪａｖａヒープ２１と外部ヒープ３０の構成図である。
【００１４】
Ｊａｖａ仮想マシン１０の内部ではメモリ２に格納されたＪａｖａプログラム２０を読み込むプログラム読込み部１１と、プログラムの実行を行うプログラム実行部１２と、メモリ操作としてＧＣ（ガベージコレクション）処理１３１を行うガベージコレクタ１３と、外部ヒープ操作を行う外部ヒープ処理部１４が動作している。
【００１５】
ガベージコレクタ１３は、ＪａｖａＶＭ１０がメモリ２に確保したＪａｖａヒープ２１に対してＧＣ操作を行う。
【００１６】
外部ヒープ処理部１４は、メモリ２上でＪａｖａ仮想マシン１０が使用するメモリ領域であるＪａｖａヒープ２１とは異なるメモリ領域の外部ヒープ３０に対する操作を行う。
【００１７】
外部ヒープ処理部１４は、外部ヒープ３０内の記憶領域（部分領域）として外部メモリ領域３１を設定する外部メモリ生成部１５と、外部メモリ領域３１へデータを書き込むデータ生成部１６と、不要になった外部メモリ領域３１を解放する外部メモリ解放部１７と、外部メモリ部分解放部１８を備える。これらの処理部により外部ヒープ３０内に外部メモリ領域３１を生成して、外部メモリ領域３１へデータの書き込みを行い、外部メモリ領域３１が不要になったときには当該外部メモリ領域３１の解放を行う。
【００１８】
外部メモリ部分解放部１８は、後述するように、外部ヒープ３０の外部メモリ領域３１内のデータ（オブジェクト）のうち、後のＪａｖａプログラム２０の実行に不要なオブジェクトが占有する領域を解放する。
【００１９】
なお、Ｊａｖａヒープ２１は、Ｊａｖａ仮想マシン１０によってメモリ２上に設定される。外部ヒープ３０は、外部ヒープ処理部１４によって設定される。外部ヒープ３０内の外部メモリ領域３１は、Ｊａｖａプログラム２０に記述された外部メモリ生成文（図２の２０１）の実行に応じて外部ヒープ処理部１４が機能して外部ヒープ３０内に生成される。なお、Ｊａｖａプログラム２０はメモリ２上ではなく、外部記憶装置４に格納されていてもよい。
【００２０】
また、Ｊａｖａヒープ２１は、ＪａｖａＶＭ１０が管理し、Ｊａｖａプログラム２０の実行の際に利用するメモリ領域である。このＪａｖａヒープ２１は、ＪａｖａＶＭ１０から操作可能であり、Ｊａｖａプログラム２０から操作することはできない第１のメモリ領域である。
【００２１】
外部ヒープ３０は、上述のようにＪａｖａプログラム２０から操作可能な第２のメモリ領域であり、Ｊａｖａプログラム２０から外部ヒープ３０内に外部メモリ領域３１を生成（確保）し、Ｊａｖａプログラム２０から外部メモリ領域３１にデータなどのオブジェクトを書き込み、Ｊａｖａプログラム２０から外部メモリ領域３１の解放または部分解放を指令し、外部ヒープ処理部１４がＪａｖａプログラム２０からのこれらの指令を受け付けて実行する。すなわち、外部メモリ領域３１は、外部ヒープ３０を利用する際の単位区画（利用領域）であり、Ｊａｖａプログラム２０は、外部ヒープ３０を利用する際には、１つ以上の外部メモリ領域３１を生成し、生成した外部メモリ領域３１にデータなどのオブジェクトを書き込んで利用する。
【００２２】
また、図１において、Ｊａｖａ仮想マシン１０はＣＰＵ１内に記載したが、実際にはメモリ２上にロードされており、ＣＰＵ１が必要に応じて各処理部を読み込んでから実行するものである。また、Ｊａｖａ仮想マシン１０は、記憶媒体としての外部記憶装置４などに記憶されたプログラムとして提供される。
【００２３】
外部ヒープ処理部１４による外部メモリ領域３１の生成、外部メモリ領域３１へのデータ生成、外部メモリ領域３１の解放のための記述を含んだＪａｖａプログラム２０の例を図２に示す。図２において、２行目の文２０１は、外部メモリ領域３１を生成する記述であり、４行目のｅｎｔｅｒメソッドから６行目のｅｘｉｔメソッドまでの処理２０２において生成したデータは、確保した外部メモリ領域３１内に生成される。９行目の文２０３は、外部メモリ領域３１を解放する記述である。
【００２４】
図３に外部ヒープ処理部１４が外部ヒープ３０を利用するときの外部メモリ領域３１の状態遷移の一例を示す。図３の時刻（Ｔ０）において、図示のような外部ヒープ３０で、外部ヒープ３０内に外部メモリ領域３１（図中、３１ａ、３１ｂ）が存在する状態を考える。時刻（Ｔ１）ではＪａｖａプログラム２０の実行中に外部メモリ領域３１を新たに生成する指令により外部メモリ３１ｃを生成した状態を示した図である。上記指令により外部ヒープ処理部１４が外部ヒープ３０内に新たな外部メモリ領域３１ｃを生成する。
【００２５】
時刻（Ｔ２）では、実行中のＪａｖａプログラム２０から確保した外部メモリ領域３１ｃにデータを生成する指示により外部メモリ領域３１ｃにデータが生成された状態を示す。時刻（Ｔ３）ではＪａｖａプログラム２０が外部メモリ領域３１に領域の解放指示を出し、外部ヒープ処理部１４の外部メモリ解放部１７が外部ヒープ３０から該当する外部メモリ領域３１ｃを解放した状態を示した図である。
【００２６】
この例のように、外部ヒープ３０及び外部メモリ領域３１は外部ヒープ処理部１４の機能によりＪａｖａプログラムから管理することができる。
【００２７】
図４は、外部メモリの部分解放部１８が行う処理の一例を示すフローチャートである。この処理はＪａｖａ仮想マシン１０のガベージコレクタ１３によるガベージコレクション実行後や、Ｊａｖａプログラム２０の実行中など、所定のタイミングで実行する。
【００２８】
まず、処理１８１において、外部メモリの部分解放部１８は、処理を行う外部メモリ領域（対象メモリ）３１を選択する。対象とする外部メモリ領域３１は複数であってもよい。処理１８２において、外部メモリの部分解放部１８は、対象とする外部メモリ領域３１内のオブジェクトについて、今回の処理の対象外の外部メモリ領域３１のオブジェクトからの参照の有無について判定する。この外部メモリ領域３１のオブジェクトの参照については、前記特許文献１の段落０００９〜００１４に記載や、周知または公知の手法を用いることができる。すなわち、現在外部メモリの部分解放処理の対象となっている外部メモリ領域３１内のデータ等のオブジェクトについて、現在外部メモリの部分解放処理の対象となっていない外部メモリ領域のデータなどのオブジェクトから参照されているか否かを判定し、対象となっている外部メモリ領域３１内のオブジェクトが対象外の外部メモリ領域３１から参照されていれば処理１８４に進む一方、当該処理１８３において参照がない場合は処理１８６へ移る。
【００２９】
処理１８３の判定において参照があった場合の処理１８４では、外部メモリの部分解放部１８は、外部ヒープ３０から新たな外部メモリ領域（新規メモリ）３１を確保する。このとき、外部メモリの部分解放部１８は、新たに外部ヒープ３０内で確保した新規メモリは処理済みとする。
【００３０】
次に、外部メモリの部分解放部１８は、処理１８５において、上記処理１８２、１８３の判定で、他の外部メモリ領域からの参照が有ったオブジェクトと、処理対象の外部メモリ領域３１内で参照しているオブジェクトを、処理１８４で確保した新規メモリに移動する。そして、これら移動対象のオブジェクトを参照している他の外部メモリ領域のオブジェクトの参照先と、移動対象のオブジェクト間での参照先を移動後の新規メモリのオブジェクトへと修正する。すなわち、外部メモリ領域の部分解放処理の対象外の外部メモリ領域のオブジェクト（以下、対象外のオブジェクト）が、部分解放処理の対象となった外部メモリ領域３１内のオブジェクト（以下、対象オブジェクト）を参照している場合、対象外のオブジェクトの参照先を新規メモリへ移動した対象オブジェクトのアドレスに更新する。また、新規メモリへ移動した対象オブジェクト間で、参照関係が存在する場合には、参照先のアドレスを新規メモリのアドレスに更新する。
【００３１】
次に、外部メモリの部分解放部１８は、処理１８６において、対象外のオブジェクトから参照されているオブジェクトが、処理対象となっている外部メモリ領域３１から新たに確保した新規メモリへの移動が完了すると、処理対象の外部メモリ領域３１内には、処理の対象外の外部メモリ領域から参照されないオブジェクトのみが残存するため、当該処理対象の外部メモリ領域３１を解放する。
【００３２】
処理１８７において、外部メモリの部分解放部１８は、外部ヒープ３０内で処理済みとなっていない外部メモリ領域３１が存在するか否かを判定し、未処理の外部メモリ領域３１が存在する場合には処理１８１へ進み、未処理の外部メモリ領域３１が存在しない場合は処理を終了する。
【００３３】
本実施形態では、外部メモリの部分解放部１８の処理対象となった外部メモリ領域３１内に対象外のオブジェクトから参照されている対象オブジェクトがある場合は、常に新規メモリを確保して、処理対象の外部メモリ領域３１から対象オブジェクトのみを新規メモリへ移動した後に、処理対象の外部メモリ領域３１の部分解放処理を実施することにより、外部ヒープ３０の領域の利用効率を向上させることが可能となる。
【００３４】
次に、図５は、前記図４に示した外部メモリの部分解放部１８が行う処理の変形例を示すフローチャートである。本フローチャートは、上記図４の処理１８４以降の処理を行う条件として、他の外部メモリ領域３１から参照されているオブジェクトの数が閾値未満のときに処理１８４以降を実施するもので、その他の構成は前記図４と同一である。
【００３５】
処理１８１〜処理１８３までは上記図４で説明したとおりである。処理１８０１において、外部メモリの部分解放部１８は、現在の処理の対象外の外部メモリ領域のオブジェクトから参照される対象オブジェクトを検索し、参照されている対象オブジェクトの数を取得する。そして、処理１８０２において、対象外のオブジェクトから参照されている対象オブジェクトの数が、予め設定した閾値ｔｈ１を下回った場合は処理１８４に移る。処理１８０２において、対象外のオブジェクトから参照されている対象オブジェクトの数が閾値ｔｈ１を下回らなかった場合（閾値ｔｈ１以上）は、部分解放処理を行わずに処理１８７に移る。処理１８４および処理１８７はいずれも説明済みであるため、ここでは説明を省略する。
【００３６】
上記処理により、他の外部メモリ領域３１から参照されている対象オブジェクトの数が閾値ｔｈ１未満になった場合は、現在処理対象の外部メモリ領域３１内のオブジェクトのうち、今後Ｊａｖａプログラム２０が利用する予定のないオブジェクトの数が増大したことを示す。このため、使用される予定のないオブジェクトが占有している外部メモリ領域３１を解放し、外部ヒープ３０を有効に利用することができる。
【００３７】
次に、図６は、前記図４に示した外部メモリの部分解放部１８が行う処理の他の変形例を示すフローチャートである。本フローチャートは、上記図４の処理１８４以降の処理を行う条件として、他の外部メモリ領域から参照されているオブジェクトのサイズが閾値未満のときに処理１８４以降を実施するもので、その他の構成は前記図４と同一である。
【００３８】
処理１８１〜処理１８３までは前記図４で説明したとおりである。処理１８０３において、外部メモリの部分解放部１８は、現在の処理の対象外の外部メモリ領域のオブジェクトから参照される対象オブジェクトのうち、全オブジェクトが占有する外部メモリ領域３１のサイズを取得する。処理１８０４において、前記取得した占有領域のサイズが閾値ｔｈ２を下回る場合、処理１８４に移る。処理１０８０４において、前記取得した占有領域のサイズが閾値ｔｈ２を下回らない場合（ｔｈ２以上）は、処理１８７に移る。処理１８４および処理１８７はいずれも説明済みであるため、ここでは説明を省略する。
【００３９】
上記処理により、他の外部メモリ領域３１から参照されている対象オブジェクトのサイズが閾値ｔｈ２未満になった場合は、現在処理対象の外部メモリ領域３１内のオブジェクトのうち、今後Ｊａｖａプログラム２０が利用する予定のないオブジェクトの容量が増大したことを示す。このため、使用される予定のないオブジェクトが占有している外部メモリ領域３１を解放し、外部ヒープ３０を有効に利用することができる。
【００４０】
図４に示した部分解放処理による外部メモリ領域３１の状態遷移の一例を図７、図８に示す。図７は部分解放処理による外部メモリ領域３１の状態遷移を示す説明図である。図８は部分解放処理による外部メモリ領域３１の状態遷移の詳細を示す説明図である。
【００４１】
図７の時刻ｔ０で、外部メモリ生成部１５が外部ヒープ３０に新たな外部メモリ領域３１を生成し、時刻ｔ１で外部メモリへのデータ生成部１６が、新たな外部メモリ領域３１に複数のオブジェクトＲ１〜Ｒ５を生成した状態を示す。
【００４２】
時刻ｔ１において、外部メモリ領域３１の外からオブジェクト１，４，５（図中５１，５４，５５）が参照され、オブジェクト１（図中５１）がオブジェクト２，３（図中、５２，５３）を参照し、オブジェクト５（図中、５５）がオブジェクト（図中、５６）を参照し、それぞれがＪａｖａプログラム２０の実行に必要なオブジェクトである。ここで、外部メモリ領域３１の外部からオブジェクト１への参照をＲ１とし、オブジェクト４への参照をＲ４、オブジェクト５への参照をＲ５とする。
【００４３】
Ｊａｖａプログラム２０の実行が進み、時刻ｔ２において外部メモリ領域３１の外部からの参照Ｒ１およびＲ４がなくなったとする。その時の外部メモリ領域３１の状態は参照Ｒ１，Ｒ４がなくなるためオブジェクト１およびオブジェクト４が不要となる。また、オブジェクト１が参照するオブジェクト２、３も不要となる。一方、参照Ｒ５は残っているためオブジェクト５と、オブジェクト５が参照するオブジェクト６が以降のＪａｖａプログラム２０の実行に必要なオブジェクトである。
【００４４】
時刻ｔ２の状態で、オブジェクト１〜４が占有した領域は不要領域（図７参照）となり、オブジェクト５，６が占有した領域は必要領域（図７参照）となる。この時点（時刻ｔ３）以降に、外部メモリの部分解放部１８が外部メモリ領域３１の部分解放処理を実行する。
【００４５】
上記図４の処理１８１では、外部メモリの部分解放部１８が、図７、図８に示す時刻ｔ３で外部メモリ領域３１を処理の対象として選択する。以下、外部メモリの部分解放部１８が選択した処理対象の外部メモリ領域３１を対象メモリと呼ぶ。上記図４の処理１８２により、外部メモリの部分解放部１８は選択した対象メモリ内のオブジェクト１〜５について、対象外のメモリ領域から対象メモリへの参照を検出する。上記図４の処理１８３により、外部から参照されている参照Ｒ５が存在するため、上記図４の処理１８４に移る。
【００４６】
処理１８４では、図８の時刻ｔ３で示すように、外部メモリの部分解放部１８が外部ヒープ３０内に新たな外部メモリ領域（新規メモリ）３１ｎを生成する。
【００４７】
図４の処理１８５では、図８の時刻ｔ４で示すように、外部メモリの部分解放部１８が参照Ｒ５の参照先オブジェクトであるオブジェクト５と、オブジェクト５が参照しているオブジェクト６を新規メモリに移動し、それぞれをオブジェクト５’とオブジェクト６’とする。この移動に伴い参照Ｒ５を使用している外部のオブジェクトの参照先を移動先である新規メモリ３１ｎのオブジェクト５’に修正しＲ５’とし、オブジェクト５からオブジェクト６への参照も、新規メモリ３１ｎへ移動後のオブジェクト６’への参照に修正する。
【００４８】
この処理を実施することで対象メモリは図８の時刻ｔ４に示す状態になる。参照Ｒ５’によって参照されるオブジェクト５およびオブジェクト６以外のオブジェクトは対象メモリに残った状態である。
【００４９】
次に、上記図４の処理１８６により対象メモリを解放した状態が図８の時刻ｔ５である。対象メモリの解放に伴い、新規メモリ３１ｎに移動しなかったオブジェクト１〜４が削除される。このため、外部ヒープ３０内で今後使用される予定のないオブジェクト１〜４を含む外部メモリ領域３１は解放されて、外部ヒープ３０の利用効率を高めることができる。
【００５０】
上記のように、本実施例はＪａｖａ仮想マシン１０による実行を例示したが、Ｊａｖａ仮想マシン１０に限らず、オブジェクトの管理ができるプログラム処理系においても、本手法を適用できる。また、上記実施形態では外部メモリ領域３１への参照を、他の外部メモリ領域３１からの参照する例を示したが、Ｊａｖａプログラム２０が参照するオブジェクトを含めても良い。
【００５１】
以上のように第１実施形態によれば、プログラムで管理する外部メモリ領域３１に対して、確保中の外部メモリ領域内にあるデータの要否判定を行い、不要なデータが占有する領域を解放して、不要な外部メモリ領域３１を削除し、Ｊａｖａプログラム２０の実行で必要とするオブジェクトを新たに確保した外部メモリ領域３１へ移動することで外部ヒープ３０の利用効率を向上できる。
【００５２】
なお、外部メモリの部分解放部１８の処理を開始するタイミングとしては、ガベージコレクタ１３によるガベージコレクション実行後や、Ｊａｖａプログラム２０の実行中などの他、外部ヒープ３０の不要領域を監視する処理を実行して、不要領域のサイズやオブジェクトの数が予め設定した閾値を超えたときに外部メモリの部分解放処理を実行するようにしてもよい。外部ヒープ３０の不要領域を監視する処理は、例えば、上述したオブジェクトの参照関係から不要領域を求める処理を外部ヒープ処理部１４等で実施することができる。
【００５３】
また、処理１８０３，１８０４に代わって、外部ヒープ３０内で外部メモリ領域３１が占有する領域のサイズの総和が予め設定した閾値ｔｈ３を超えたときに、図４の処理１８４以降を実行するようにしてもよい。外部メモリ領域３１が占有する領域のサイズの総和が予め設定した閾値ｔｈ３を超えると、Ｊａｖａプログラム２０によって多数の外部メモリ領域３１が外部ヒープ３０に生成された可能性があるので、外部ヒープ３０がＪａｖａプログラム２０に提供できる領域を増大するために、外部メモリの部分解放部１８を機能させることができる。
【００５４】
また、処理１８０３，１８０４に代わって、外部ヒープ３０内で新たに確保した外部メモリ領域３１（新規メモリ）の数が、予め設定した閾値ｔｈ４超えたときに、図４の処理１８４以降を実行するようにしてもよい。新規メモリの数が予め設定した閾値ｔｈ４を超えると、外部メモリの部分解放部１８が繰り返して機能したと判定できるので、外部ヒープ３０がＪａｖａプログラム２０に提供できる領域を増大するために、外部メモリの部分解放部１８を機能させることができる。
【００５５】
＜第２実施形態＞
図９は、本発明の第２の実施形態を示し、外部メモリの部分解放部１８で行われる処理を示すフローチャートである。図９の処理は、前記第１実施形態の図４の処理の一部を変更したもので、その他の構成は前記第１実施形態と同様である。
【００５６】
第２実施形態では、Ｊａｖａ仮想マシン１０が実行するＪａｖａプログラム２０に外部ヒープ３０を利用する命令が記述されている場合、Ｊａｖａ仮想マシン１０が外部メモリの部分解放部１８の処理を実行し、外部メモリ領域３１内のデータ（オブジェクト）で後の実行に不要なオブジェクトが占有する領域のみを解放して、外部メモリ領域３１を縮小する。
【００５７】
図９の処理は、Ｊａｖａ仮想マシン１０のガベージコレクション実行後や、プログラム実行中などに実施する。
【００５８】
処理１８１〜処理１８３までは前記第１実施形態の図４と同一である。処理１８０５において、外部メモリの部分解放部１８は、処理対象の外部メモリ領域３１の全てのオブジェクトについて、他の外部メモリ領域３１また同一の外部メモリ領域３１のオブジェクトから参照されたオブジェクトが参照している対象メモリ内のオブジェクトを検出する。
【００５９】
次に、処理１８０６において、上記処理１８０５で検出したオブジェクトを除く対象メモリ内のオブジェクトを抽出する。抽出されたオブジェクトは、他のオブジェクトからどこからも参照されないオブジェクトであるので、今後のＪａｖａプログラム２０の実行に利用される予定はない。したがって、外部メモリの部分解放部１８は、対象とする外部メモリ領域３１のうち、どこからも参照されていないオブジェクトが占有する領域を解放して、外部メモリ領域３１を縮小した後、処理１８７に移る。処理１８７は前記第１実施形態の図４で説明済みであるため、ここでは説明を省略する。
【００６０】
なお、図９で説明した処理１８０５で取得した対象メモリ内で他のオブジェクトから参照されるオブジェクトの数が閾値を下回った場合に処理１８０６を実施してもよい。その場合の処理を図１０に示す。
【００６１】
図１０は本発明の第２の実施形態を示し、外部メモリの部分解放部１８で行われる処理の他の例を示すフローチャートである。
【００６２】
処理１８１〜処理１８３および処理１８０５までは上記で説明したとおりである。処理１８０７において、外部メモリの部分解放部１８が他のオブジェクトから参照されるオブジェクトの数を取得する。処理１８０８において、外部メモリの部分解放部１８は、参照されるオブジェクトの数が閾値ｔｈ１を下回った場合、処理１８０６に移り、下回らなかった場合は処理１８７に移る。処理１８０６および処理１８７は上記で説明済みであるためここでは説明を省略する。
【００６３】
上記処理により、他の外部メモリ領域３１または同一の外部メモリ領域３１のオブジェクトから参照されている対象オブジェクトの数が閾値ｔｈ１に未満になった場合は、現在処理対象の外部メモリ領域３１内のオブジェクトのうち、今後Ｊａｖａプログラム２０が利用する予定のないオブジェクトの数が増大したことを示す。このため、使用される予定のないオブジェクトが占有している外部メモリ領域３１内の領域のみを解放し、外部メモリ領域３１を縮小することで外部ヒープ３０を有効に利用することができる。
【００６４】
図９で説明した処理１８０５で取得した対象メモリ内で他のオブジェクトから参照されるオブジェクトが占有する領域サイズが閾値ｔｈ２を下回った場合に処理１８０６を実施してもよい。その場合の処理を図１１に示す。
【００６５】
図１１は本発明の第２の実施形態を示し、外部メモリの部分解放部１８で行われる処理のさらに他の例を示すフローチャートである。
【００６６】
図１１において、処理１８１〜処理１８３および処理１８０５までは上記で説明したとおりである。処理１８０９において、外部メモリの部分解放部１８が他のオブジェクトから参照されるオブジェクトが占有する領域サイズを取得する。処理１８１０において、参照されるオブジェクトが占有する領域サイズが閾値ｔｈ２を下回った場合、処理１８０６に移り、下回らなかった場合は処理１８７に移る。処理１８０６および処理１８７は上記で説明済みであるためここでは説明を省略する。
【００６７】
上記処理により、他の外部メモリ領域３１または同一の外部メモリ領域３１から参照されている対象オブジェクトのサイズが閾値ｔｈ２に未満になった場合は、現在処理対象の外部メモリ領域３１内のオブジェクトのうち、今後Ｊａｖａプログラム２０が利用する予定のないオブジェクトの容量が増大したことを示す。このため、外部メモリの部分解放部１８は、使用される予定のないオブジェクトが占有している外部メモリ領域３１の領域のみを解放して、外部メモリ領域３１を縮小することで外部ヒープ３０を有効に利用することができる。
【００６８】
図９〜図１１に示した処理による外部メモリ領域の状態遷移の一例を図１２に示す。図１２の時刻ｔ０に外部メモリ領域３１に複数のオブジェクト１〜６（５１〜５６）が生成された状態を示す。外部メモリ領域３１の外部からオブジェクト１，４，５が参照され（Ｒ１，Ｒ４，Ｒ５）、オブジェクト１からオブジェクト２，３を参照し、オブジェクト５からオブジェクト６を参照し、それぞれがＪａｖａプログラム２０の実行に必要なオブジェクトである。
【００６９】
時刻ｔ１においてＪａｖａプログラム２０の実行が進み、外部メモリ領域３１の外部からの参照Ｒ１およびＲ４がなくなったとする。この状態で外部メモリの部分解放部１８が外部メモリ領域３１の部分解放処理を実行したとする。上記図９の処理１８１では、外部メモリの部分解放部１８が図１２に示す外部メモリ領域３１を選択する（この外部メモリ領域を対象メモリと呼ぶ）。処理１８２により、外部メモリの部分解放部１８が対象外メモリ領域からの参照の有無を検出する。時刻ｔ１においては、図１２で示すように、処理１８３により参照Ｒ５が存在するため、処理１８０５に移る。処理１８０５において、参照Ｒ５の参照先オブジェクトであるオブジェクト５から参照している対象メモリ内のオブジェクトの有無を判定すると、オブジェクト６がオブジェクト５の参照先として判定され、それ以外のオブジェクト（オブジェクト１〜４）が参照されないオブジェクトとして判定される。そして、時刻ｔ２では処理１８０６によって、外部メモリの部分解放部１８は対象メモリのうち、他のオブジェクトから参照されないオブジェクト（オブジェクト１〜４）が占有する領域のみを解放し、外部メモリ領域３１を縮小する。この時点における外部メモリ領域３１の状態が図１２の時刻ｔ２である。部分解放処理の対象メモリには対象外メモリ領域から参照されるオブジェクト５と、当該オブジェクト５が参照しているオブジェクト６のみが残っており、それ以外のオブジェクトが占有していた領域（不要領域）が解放され、外部メモリ領域３１の利用効率を高めることができる。
【００７０】
以上のように第２実施形態によれば、プログラムで管理する外部メモリ領域３１に対して、確保中の外部メモリ領域３１内にあるデータの要否判定を行い、不要なデータが占有する領域のみを解放して、外部メモリ領域３１内の不要領域を削除することで外部ヒープ３０の利用効率を向上できる。
【００７１】
また、処理１８０３，１８０４に代わって、外部ヒープ３０内で外部メモリ領域３１が占有する領域のサイズの総和が予め設定した閾値ｔｈ３を超えたときに、図１０、図１１の処理１８０６を実行するようにしてもよい。
【産業上の利用可能性】
【００７２】
以上のように、本発明は、外部ヒープを利用する計算機システムやプログラムに適用することができる。
【符号の説明】
【００７３】
１  ＣＰＵ
２  メモリ
１０  ＪａｖａＶＭ
１４  外部ヒープ処理部
１５  外部メモリ生成部
１６  外部メモリへのデータ生成部
１７  外部メモリ解放部
１８  外部メモリの部分解放部
２０  Ｊａｖａプログラム
２１  Ｊａｖａヒープ
３０  外部ヒープ
【図１】
0005391422.tif 000002
【図２】
0005391422.tif 000003
【図４】
0005391422.tif 000004
【図５】
0005391422.tif 000005
【図６】
0005391422.tif 000006
【図９】
0005391422.tif 000007
【図１０】
0005391422.tif 000008
【図１１】
0005391422.tif 000009
【図３】
0005391422.tif 000010
【図７】
0005391422.tif 000011
【図８】
0005391422.tif 000012
【図１２】
0005391422.tif 000013