(57)【要約】【課題】コンパクションの発生頻度を減少させ、空きメモリ領域の探索時間を短縮して高速なメモリアロケーションを実現し、更にはメモリ領域不足によるアプリケーションエラーを回避するメモリマネジメントプログラムおよび方法を提供する。【解決手段】このメモリマネジメントプログラムは、ＣＰＵ１に、メモリ割り付け要求が発生した場合に、要求されるメモリサイズに応じて、サイズ別のメモリ要求頻度と生存率との統計的データに基づいて分割された複数のメモリセグメントの中から一のメモリセグメントを特定し、当該メモリセグメントの空きメモリにメモリ割り付けを行う機能を実現させる。【選択図】      図１
2006048237.tif 000002
【特許請求の範囲】
【請求項１】
制御手段に、メモリ割り付け要求が発生した場合に、要求されるメモリサイズに応じて、サイズ別のメモリ要求頻度と生存率との統計的データに基づいて分割された複数のメモリセグメントの中から一のメモリセグメントを特定し、当該メモリセグメントの空きメモリにメモリ割り付けを行う機能を実現させることを特徴とするメモリマネジメントプログラム。
【請求項２】
前記複数のメモリセグメントに含まれる空きメモリは、メモリセグメントごとに独立したリンクリストにより管理されていることを特徴とする請求項１に記載のメモリマネジメントプログラム。
【請求項３】
制御手段が、メモリ割り付け要求が発生した場合に、
要求されるメモリサイズに応じて、サイズ別のメモリ要求頻度と生存率との統計的データに基づいて分割された複数のメモリセグメントの中から一のメモリセグメントを特定するステップと、
当該メモリセグメントの空きメモリにメモリ割り付けを行うステップと
を実行することを特徴とするメモリマネジメント方法。
【請求項４】
前記複数のメモリセグメントに含まれる空きメモリは、メモリセグメントごとに独立したリンクリストにより管理されていることを特徴とする請求項３に記載のメモリマネジメント方法。
【請求項５】
前記複数のメモリセグメントの境界を動的に変更するステップをさらに有することを特徴とする請求項３または請求項４に記載のメモリマネジメント方法。
【請求項６】
前記複数のメモリセグメントの各々におけるメモリ割り付けを固定長とすることを特徴とする請求項３から請求項５のいずれか１項に記載のメモリマネジメント方法。
【請求項７】
前記複数のメモリセグメントにはアドレス上位側または下位側から順にメモリ割り付けが行われ、各メモリセグメントの空きメモリ領域の先頭を指し示すポインタにより空きメモリが管理されており、このポインタが指すアドレスを起点としてメモリ割り付けが行われることを特徴とする請求項３に記載のメモリマネジメント方法。
【請求項８】
上記複数のメモリセグメントのそれぞれが空きメモリ不足となった場合にメモリ割り付けを行うための予備メモリセグメントが設けられていることを特徴とする請求項３から請求項７のいずれか１項に記載のメモリマネジメント方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリマネジメント方法に関する。
【背景技術】
【０００２】
従来、例えばオペレーティングシステム（以下、ＯＳと称する）上でアプリケーションソフトウェアを実行する場合には、ＯＳからアプリケーションソフトウェア側にヒープを確保した位置のアドレスが渡され、当該アプリケーションソフトウェアは当該アドレスの値を元にして確保したヒープを使用することになる。このような場合も含めて、空きメモリを効率良く管理することは予てから嘱望されている。そして、このような効率的なメモリマネジメントを実現する為の種々の技術が開発されている。
【０００３】
ここで、図８に示されるように、空きメモリを管理する手法の一つである動的メモリ割り付け法では、空きメモリ割り付け表により空きメモリのポインタとサイズを管理しており、当該空きメモリ割り付け表を参照することで、要求されるメモリサイズに応じて適切な空きメモリを割り付けている。そして、使用後の空きメモリは空きメモリ割り付け表に追加され、再使用可能とされる（以下、先行例１と称する）。
【０００４】
そして、図９に示されるように、空きメモリ内にそのサイズ(size)と次の空きメモリの先頭アドレス(next)とを埋め込み、システム側に最初の空きメモリ位置を指すポインタを持たせて、空きメモリをリンクリストで管理する方法がある。この方法では、システムからメモリ割り付け要求があると、空きメモリリンクリストを辿って割り付け可能なサイズの空きメモリを見付けてメモリ割り付けを行う。使用後の空きメモリはリンクリストに追加されて、再利用可能とされる（以下、先行例２と称する）。
【０００５】
また、図１０に示されるように、ヒープの片側（低アドレス側または高アドレス側）からメモリ割付を開始し、システム側に使用可能な空きメモリの先端を示すポインタを持たせる方法もある。しかし、この方法では割り付けられたメモリの使用が終わって、実際には空きメモリになっていても、当該ポインタよりもメモリ割り付け開始側（図１０では左側）のメモリは再利用できない。そこで、当該ポインタがメモリ割り付けの終端側（図１０では右端）に達した際に、使用済みメモリを回収するとともに使用中のメモリをメモリ割り付け開始側（図１０では左側）に寄せる処理、すなわちコンパクションを実行し、使用可能な空きメモリの先端をメモリ割り付け開始側に戻し、当該ポインタが指す位置を併せて変更することで、再利用可能とする方法が知られている（以下、先行例３と称する）。
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記先行例１では、空きメモリ割り付け表にサイズ制限があると、管理できる空きメモリの数は有限になる。さらに、空きメモリ割り付け表を参照してから空きメモリを探索することになるので、その分のオーバーヘッドが大きくなる。
【０００７】
そして、上記先行例２では、要求されたサイズのメモリを割り当てるためにリンクリストを順番に探っていく必要がある。従って、空きメモリを順次サーチすると特に空きメモリが細分化して分散している場合（すなわち、所謂フラグメンテーションを起こしている場合）には、処理に時間を要してしまうことになる。
【０００８】
また、先行例３では、メモリアロケーションに関しては高速に処理できるものの、空きメモリの管理ができないため、必要なメモリが不足した場合にはメモリアロケーション自体を諦めるか、コンパクション技法を用いて不要なメモリを回収した後にメモリの移動を行う必要がある。このコンパクションには時間を要することから、迅速なメモリアロケーションを阻害する要因となり得る。
【０００９】
本発明の目的とするところは、コンパクションの発生頻度を減少させ、空きメモリの探索時間を短縮して高速なメモリアロケーションを実現し、メモリ領域不足によるアプリケーションエラーを回避することにある。
【課題を解決するための手段】
【００１０】
上記目的を達成するために、本発明の第１の態様では、制御手段に、メモリ割り付け要求が発生した場合に、要求されるメモリサイズに応じて、サイズ別のメモリ要求頻度と生存率との統計的データに基づいて分割された複数のメモリセグメントの中から一のメモリセグメントを特定し、当該メモリセグメントの空きメモリにメモリ割り付けを行う機能を実現させることを特徴とするメモリマネジメントプログラムが提供される。
【００１１】
上記第１の態様においては、前記複数のメモリセグメントに含まれる空きメモリを、メモリセグメントごとに独立したリンクリストにより管理することができる。
【００１２】
本発明の第２の態様では、制御手段が、メモリ割り付け要求が発生した場合に、要求されるメモリサイズに応じて、サイズ別のメモリ要求頻度と生存率との統計的データに基づいて分割された複数のメモリセグメントの中から一のメモリセグメントを特定するステップと、当該メモリセグメントの空きメモリにメモリ割り付けを行うステップとを実行することを特徴とするメモリマネジメント方法が提供される。
【００１３】
上記第２の態様においては、前記複数のメモリセグメントに含まれる空きメモリを、メモリセグメントごとに独立したリンクリストにより管理することができ、前記複数のメモリセグメントの境界を動的に変更するステップをさらに有することも可能である。また、前記複数のメモリセグメントの各々におけるメモリ割り付けを固定長とすることもできる。さらに、前記複数のメモリセグメントにはアドレス上位側または下位側から順にメモリ割り付けが行われ、各メモリセグメントの空きメモリ領域の先頭を指し示すポインタにより空きメモリが管理されており、このポインタが指すアドレスを起点としてメモリ割り付けが行われるようにしてもよい。さらにまた、上記複数のメモリセグメントのそれぞれが空きメモリ不足となった場合にメモリ割り付けを行うための予備のメモリセグメントを設けてもよい。
【発明の効果】
【００１４】
本発明によれば、サイズ別のメモリ要求頻度と生存率との統計的データに基づいて分割された複数のメモリセグメントを、要求されるメモリサイズに応じて使い分けることにより、コンパクションの発生頻度を減少させて、高速なメモリアロケーションを実現することができる。特に空きメモリをメモリセグメントごとのリンクリストで管理している場合には、空きメモリの探索時間を短縮することができるので、極めて高速なメモリアロケーションを実現することができる。また、本発明の効果はアドレス上位側または下位側から順にメモリ割り付けが行われ、各メモリセグメントの空きメモリ領域の先頭を指し示すポインタにより空きメモリを管理する場合にも有効である。
【発明を実施するための最良の形態】
【００１５】
以下、図面を参照して本発明の一実施の形態について説明する。
【００１６】
図１には本発明の一実施の形態に係るメモリマネジメント方法を実施するシステムの構成例を示し詳細に説明する。図１に示されるように、本システムは、システム全体の制御を司るＣＰＵ１、第１の記憶部２、第２の記憶部３を具備している。そして、このシステムは、各種組み込み機器、例えばホームサーバ等の家庭用ゲートウェイ機器や携帯電話機、ＰＤＡ（携帯情報端末）等のモバイル端末等に適用可能なものである。
【００１７】
第１の記憶部２には、ポインタテーブル４、ＯＳ上で実行されるＪａｖａ（登録商標）アプリケーション５、クラスライブラリ６、バーチャル・マシン（以下、ＶＭと称する）プログラム７が格納されている。Ｊａｖａ（登録商標）アプリケーションはＪａｖａ（登録商標）言語でソースコードが作成されたものである。クラスライブラリ６には、様々な機能を有する複数のメソッドがカテゴリ毎にクラスに分類されて集められている。
【００１８】
また、第２の記憶部３は揮発性の記憶素子であるＲＡＭ等により構成されており、そのメモリ領域の一部は第１〜第ｎ（ｎは自然数）メモリセグメントに分割されていて、ＶＭがＪａｖａ（登録商標）アプリケーションを実行するためのヒープ領域として使用される。これら各メモリセグメントにおける空きメモリは、それぞれ独立したリンクリストで管理されており、ポインタテーブル４は各リンクリストにおける最初の空きメモリの先頭アドレスに対するポインタを保持している。  すなわち、ポインタテーブル４を参照することにより、第１〜第ｎメモリセグメントのいずれかの空きメモリの１つに到達することができ、さらにリンクリストにより各メモリセグメント内の他の空きメモリを辿ることができるようになっている。
【００１９】
この例では、メモリサイズは第１のメモリセグメントはｍｅｍ１未満、第２のメモリセグメントはｍｅｍ１以上ｍｅｍ２未満、第３メモリセグメントはｍｅｍ２以上ｍｅｍ３未満、・・・、第ｎメモリセグメントはｍｅｍ［ｎ−１］以上のサイズのオブジェクトが割り付けられるようになっている。
【００２０】
この実施の形態では、上記のようにＪａｖａ（登録商標）アプリケーションを実行するためのヒープ領域が、割り付けられるメモリ（オブジェクト）のサイズに応じたメモリセグメントに分割されており、各メモリセグメント毎に独立したリンクリストにより空きメモリの管理がなされることを特徴の一つとしている。
【００２１】
本発明者らは、Ｊａｖａ（登録商標）アプリケーション実行中に発生するメモリ割り付け要求について、その要求メモリサイズと割り付けられたメモリ（オブジェクト）の生存する長さとを調査した結果、要求メモリサイズによってメモリ割り付け要求の発生頻度には偏りがあり、また、サイズによってオブジェクトの生存率も相違していることを見出した。さらに、メモリサイズ毎のメモリ割り付け要求の発生頻度と生存率との乗算値をもって当該サイズのオブジェクトについて必要なヒープサイズを予測することができることから、ヒープ領域を当該ヒープサイズ毎のメモリセグメントに分割し、要求メモリサイズに応じて各メモリセグメントを使い分けることで、より効率的なメモリマネジメントが可能になることを見出した。特に、空きメモリをリンクリストにより管理する方法においては、上記のようにヒープ領域をメモリセグメントに分割し、各メモリセグメントを独立したリンクリストで管理することで、個々のリンクリストを短縮して空きメモリの探索に要するオーバーヘッドを軽減することも可能である。
【００２２】
具体的には、例えば第１メモリセグメントは０〜４ｂｙｔｅ、第２メモリセグメントは４〜８ｂｙｔｅ、第ｎメモリセグメントは３２ｂｙｔｅ以上のようにメモリセグメントを分割するようにしてもよい。
【００２３】
このように要求メモリサイズに応じて複数のメモリセグメントを使い分けることにより、各メモリセグメントにおけるメモリ利用の単位を所定の範囲内に納めることができる。したがって、メモリ割り付け可能な空きメモリを速やかに見出すことが可能であり、迅速なメモリ割り付けが可能となるのである。
【００２４】
ここで、図２及び図３を参照して、上記構成のシステムによるメモリマネジメントについて詳細に説明する。尚、図２は分割された第１〜第ｎメモリセグメントと各ポインタとの関係を示す図であり、図３はメモリセグメント内の空きメモリを管理するリンクリストの説明図である（ここでは第１メモリセグメントを例示）。これら図２及び図３において、破線部分は使用中メモリを示し、その他は空きメモリを示している。
【００２５】
前述したように、ヒープは複数のメモリセグメントに分割されており、ポインタテーブル４には各メモリセグメントの空きメモリの１つへのポインタを保持している。このメモリマネジメント方法では、メモリ割り付けの要求が発生すると、要求されたメモリサイズに応じて第１〜第ｎメモリセグメントのいずれかを選択し、選択したメモリセグメントの空きメモリへのポインタをポインタテーブル４より読み出し、当該空きメモリにアクセスする。各メモリセグメントの空きメモリには自分のサイズと次の空きメモリへのポインタとが格納されており、リンクリストをなしているので、このリンクリストを辿って割り付け可能なサイズの空きメモリを見付けてメモリ割り付けを行う。
【００２６】
例えば、図３の例では、先ず要求されたメモリサイズに応じて第１のメモリセグメントが選択され、当該第１のメモリセグメントの空きメモリに対するポインタがポインタテーブル４より読み出され、当該第１のメモリセグメント内の空きメモリがなすリンクリストを＃１→＃２→＃３→＃４→＃５と辿って、割り付け可能なサイズの空きメモリを見付けてオブジェクトを割り付ける。
【００２７】
ここで、図４（ａ）はヒープをメモリセグメントに分割していない場合におけるメモリアロケーションの概略図であり、図４（ｂ）は本実施の形態に係るシステムによるメモリアロケーションの様子を示す図である。
【００２８】
図４（ａ）に示す例では、１回のサーチに時間ｔだけ要すると仮定すると要求サイズの空きメモリを見出すまでにｔ×サーチ回数だけ要することになるが、図４（ｂ）に示す例では、先ず要求メモリサイズによりメモリセグメントが選択されるので、高速なメモリアロケーションが実現される。すなわち、この図４（ｂ）に示される例では、要求メモリサイズＳがＮ１＜Ｓ＜Ｎ２であることから、Ｎ１超Ｎ２未満のオブジェクトが割り付けられるメモリセグメントのみを対象として空きメモリのサーチを行う。このため、図４（ａ）のように全空きメモリを対象としてサーチを行う場合に比べて、図４（ｂ）の場合にはメモリ割り付け可能な空きメモリを見出すまでの時間が短くなるのである。
【００２９】
さらに、図５に示されるように、経験則から同程度のサイズのメモリの取得と開放は定常状態ではバランスを保つため、同程度のサイズのメモリが空いている確率は高い。したがって、本実施の形態によれば、メモリ不足とコンパクションの発生が回避され、これがメモリ割り付け可能な空きメモリの発見に要する時間を短縮できることと相俟って、高速なメモリアロケーションが実現されるのである。
【００３０】
次に、図６及び図７のフローチャートを参照して、本発明の一実施の形態に係るメモリマネジメント方法について詳細に説明する。ここでは、図１を適宜参照する。
【００３１】
この方法に基づく処理を開始すると、先ず要求されているメモリサイズを判断し、その結果に応じてステップＳ１０２−１，Ｓ１０２−２，・・・，Ｓ１０２−ｎに分岐する（ステップＳ１０１）。すなわち、要求メモリサイズがｍｅｍ１未満である場合には第１のメモリセグメントにある空きメモリへのポインタをポインタテーブル４より取得し（ステップＳ１０２−１）、ｍｅｍ１〜ｍｅｍ２の範囲内である場合には第２のメモリセグメントにある空きメモリへのポインタをポインタテーブル４より取得し（ステップＳ１０２−２）、・・・、ｍｅｍ［n-1］以上である場合には第ｎのメモリセグメントにある空きメモリへのポインタをポインタテーブル４より取得する（ステップＳ１０２−２）。
【００３２】
続いて、取得されたポインタにより選択されたメモリセグメントの空きメモリ、すなわち当該メモリセグメントの空きメモリを管理するリンクリストの最初の空きメモリを認識し（ステップＳ１０３）、この認識された空きメモリの大きさが要求サイズ以上であるかを判断する（ステップＳ１０４）。ここで、要求サイズ以上である場合には、認識中の空きメモリにメモリ割り付けを行い（ステップＳ１０５）、処理を終了する。
【００３３】
一方、要求サイズ未満である場合にはリンクリストの最後であるか否かを判断し（ステップＳ１０６）、最後でない場合にはリンクリストを利用して次の空きメモリを認識し（ステップＳ１０７）、上記ステップＳ１０４に戻り、上記処理を繰り返す。
【００３４】
上記ステップＳ１０６において、リンクリストの最後であると判断された場合には、メモリセグメント単位でのコンパクション処理を実施し（ステップＳ１０８）、ポインタの値を修正し（ステップＳ１０９）、得られた空きメモリの容量が要求サイズ以上であるか判断する（ステップＳ１１０）。そして、要求サイズ以上である場合には、この得られた空きメモリにメモリ割り付けを行い（ステップＳ１１１）、本処理を終了する。
【００３５】
一方、要求サイズ未満である場合には、エラー発生と判断し（ステップＳ１１２）、本処理を終了する。
【００３６】
以上説明したように、本発明の一実施の形態に係るメモリマネジメント方法では、メモリサイズ毎のメモリ割り付け要求の発生頻度と生存率との乗算値をもって当該サイズのオブジェクトについて必要なヒープサイズを予測し、ヒープ領域を当該ヒープサイズ毎のメモリセグメントに分割し、要求メモリサイズに応じて各メモリセグメントを使い分けることにより、効率的なメモリマネジメントを実現している。また、上記実施形態では空きメモリを各々リンクリストにより管理しているので、ヒープ領域をメモリセグメントに分割することでリンクリストを短縮することができ、これにより空きメモリの探索に要するオーバーヘッドを軽減することができる。
【００３７】
以上、本発明の実施の形態について説明したが、本発明はこれに限定されることなくその趣旨を逸脱しない範囲で種々の改良・変更が可能であることは勿論である。
【００３８】
例えば、各メモリセグメントの境界は動的に変更可能な構成とすれば、あるメモリセグメントのメモリが圧迫されることを防止することが可能である。その場合には、例えば、あるメモリセグメントにおいて空きメモリの量が一定値よりも少なくなった場合には、そのメモリセグメントを拡げるように境界を変更してもよい。また、実際のＪａｖａ（登録商標）アプリケーション実行時に発生するメモリ割り付け要求の傾向を測定しておき、各メモリセグメントの境界をその傾向に沿った形に動的に変更するようにすることも可能である。
【００３９】
また、各メモリセグメントにおけるメモリ割り付けを固定長とすれば、オーバーヘッドを軽くすることができる。この場合には、リンクリストからsizeが不要となる。
【００４０】
また、各メモリセグメントで線形にメモリアロケーションポイントを移動させる方法を採用してもよい。この場合には、コンパクションが対象とするメモリサイズが小さくなるのでコンパクションのオーバーヘッドを軽減するという効果を得ることができる。さらに、個々のメモリセグメントでメモリ領域不足となった場合に、それを補うための領域を別途（独立したメモリセグメントとして）設けてもよい。
【００４１】
さらに、上記実施形態では、Ｊａｖａ（登録商標）実行環境に本発明を適用した場合を示したが、本発明の範囲がこれに限られるものではないことは言うまでもないことである。
【図面の簡単な説明】
【００４２】
【図１】本発明の一実施の形態に係るメモリマネジメント方法を実施するシステムの構成図。
【図２】分割された第１〜第ｎメモリセグメントと各ポインタとの関係を示す図。
【図３】メモリセグメント内の空きメモリを管理するリンクリストの説明図。
【図４】（ａ）はヒープを割り付けるメモリのサイズに応じたメモリセグメント分割を行っていない場合のメモリアロケーションの様子を示す図、（ｂ）は本実施の形態に係るシステムによるメモリアロケーションの様子を示す図。
【図５】経験則から同程度のサイズのメモリの取得と開放は定常状態ではバランスを保つことが明らかであるので、同程度のサイズのメモリが空いている確率は高いことを説明するための図。
【図６】本発明の一実施の形態に係るメモリマネジメント方法について詳細に説明するフローチャート。
【図７】本発明の一実施の形態に係るメモリマネジメント方法について詳細に説明するフローチャート。
【図８】従来技術に係る空きメモリを管理する手法の一つである動的メモリ割り付け法の説明図。
【図９】従来技術に係る空きメモリリンクリストで空きメモリを管理する方法の説明図。
【図１０】従来技術に係る線形にメモリアロケーションポイントを移動させる方法の説明図。
【符号の説明】
【００４３】
１・・・ＣＰＵ、２・・・第１記憶部、３・・・第２記憶部、４・・・ポインタテーブル、５・・・Ｊａｖａ（登録商標）アプリケーション、６・・・クラスライブラリ、７・・・ＶＭプログラム。
【図１】
2006048237.tif 000003
【図２】
2006048237.tif 000004
【図３】
2006048237.tif 000005
【図４】
2006048237.tif 000006
【図５】
2006048237.tif 000007
【図６】
2006048237.tif 000008
【図７】
2006048237.tif 000009
【図８】
2006048237.tif 000010
【図９】
2006048237.tif 000011
【図１０】
2006048237.tif 000012