(57)【要約】      （修正有）【課題】メモリ使用効率の向上を図る。【解決手段】プロセッサ２００が、データのサイズごとにプログラムによって複数の分割領域へ格納されたデータの格納回数と、分割領域のサイズと、により、複数の分割領域における未使用領域の容量を算出し、メモリ１０１の容量と、分割領域のサイズを採用した場合のヒープ領域１０３の容量と、により、プログラムの台数Ｎを算出し、台数Ｎとフットプリントとにより、台数Ｎ分のフットプリントの占有容量を算出し、未使用領域の容量と占有容量との第１の総和を算出し、第１の総和との比較対象となる第２の総和とを比較して、小さい方の総和を第２の総和に設定し、前記プログラムを、第２の総和についての台数Ｎ分起動し、分割領域のサイズを、第２の総和についての分割領域のサイズに設定して、ヒープ領域１０３を構築する。【選択図】図２
2015072601.tif 000002
【特許請求の範囲】
【請求項１】
プログラムおよび当該プログラムを起動するＪａｖａプログラムを実行するプロセッサと、前記プログラムおよび前記Ｊａｖａプログラムを格納するメモリと、を備える計算機を、１台以上有する計算機システムであって、
前記プロセッサは、
前記プログラムにより、前記メモリ上のデータを格納するヒープ領域について前記Ｊａｖａプログラムにより境界設定された結果得られる同一サイズとなる複数の領域に、送信元からのデータのサイズごとに前記データが格納された格納回数と、前記Ｊａｖａプログラムにより境界設定された前記領域のサイズと、に基づいて、前記複数の領域における未使用領域の容量を算出する第１の算出手順と、
前記プログラムにより、前記メモリの容量と、前記領域のサイズを採用した場合の前記ヒープ領域の容量と、に基づいて、前記領域のサイズを採用した場合の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの稼働台数を算出する第２の算出手順と、
前記プログラムにより、前記第２の算出手順によって算出された稼働台数と、前記プログラムおよび前記Ｊａｖａプログラムの組み合わせが前記ヒープ領域を除いて前記メモリを占有する占有容量と、に基づいて、前記稼働台数分の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの占有容量を算出する第３の算出手順と、
前記プログラムにより、前記第１の算出手順によって算出された前記未使用領域の容量と、前記第３の算出手順によって算出された前記稼働台数分の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの占有容量と、の第１の総和を算出する第４の算出手順と、
前記プログラムにより、前記第４の算出手順によって算出された第１の総和と、前記第１の総和との比較対象となる第２の総和とを比較して、小さい方の総和を前記第２の総和に決定する決定手順と、
前記プログラムにより、前記送信元について、前記決定手順によって決定された第２の総和の算出元として採用された前記領域のサイズを、前記Ｊａｖａプログラムにより前記ヒープ領域に境界設定される前記複数の領域の各々のサイズに設定する設定手順と、
を実行することを特徴とする計算機システム。
【請求項２】
前記プロセッサは、
前記プログラムにより、前記格納回数を計数する計数手順を実行し、
前記第１の算出手順では、前記計数手順によって計数された計数結果と、前記領域のサイズと、に基づいて、前記複数の領域における未使用領域の容量を算出することを特徴とする請求項１に記載の計算機システム。
【請求項３】
前記決定手順では、前記領域のサイズを採用した場合の前記ヒープ領域の容量が前記メモリの容量を超えるまで前記領域のサイズを増加させて、前記第１の総和と前記第２の総和との比較をおこなうことを特徴とする請求項１に記載の計算機システム。
【請求項４】
前記プロセッサは、
前記決定手順によって決定された前記第２の総和の算出元となる前記稼働台数分前記Ｊａｖａプログラムを起動するとともに、起動された前記Ｊａｖａプログラムごとに前記プログラムを起動する起動手順を実行することを特徴とする請求項１に記載の計算機システム。
【請求項５】
前記プロセッサは、
前記起動手順によって前記プログラムが起動された場合、前記設定手順によって設定されたサイズで前記Ｊａｖａプログラムにより境界設定された前記領域のサイズを採用することにより、前記第１の算出手順〜前記第４の算出手順および前記設定手順を実行することを特徴とする請求項４に記載の計算機システム。
【請求項６】
前記計算機システムの中の第１の計算機は、
前記計算機システムの中の第２の計算機が当該第２の計算機内の前記ヒープ領域に格納するデータの複製データを保持しており、
前記第２の計算機が再起動された場合、前記複製データを前記第２の計算機に送信し、
前記第２の計算機は、
前記第１の計算機から送信されてきた前記複製データを受信して、前記ヒープ領域の再起動後における前記複数の領域に前記複製データを格納することを特徴とする請求項１に記載の計算機システム。
【請求項７】
プログラムおよび当該プログラムを起動するＪａｖａプログラムを実行するプロセッサと、前記プログラムおよび前記Ｊａｖａプログラムを格納するメモリと、を備える計算機を、１台以上有する計算機システムにおける制御方法であって、
前記プロセッサは、
前記プログラムにより、前記メモリ上のデータを格納するヒープ領域について前記Ｊａｖａプログラムにより境界設定された結果得られる同一サイズとなる複数の領域に、送信元からのデータのサイズごとに前記データが格納された格納回数と、前記Ｊａｖａプログラムにより境界設定された前記領域のサイズと、に基づいて、前記複数の領域における未使用領域の容量を算出する第１の算出手順と、
前記プログラムにより、前記メモリの容量と、前記領域のサイズを採用した場合の前記ヒープ領域の容量と、に基づいて、前記領域のサイズを採用した場合の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの稼働台数を算出する第２の算出手順と、
前記プログラムにより、前記第２の算出手順によって算出された稼働台数と、前記プログラムおよび前記Ｊａｖａプログラムの組み合わせが前記ヒープ領域を除いて前記メモリを占有する占有容量と、に基づいて、前記稼働台数分の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの占有容量を算出する第３の算出手順と、
前記プログラムにより、前記第１の算出手順によって算出された前記未使用領域の容量と、前記第３の算出手順によって算出された前記稼働台数分の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの占有容量と、の第１の総和を算出する第４の算出手順と、
前記プログラムにより、前記第４の算出手順によって算出された第１の総和と、前記第１の総和との比較対象となる第２の総和とを比較して、小さい方の総和を前記第２の総和に決定する決定手順と、
前記プログラムにより、前記送信元について、前記決定手順によって決定された第２の総和の算出元として採用された前記領域のサイズを、前記Ｊａｖａプログラムにより前記ヒープ領域に境界設定される前記複数の領域の各々のサイズに設定する設定手順と、
を実行することを特徴とする制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機システムおよび制御方法に関する。
【背景技術】
【０００２】
近年の計算機システムでは、プログラムを含む大規模なデータの取り扱いを可能にするために、６４ｂｉｔのメモリアドレス空間を用いることが主流となっている。Ｋｅｙ−Ｖａｌｕｅ  Ｓｔｏｒｅ（以下、「ＫＶＳ」）はそのようなプログラムの代表例の１つである。メモリアドレス空間を従来の３２ｂｉｔから６４ｂｉｔへ拡張することにより、プログラムが参照可能なメモリ空間は、最大４ＧＢ（ＧｉｇａＢｙｔｅ＝１０の９乗バイト）から最大１６ＥＢ（ＥｘａＢｙｔｅ＝１０の１８乗バイト）へ増大する。
【０００３】
しかし、６４ｂｉｔのアドレス空間を用いる場合、メモリアドレスを指定するためのポインタの大きさは６４ｂｉｔとなり、３２ｂｉｔの場合の倍の大きさとなる。このことは、同一のデータ構造を扱うプログラムの場合、３２ｂｉｔの場合と比較して、６４ｂｉｔでは使用するメモリ量が増大することを意味する。特に、Ｊａｖａ（登録商標）を初めとするオブジェクト指向プログラムでは、オブジェクトと呼ばれるデータ構造の中にポインタが頻繁に出現する。このためポインタ拡大の影響が特に大きく、メモリが有限であることから、ポインタを含むデータ構造の一部を格納しきれない事態が生じる。
【０００４】
また、ポインタが拡大することによる他の問題として、マイクロプロセッサ内のキャッシュの利用効率が低下することも挙げられる。これは、データ量が増加することで、キャッシュに格納可能なデータの個数が減少するためである。キャッシュの利用効率が低下した場合、低速な主記憶メモリへのアクセスが増加し、プログラムの実行速度が低下する事態が生じる。
【０００５】
以上の問題を解決する手法として、Ｊａｖａ言語を用いたプログラムにおいて、ヒープメモリのアドレスの最大長を３２ｂｉｔで表現可能な最大値である４ＧＢに制限することにより、Ｊａｖａのヒープメモリ内に確保されるオブジェクトを対象として、オブジェクト内のポインタ表現を圧縮する手法が提案されている(非特許文献１を参照。)。
【０００６】
ポインタを６４ｂｉｔから３２ｂｉｔに圧縮することにより、ポインタを含むデータ構造のメモリ使用量を削減することができる。このことはまた、前述のように、キャッシュヒット率の向上にも繋がる。非特許文献１で提案されている手法では、Ｊａｖａヒープメモリ内に確保されたオブジェクトを指定するポインタを、ヒープメモリの先頭を表すベースアドレスと、ベースアドレスからのオフセット値として表現する。
【０００７】
さらに、ヒープ領域を１バイト単位で境界設定するのではなく、所定の２バイト以上の大きさの単位で境界設定することにより、４ＧＢを超えるヒープ領域を管理対象とすることができる。この境界により分割された各領域（以下、分割領域）のサイズを例えば８バイトとした場合、３２ｂｉｔの値で３２ＧＢ（８バイト×２の３２乗）のメモリ領域を管理対象にできる。また、非特許文献１では、分割領域のサイズが２のべき乗の大きさとなるように境界設定することで、ポインタの圧縮・非圧縮操作が効率的に行えることが示されている。
【先行技術文献】
【非特許文献】
【０００８】
【非特許文献１】A. Adl-Tabatabai, J. Bharadwaj, M. Cierniak, M. Eng, J. Fang, B. Lewis, B. Murphy, and J. Stichnoth, Improving 64-Bit Java IPF Performance by Compressing Heap References, In Proceedings of the International Symposium on Code Generation and Optimization, 2004.
【発明の概要】
【発明が解決しようとする課題】
【０００９】
従来のポインタ圧縮手法では、分割領域のサイズの決定にトレードオフがあり、不適切な分割領域のサイズの下ではメモリ使用効率が低下する恐れがある。以下で、分割領域のサイズが過大な場合の問題、および過小な場合の問題を、それぞれ述べる。
【００１０】
分割領域のサイズが過大な場合、各分割領域内の未使用領域が増加することで、メモリ使用効率が低下する恐れがある。例えば、分割領域のサイズが１バイトの場合、ある分割領域に１バイトの大きさのオブジェクトを格納すると、その分割領域における未使用領域の大きさは０バイトである。一方、分割領域のサイズが３２バイトの場合、同様に１バイトの大きさのオブジェクトを格納すると、その分割領域における未使用領域の大きさは３１バイトになる。
【００１１】
一方、分割領域のサイズが過小な場合、管理可能なメモリ量が小さくなることで、メモリ使用効率が低下する恐れがある。例えば、１００ＧＢのメモリが搭載されている計算機上において、分割領域のサイズを１バイトとした場合、ヒープ領域のメモリ量は４ＧＢ（＝１バイト×２の３２乗）となるため、９６ＧＢのメモリが利用できず無駄になる。一方、分割領域のサイズを３２バイトとした場合、ヒープ領域のメモリ量は１２８ＧＢ（＝３２バイト×２の３２乗）であるため、１００ＧＢのメモリ全てを利用可能である。
【００１２】
上記の分割領域のサイズが過小な場合の問題に対して、複数のプログラムからなるクラスタ構成で動作するプログラムの場合、プログラムの稼働台数の増加で対処することが考えられる。このようなプログラムの例としては、上述したＫＶＳが挙げられる。しかし、一般的に、稼動するプログラムは、１台に付き所定の量のメモリ（以下、フットプリント）を占有する。このため、稼動台数の増加は、フットプリントとして消費されるメモリ量の増加をもたらし、それによるメモリ使用効率の低下が生じる恐れがある。
【００１３】
本発明は、上記の課題に鑑みてなされたものであり、メモリ使用効率の向上を図ることを目的とする。
【課題を解決するための手段】
【００１４】
本願において開示される発明の一側面となる計算機システムおよび制御方法は、プログラムおよび当該プログラムを起動するＪａｖａプログラムを実行するプロセッサと、前記プログラムおよび前記Ｊａｖａプログラムを格納するメモリと、を備える計算機を、１台以上有する計算機システムおよびその制御方法であって、前記プロセッサは、前記プログラムにより、前記メモリ上のデータを格納するヒープ領域について前記Ｊａｖａプログラムにより境界設定された結果得られる同一サイズとなる複数の領域に、送信元からのデータのサイズごとに前記データが格納された格納回数と、前記Ｊａｖａプログラムにより境界設定された前記領域のサイズと、に基づいて、前記複数の領域における未使用領域の容量を算出する第１の算出手順と、前記プログラムにより、前記メモリの容量と、前記領域のサイズを採用した場合の前記ヒープ領域の容量と、に基づいて、前記領域のサイズを採用した場合の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの稼働台数を算出する第２の算出手順と、前記プログラムにより、前記第２の算出手順によって算出された稼働台数と、前記プログラムおよび前記Ｊａｖａプログラムの組み合わせが前記ヒープ領域を除いて前記メモリを占有する占有容量と、に基づいて、前記稼働台数分の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの占有容量を算出する第３の算出手順と、前記プログラムにより、前記第１の算出手順によって算出された前記未使用領域の容量と、前記第３の算出手順によって算出された前記稼働台数分の前記プログラムおよび前記Ｊａｖａプログラムの組み合わせの占有容量と、の第１の総和を算出する第４の算出手順と、前記プログラムにより、前記第４の算出手順によって算出された第１の総和と、前記第１の総和との比較対象となる第２の総和とを比較して、小さい方の総和を前記第２の総和に決定する決定手順と、前記プログラムにより、前記送信元について、前記決定手順によって決定された第２の総和の算出元として採用された前記領域のサイズを、前記Ｊａｖａプログラムにより前記ヒープ領域に境界設定される前記複数の領域の各々のサイズに設定する設定手順と、を実行することを特徴とする。
【発明の効果】
【００１５】
本発明の代表的な実施の形態によれば、メモリ使用効率の向上を図ることができる。前述した以外の課題、構成及び効果は、以下の実施例の説明により明らかにされる。
【図面の簡単な説明】
【００１６】
【図１】分割領域のサイズとプログラム稼働台数の最適化を示す説明図である。
【図２】実施例１にかかる計算機のブロック図である。
【図３】ヒープ領域の内部を示す説明図である。
【図４】オブジェクト情報管理テーブルの構成とデータ例を示す説明図である。
【図５】構成情報管理テーブルの構成とデータ例を示す説明図である。
【図６】分割領域のサイズおよび台数情報管理テーブルの構成とデータ例を示す説明図である。
【図７】計算機によるオブジェクト情報の記録処理手順を示すフローチャートである。
【図８】分割領域のサイズ及び台数算出処理部による分割領域のサイズ及び台数の算出処理の詳細な処理手順例を示すフローチャートである。
【図９】図８に示した未使用領域の推定容量およびフットプリントの推定容量を示す説明図である。
【図１０】ＪａｖａＶＭの起動処理の詳細な処理手順例を示すフローチャートである。
【図１１】実施例２にかかる計算機システムの構成例を示す説明図である。
【図１２】実施例２にかかる計算機のブロック図である。
【図１３】ノード管理テーブルの構成とデータ例を示す説明図である。
【図１４】実施例２にかかる分割領域のサイズ及び台数算出処理部の詳細な処理手順例を示すフローチャートである。
【図１５】実施例２にかかる再起動処理の詳細な処理手順例を示すフローチャートである。
【発明を実施するための形態】
【００１７】
（実施例１）
＜分割領域のサイズとプログラム稼働台数の最適化＞
図１は、分割領域のサイズとプログラム稼働台数の最適化を示す説明図である。（Ａ）メモリ１０１は、ヒープ領域１０３を構成する複数の分割領域１０２によりオブジェクトを格納する。ここで、メモリ１０１のサイズは、例として１００ＧＢとする。分割領域１０２のサイズを１バイトとした場合、管理可能なメモリ量であるヒープ領域１０３のメモリ量は、４ＧＢ（＝１バイト×２の３２乗）となる。したがって、９６ＧＢの未使用領域が発生し、メモリ１０１の使用効率が悪化する。
【００１８】
（Ｂ）これに対し、分割領域１０２のサイズを拡張することにより、メモリ１０１の未使用領域を縮小することができる。たとえば、分割領域１０２のサイズを３２バイトとした場合、管理可能なヒープ領域１０３のメモリ量は１２８ＧＢ（＝３２バイト×２の３２乗）となるため、１００ＧＢのメモリ全てを利用可能である。ただし、分割領域１０２のサイズが大きくなったことにより、たとえば、３２バイトの分割領域１０２のサイズの分割領域１０２に１バイトのオブジェクト１０４が格納された場合、３１バイトの未使用領域が発生する。
【００１９】
（Ｃ）このように、分割領域１０２のサイズが過小になると未使用領域が拡大するため、計算機上で動作するプログラムの稼働台数を増加することで未使用領域の縮小を図る。しかし、一般的に、稼動するプログラムは、１台に付き所定の量のフットプリント１０５を占有するため、稼動台数の増加は、フットプリント１０５として消費されるメモリ量の増加をもたらし、それによるメモリ１０１の使用効率の低下が生じる恐れがある。
【００２０】
（Ｄ）実施例１では、計算機は、オブジェクトサイズとその格納回数（確保数ともいう）を集計しておき、集計したオブジェクトサイズとその格納回数から分割領域１０２における未使用領域を推定する。同様に、計算機は、起動するプログラムのフットプリント１０５を推定する。そして、計算機は、この推定未使用領域と推定フットプリント１０５の総和が最小となるように、分割領域１０２のサイズとプログラムの稼働台数を決定することにより、メモリ１０１の使用効率の向上を図る。
【００２１】
＜計算機の構成例＞
図２は、実施例１にかかる計算機のブロック図である。ここでは、ＪａｖａＶＭおよびＫＶＳを使用する場合を例にあげて説明する。計算機１００は、プロセッサ２００、記憶部２０１、メモリ１０１を備える。プロセッサ２００は、メモリ１０１上の記憶領域にオペレーティングシステム２０２、起動処理プログラム２０３を展開して実行する。記憶部２０１は、たとえば、ＨＤＤなどの二次記憶装置であり、ＫＶＳ実行ファイル２２１と、分割領域１０２のサイズおよび台数情報管理テーブル２１２と、を格納する。
【００２２】
以下では、記載の便宜上、オペレーティングシステム２０２、起動処理プログラム２０３、ＪａｖａＶＭ２０４、ＫＶＳ２０５などの各プログラムを動作主体として説明する場合があるが、実際にこれらのプログラムを実行するのはプロセッサ２００などの演算装置であることを付言しておく。
【００２３】
起動処理プログラム２０３は、オペレーティングシステム２０２からプロセッサ２００およびメモリ１０１の割当てを受けることで実行を開始する。起動処理プログラム２０３は、ＪａｖａＶＭ２０４をメモリ１０１上に展開し、実行を開始させる。
【００２４】
ＪａｖａＶＭ２０４は、ヒープ領域１０３、ポインタ圧縮及び非圧縮処理部２４１、参照ルート２４２、Ｊａｖａプログラム実行部２４３を備える。ＪａｖａＶＭ２０４は、オペレーティングシステム２０２からプロセッサ２００およびメモリ１０１の割当てを受けることで実行を開始する。
【００２５】
Ｊａｖａプログラム実行部２４３は、記憶部２０１からＫＶＳ実行ファイル２２１を読み込み、メモリ１０１上の記憶領域にＫＶＳ２０５として展開する。ＫＶＳ２０５は、オブジェクト情報管理テーブル２５１、算出処理部２５２、通信処理部２５３、構成情報管理テーブル２５４を備える。ＪａｖａＶＭ２０４は、Ｊａｖａプログラム実行部２４３を用いて、ＫＶＳ２０５を実行する。
【００２６】
ＫＶＳ２０５は、通信処理部２５３を用いて、ＫＶＳ２０５を利用するアプリケーションからの要求を受信する。受信する要求には、オブジェクトの書き込み要求、および、オブジェクトの読み取り要求がある。なお、受信する要求の種別は上記のみに限定されるものではない。
【００２７】
たとえば、受信した要求がオブジェクト１０４の書き込み要求であった場合、ＫＶＳ２０５は、新たなオブジェクト１０４の確保を行い、受信したデータを当該オブジェクト１０４内に記録する。上記のオブジェクト確保処理は、Ｊａｖａプログラム実行部２４３によって実行され、ヒープ領域１０３内のいずれかの分割領域１０２の先頭にオブジェクト１０４が確保される。
【００２８】
また、受信した要求がオブジェクト１０４の読み取り要求であった場合、ＫＶＳ２０５は、対象のオブジェクト１０４をヒープ領域１０３から読み取り、当該オブジェクト１０４のデータを、通信処理部２５３を用いて、ＫＶＳ２０５を利用するアプリケーションに送信する。
【００２９】
Ｊａｖａプログラム実行部２４３は、以上の処理を実現するため、ヒープ領域１０３内のオブジェクト１０４を参照するポインタを参照ルート２４２に格納し、当該オブジェクト１０４を操作する。この処理において、参照ルート２４２に格納されているポインタは、ポインタ圧縮及び非圧縮処理部２４１によって圧縮された形に変換された後、ヒープ領域１０３に記録される。また逆に、ヒープ領域１０３内の圧縮されたポインタは、ポインタ圧縮及び非圧縮処理部２４１によって非圧縮された形に変換された後、参照ルート２４２に格納される。
【００３０】
オブジェクト情報管理テーブル２５１は、ＫＶＳ２０５がヒープ領域１０３内に確保したオブジェクト１０４の情報を保持するデータテーブルである。オブジェクト情報管理テーブル２５１の詳細については、図４で後述する。構成情報管理テーブル２５４は、計算機１００の構成に関する情報を保持するデータテーブルである。構成情報管理テーブル２５４の詳細については、図５で後述する。
【００３１】
算出処理部２５２は、オブジェクト情報管理テーブル２５１の情報に基づき、メモリ使用効率が向上する分割領域１０２のサイズを算出するとともに、プログラム台数を算出する。ここで、プログラム台数とは、図１に示したフットプリント１０５としてメモリ１０１を消費するプログラムの稼働台数である。プログラムは、図２でいうＪａｖａＶＭ２０４およびＫＶＳ２０５の組である。したがって、図２の例では、稼働台数は「１」である。後述する実施例２の図１２では、ＪａｖａＶＭ２０４およびＫＶＳ２０５の組は２組存在するため、稼働台数は「２」となる。
【００３２】
算出処理部２５２は、外部の管理者から指示された契機で算出処理を行い、記憶部２０１内の分割領域のサイズおよび台数情報管理テーブル２１２に算出結果を記録する。なお、算出処理部２５２が呼び出される契機はこれに限定されるものではない。
【００３３】
分割領域のサイズおよび台数情報管理テーブル２１２は、算出処理部２５２が算出した情報を保持するデータテーブルである。分割領域のサイズおよび台数情報管理テーブル２１２の詳細については、図６で後述する。
【００３４】
＜ヒープ領域の内部構造例＞
図３は、ヒープ領域１０３の内部を示す説明図である。ヒープ領域１０３は、ＪａｖａＶＭ２０４の起動時に、２のべき乗単位で境界設定される。これにより、ヒープ領域１０３は、複数の分割領域１０２に分割される。全ての分割領域１０２のサイズは同一である。なお、分割領域１０２のサイズは、２のべき乗としたが、これに限定されるものではない。
【００３５】
ヒープ領域１０３は、変数ｂａｓｅによって指定されたベースアドレスから始まり、連続するアドレスを有する。ベースアドレスは固定である。オブジェクト１０４は、ヒープ領域１０３中のいずれかの分割領域１０２の先頭に配置される。なお、各分割領域１０２中において、オブジェクト１０４の大きさを越えた範囲は未使用領域となる。未使用領域は使用されない。ヒープ領域１０３のアドレスの最大長を２の３２乗と分割領域１０２のサイズとの積に制限し、ヒープ領域１０３内のオブジェクト１０４を指定するポインタを、ベースアドレスからのそのオブジェクト１０４の先頭までの分割領域数によって指定すれば、ポインタを３２ｂｉｔへ圧縮した形式で表現することができる。
【００３６】
＜管理テーブルの具体例＞
図４は、オブジェクト情報管理テーブル２５１の構成とデータ例を示す説明図である。（Ａ）オブジェクト情報管理テーブル２５１は、オブジェクトサイズフィールド４０１、確保数フィールド４０２を有する。オブジェクトサイズフィールド４０１は、該当行が管理対象とするオブジェクト１０４の大きさの範囲を保持する。確保数フィールド４０２は、管理対象の大きさを持つオブジェクト１０４が分割領域に確保された回数を保持する。確保された回数とは、分割領域１０２に書き込まれた回数である。
【００３７】
（Ｂ）において、ヒープ領域１０３内に確保されたオブジェクト１０４は、サイズ１のオブジェクト１０４が１個、サイズ２のオブジェクト１０４が２個、サイズ３のオブジェクト１０４が１個、サイズ４のオブジェクト１０４が１個、サイズ６のオブジェクト１０４が１個である。なお、サイズの単位は、バイトとする。この場合、オブジェクト情報管理テーブル２５１中では、オブジェクトサイズフィールド４０１の値が「１」の行において、確保数フィールド４０２の値は「１」である。また、オブジェクトサイズフィールド４０１の値が「２〜３」の行において、確保数フィールド４０２の値は「３」である。またオブジェクトサイズフィールド４０１の値が「４〜７」の行において、確保数フィールド４０２の値は「２」である。なお、オブジェクトサイズフィールド４０１が示す値の範囲は、２のべき乗の数を区切りとする範囲に限定されるものではない。
【００３８】
なお、図４の確保数フィールド４０２の値は、実測値でもよく、計算で得られた理論値でもよく、ユーザによって設定された値でもよい。
【００３９】
図５は、構成情報管理テーブル２５４の構成とデータ例を示す説明図である。構成情報管理テーブル２５４は、種別フィールド５０１、値フィールド５０２を有する。種別フィールド５０１は、設定される制御情報の種別を保持する。値フィールド５０２は、その制御情報値を保持する。
【００４０】
ここでは、構成情報管理テーブル２５４が保持するデータは、メモリ容量情報、フットプリント情報、およびアプリケーション情報である。メモリ容量情報は、メモリ１０１の容量を保持する。フットプリント情報は、メモリ１０１中において、ＪａｖａＶＭ２０４およびＫＶＳ２０５が占める容量から、ヒープ領域１０３の容量を引いた値をフットプリント１０５の値である。アプリケーション情報は、ＫＶＳ２０５が通信処理部２５３を用いてＫＶＳ２０５を利用する通信先アプリケーションの識別情報（たとえば、名称）である。
【００４１】
構成情報管理テーブル２５４中の値は、ＫＶＳ２０５の起動時パラメータで指定される。なお、構成情報管理テーブル２５４中の値の指定方法はこれに限定されるものではなく、Ｊａｖａプログラム用ＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）や外部ファイル等によって指定されることとしてもよい。あるいは、構成情報管理テーブル２５４中の値は、ＫＶＳ２０５が実行時に測定した値を設定してもよい。また、アプリケーション情報の値は、通信先アプリケーションの名称に限定されるものではなく、通信先アプリケーションに対する一意な識別子などでもよい。こういった識別子の例としては、アプリケーションの実行ファイルのハッシュ値等がある。
【００４２】
図６は、分割領域のサイズおよび台数情報管理テーブル２１２の構成とデータ例を示す説明図である。分割領域のサイズおよび台数情報管理テーブル２１２は、アプリケーションフィールド６０１、分割領域のサイズフィールド６０２、台数フィールド６０３を有する。アプリケーションフィールド６０１は、該当行に対応する通信先アプリケーションの名称を保持する。分割領域のサイズフィールド６０２は、当該行に対応するアプリケーションに関する分割領域１０２のサイズを保持する。台数フィールド６０３は、当該行に対応するアプリケーションに関する台数を保持する。
【００４３】
たとえば、１行目のエントリは、業務アプリＡが計算機を用いる場合、分割領域１０２のサイズは８バイトで、ＪａｖａＶＭ２０４とＫＶＳ２０５の組数である台数が２台であることを示す。なお、アプリケーションフィールド６０１の値は、通信先アプリケーションの名称に限定されるものではなく、構成情報管理テーブル２５４中のアプリケーション情報と整合する値であればよい。
【００４４】
以上で、本実施例に係る計算機１００の構成を説明した。なお、メモリ１０１上に存在するＪａｖａＶＭ２０４とＫＶＳ２０５の組は、１組に限定されるものではなく、２組以上存在しても良い。また、計算機１００の台数は、１台に限定されるものではなく、２台以上存在しても良い。
【００４５】
＜計算機１００による計算処理手順例＞
次に、計算機１００によるオブジェクト情報の記録処理、分割領域１０２のサイズ及び台数の算出処理、およびＪａｖａＶＭ２０４の起動処理についてフローチャートを用いて詳細に説明する。
【００４６】
図７は、計算機１００によるオブジェクト情報の記録処理手順を示すフローチャートである。図７のフローチャートでは、ＫＶＳ２０５が、オブジェクト情報管理テーブル２５１に確保数を記録する。以下、図７の各ステップについて説明する。
【００４７】
まず、ＫＶＳ２０５は、通信処理部２５３を介してオブジェクト１０４の書き込み要求を受信した時点などの所定タイミングで、本処理フローを開始する（ステップＳ７００）。そして、ＫＶＳ２０５は、書き込み対象のオブジェクト１０４の大きさを変数Ｓに代入する（ステップＳ７０１）。
【００４８】
つぎに、ＫＶＳ２０５は、オブジェクト情報管理テーブル２５１の中で、オブジェクトサイズフィールド４０１の範囲に変数Ｓが含まれる行を変数Ｌに代入する（ステップＳ７０２）。そして、ＫＶＳ２０５は、変数Ｌ内の確保数フィールド４０２の値を１だけ増加させる（ステップＳ７０３）。その後、ＫＶＳ２０５は、本処理フローを終了する。
【００４９】
たとえば、オブジェクトサイズ３のオブジェクト１０４をある分割領域１０２に書き込む場合、ＫＶＳ２０５は、ステップＳ７０１で変数Ｓに「３」を代入し、ステップＳ７０２で変数Ｓ（＝３）を含む行「２〜３」を変数Ｌに代入し、ステップＳ７０３でオブジェクトサイズの範囲が「２〜３」である行の確保数「２」をインクリメントして「３」にする。
【００５０】
図８は、算出処理部２５２による分割領域１０２のサイズ及び台数の算出処理の詳細な処理手順例を示すフローチャートである。図８のフローチャートでは、算出処理部２５２が、オブジェクト情報管理テーブル２５１の情報に基づいて、分割領域群の未使用領域およびフットプリントの総和が最小になるような分割領域１０２のサイズ及び台数を算出する。以下、図８の各ステップについて説明する。
【００５１】
算出処理部２５２は、外部の管理者から指示された時点、などの所定タイミングで、本処理フローを開始する（ステップＳ８００）。
【００５２】
算出処理部２５２は、変数ＲＣおよび変数ＲＮの初期値を０に設定する。また、変数ｍｉｎＯの値を∞に設定する。また、変数Ｃの初期値を１に設定する。また、変数Ｔの値を、構成情報管理テーブル２５４中のメモリ容量情報の値に設定する。また、変数Ｆの値を、構成情報管理テーブル２５４中のフットプリント情報の値に設定する。また、変数Ａの値を、構成情報管理テーブル２５４中のアプリケーション情報の値に設定する（ステップＳ８０１）。
【００５３】
変数ＲＣは、分割領域１０２のサイズの暫定値であり、変数ＲＣの最終的な値が分割領域１０２のサイズとして図６の分割領域１０２のサイズおよび台数情報管理テーブル２１２に書き込まれる。変数ＲＮは、プログラムの稼働台数の暫定値であり、変数ＲＣの最終的な値が台数として図６の分割領域１０２のサイズおよび台数情報管理テーブル２１２に書き込まれる。
【００５４】
変数ｍｉｎＯは、後述する変数Ｏ１と変数Ｏ２の総和の暫定的な最小値である。なお、変数Ｏ１は、分割領域１０２のサイズがＣであるときの分割領域１０２における未使用領域の推定容量であり、変数Ｏ２は、分割領域１０２のサイズがＣであるときのフットプリントの推定容量である。変数Ｃは、処理対象となる分割領域１０２のサイズの値であり、初期値１からインクリメントされる。
【００５５】
つぎに、算出処理部２５２は、変数Ｃの値に２32を乗じた値と変数Ｔの値とを比較する（ステップＳ８０２）。変数Ｃの値に２32を乗じた値は、分割領域１０２のサイズがＣであるときのヒープ領域１０３の容量である。すなわち、ステップＳ８０２では、ヒープ領域１０３がメモリ１０１の容量を超えるか否かを判断する。
【００５６】
変数Ｃの値に２32を乗じた値が変数Ｔの値以上であれば（ステップＳ８０２：Ｙｅｓ）、ステップＳ８０９に進む。逆に、変数Ｃの値に２32を乗じた値が変数Ｔの値未満であれば（ステップＳ８０２：Ｎｏ）、ステップＳ８０３に進む。
【００５７】
算出処理部２５２は、オブジェクト情報管理テーブル２５１中の各行に対して、以下で示す式（１）の値を計算し、その総和を変数Ｏ１に設定する（ステップＳ８０３）。
【００５８】
当該行の確保数フィールドの値×Ｍ・・・（１）
ただし、式（１）中のＭは、または、変数Ｃから当該行のオブジェクトサイズフィールド４０１が示す範囲の平均値の値を引いた値である。式（１）に示す変数Ｏ１は、未使用領域の推定容量である。変数Ｃは増加変数であるため、変数Ｃの値が大きくなるほど、未使用領域の推定容量は小さくなる。
【００５９】
算出処理部２５２が変数Ｏ１に設定する値は、上記の式（１）に限定されるものではない。例えば、確保数フィールド４０２の値の代わりに、「ヒープ領域１０３に存在するオブジェクト１０４の中で、当該行のオブジェクトサイズフィールド４０１が示す範囲の大きさを持つオブジェクト１０４の個数」を用いることにしても良い。また、「当該行のオブジェクトサイズフィールド４０１が示す範囲の平均値」を用いる代わりに、「所定の重みを付けた上での平均値」を用いてもよい。
【００６０】
つぎに、算出処理部２５２は、以下で示す式（２）の値を変数Ｎに設定する（ステップＳ８０４）。
【００６１】
Ｔ／（Ｃ×２32）・・・（２）
【００６２】
変数Ｎは、分割領域１０２のサイズがＣであるときのプログラム（ＪａｖａＶＭ２０４およびＫＶＳ２０５の組）の稼働台数の推定値（Ｎ≧１）である。なお、分母の「Ｃ×２32」はプログラムの１台あたりのヒープ領域の容量である。変数Ｎの値については、小数点以下は、切り捨てまたは四捨五入してもよい。
【００６３】
そして、算出処理部２５２は、以下で示す式（３）の値を変数Ｏ２に設定する（ステップＳ８０５）。式（３）により、稼働台数分のフットプリント１０５の推定量が算出される。
【００６４】
Ｆ×Ｎ・・・（３）
【００６５】
なお、算出処理部２５２が変数Ｏ２に設定する値は、上記の式（３）に限定されるものではない。例えば、オペレーティングシステム２０２の機能によって、複数のＪａｖａＶＭ２０４およびＫＶＳ２０５のフットプリント１０５が共有化される場合、その分の値を差し引いて良い。
【００６６】
このあと、算出処理部２５２は、以下で示す不等式（４）が成立するか否かを判断する（ステップＳ８０６）。
【００６７】
Ｏ１＋Ｏ２＜ｍｉｎＯ・・・（４）
【００６８】
成立する場合（ステップＳ８０６：Ｙｅｓ）、算出処理部２５２は、変数ＲＣに変数Ｃの値を設定し、かつ変数ＲＮに変数Ｎの値を設定し、かつ変数ｍｉｎＯに変数Ｏ１の値と変数Ｏ２の値の和を設定した後に、ステップＳ８０８に移行する。一方、成立しない場合（ステップＳ８０６：Ｎｏ）、算出処理部２５２は、ステップＳ８０７は実行せずにステップＳ８０８に移行する。
【００６９】
式（４）は、未使用領域の推定容量およびフットプリント１０５の推定容量の総和であり、無駄になるメモリ量の推定容量を示す。なお、算出処理部２５２がステップＳ８０７に進むかどうかを判定する条件は、上記の式（４）に限定されるものではない。例えば、前述のキャッシュヒット率向上に基づく性能向上を重視する場合、台数の増加はＫＶＳ２０５間での通信処理を増加させ、性能低下を招く恐れがある。この場合、式（４）の左辺に対し、変数Ｎの値に所定の数値を掛けたものを加えてもよい。
【００７０】
また、ステップＳ８０８では、算出処理部２５２は、変数Ｃの値をインクリメントして（ステップＳ８０８）、ステップＳ８０２に戻る。
【００７１】
ステップＳ８０２において、変数Ｃの値に２32を乗じた値が変数Ｔの値以上になった場合（ステップＳ８０２：Ｙｅｓ）、算出処理部２５２は、分割領域のサイズおよび台数情報管理テーブル２１２に、新しい行を追加する（ステップＳ８０９）。具体的には、たとえば、算出処理部２５２は、当該行におけるアプリケーションフィールド６０１に、変数Ａの値を書き込む。また、算出処理部２５２は、当該行における分割領域のサイズフィールド６０２に、変数ＲＣの値を書き込む。また、算出処理部２５２は、当該行における台数フィールド６０３の値に、変数ＲＮの値を書き込む。
【００７２】
なお、分割領域のサイズおよび台数情報管理テーブル２１２中に、既にアプリケーションフィールド６０１の値が変数Ａの値である行が存在する場合は、新しい行を追加する代わりに、当該行の内容を上書きしてもよい。
【００７３】
図９は、図８に示した未使用領域の推定容量およびフットプリントの推定容量を示す説明図である。図９において、凡例で示したように、斜線で示した部分が非効率に使用される分割領域内の未使用領域およびフットプリントであり、当該量を最小化することでメモリ１０１の使用効率が向上する。
【００７４】
ヒープ領域１０３は、複数の分割領域１０２を有し、各分割領域１０２にはオブジェクト１０４が格納される。ここは、各分割領域１０２に格納されるオブジェクト１０４のサイズは、図４に示したオブジェクトサイズとする。オブジェクトサイズが複数のサイズにまたがる場合は、図８のステップＳ８０３で説明したように平均値が採用される。たとえば、オブジェクトサイズ２〜３バイトの行については、２．５バイトとなる。
【００７５】
また、メモリ１０１上には、１組以上のＪａｖａＶＭ２０４とＫＶＳ２０５の組が存在する。１組のＪａｖａＶＭ２０４とＫＶＳ２０５が１台のプログラムであり、そのメモリ量からヒープ領域を除いたメモリ量が、当該プログラムのフットプリント１０５となる。分割領域１０２のサイズが小さい場合、１台当たりの管理可能なヒープ領域１０３のメモリ量が小さくなるため、プログラムの必要な台数は多くなる。
【００７６】
この際、メモリ１０１上ではＪａｖａＶＭ２０４およびＫＶＳ２０５のためのメモリ量が台数分だけ必要となるため、分割領域１０２のサイズが小さいほどフットプリント１０５により使用されるメモリ量が増加する。したがって、分割領域１０２のメモリ量Ｏ１およびフットプリント１０５のメモリ量Ｏ２との和が、非効率に使用される無駄なメモリ量の合計値となる。このため、上述した図８のフローチャートで示した処理により、当該合計値が最小となるように、分割領域１０２のサイズとプログラム（ＪａｖａＶＭ２０４およびＫＶＳ２０５の組）の稼働台数を調整することにより、メモリ１０１の使用効率の向上を図ることができる。
【００７７】
図１０は、ＪａｖａＶＭ２０４の起動処理の詳細な処理手順例を示すフローチャートである。図１０のフローチャートでは、起動処理プログラム２０３が、分割領域１０２のサイズおよび台数情報管理テーブル２１２の情報に基づいて、ＪａｖａＶＭ２０４を起動する。以下、図９の各ステップについて説明する。
【００７８】
起動処理プログラム２０３は、外部の管理者から指示された時点、などの所定タイミングで、本処理フローを開始する（ステップＳ１０００）。まず、起動処理プログラム２０３は、分割領域のサイズおよび台数情報管理テーブル２１２内の行において、アプリケーションフィールド６０１の値が、起動処理プログラム２０３の起動時オプションで指定された通信先アプリケーション情報と比較して、等しい行を探す（ステップＳ１００１）。なお、通信先アプリケーション情報の指定方法は、起動処理プログラム２０３の起動時オプションに限定されるものではなく、外部ファイル等で指定してもよい。
【００７９】
つぎに、起動処理プログラム２０３は、ステップＳ３００の探索において条件を満たす行が見つかった場合（ステップＳ１００２：Ｙｅｓ）、ステップＳ１００３に進み、見つからなかった場合は（ステップＳ１００２：Ｎｏ）、ステップＳ１００５に進む。なお、起動処理プログラム２０３がステップＳ１００３に進む条件は、上記に限定されるものではない。例えば、上記の条件に加えて、管理者からの許可が下りた場合にのみステップＳ１００３に進むこととしてもよい。
【００８０】
起動処理プログラム２０３は、ステップＳ１００１の探索で見つかった行中の分割領域のサイズフィールド６０２の値を、変数Ｃに設定する。また、起動処理プログラム２０３は、ステップＳ３００の探索で見つかった行中の台数フィールド６０３の値を、変数Ｎに設定する（ステップＳ１００３）。
【００８１】
つぎに、起動処理プログラム２０３は、変数Ｎの値に等しい個数のＪａｖａＶＭ２０４を、メモリ１０１上に展開して実行を開始させる（ステップＳ１００４）。これにより、変数Ｎの値に等しい個数のＫＶＳ２０５が起動される。この際、起動処理プログラム２０３は、ＪａｖａＶＭ２０４の起動時オプションを介して、分割領域１０２のサイズとして変数Ｃの値を指定する。なお、分割領域１０２のサイズの指定方法はＪａｖａＶＭ２０４の起動時オプションに限定されるものではなく、起動処理プログラム２０３は、Ｊａｖａプログラム用ＡＰＩや外部ファイル等で分割領域１０２の大きさを指定してもよい。
【００８２】
また、ステップＳ１００２：Ｎｏの場合には、起動処理プログラム２０３は、１個のＪａｖａＶＭ２０４を、メモリ１０１上に展開して実行を開始させる。これにより、１個のＫＶＳ２０５が起動される。この際、起動処理プログラム２０３は、ＪａｖａＶＭ２０４の起動時オプションを介して、分割領域１０２のサイズとして１を指定する（ステップＳ１００５）。なお、起動するＪａｖａＶＭ２０４の台数および分割領域１０２のサイズは、１に限定されるものではなく、予め管理者によって指定された所定の値等を用いてもよい。
【００８３】
以上のようにして、本実施例１に係る計算機１００によれば、プログラムの稼働台数と分割領域のサイズとを調整することにより、メモリ１０１の使用効率を向上することができる。なお、本実施例１は、ハイパーバイザーと呼ばれるソフトウェアを用いて、一つの計算機システム上で複数の仮想的な計算機システムを動作させる環境においても、同様に利用可能である。
【００８４】
なお、複数のＫＶＳ２０５が起動された場合、図７の処理については、各ＫＶＳ２０５が実行して確保数の総和を求めることとしてもよい。また、図８の処理については、少なくともいずれか一つのＫＶＳ２０５の算出処理部２５２が実行することとしてもよい。
【００８５】
（実施例２）
つぎに、実施例２について説明する。実施例１では、算出処理部２５２が算出した値は、算出後に起動処理プログラム２０３が起動したＪａｖａＶＭ２０４においてのみ使用される。このため、算出した時点で既に稼働中のＫＶＳ２０５については、これらの値が使用されない。
【００８６】
一方、稼働中に分割領域１０２のサイズの値を変更しようとすると、プログラムの可用性を低下させる恐れがある。同一のデータ構造であっても、異なる分割領域１０２のサイズの下では、ヒープ領域１０３上での大きさや値の配置が変わるためである。稼働中に分割領域１０２のサイズを変更する場合、ヒープ領域１０３の内容の大幅な変更が必要になることを意味する。大量のメモリ内容の変更処理は、膨大な処理時間を必要とし、プログラムの応答性を低下させる原因となる。
【００８７】
これに対して、実施例２では、ＫＶＳ２０５の複製データを新しいＫＶＳ２０５に引き継ぐことにより、可用性を低下させることなく、全てのＫＶＳ２０５に対して適用する。計算機１００の構成部分の多くは実施例１と同様であるため、以下では差異点を中心に説明する。
【００８８】
図１１は、実施例２にかかる計算機システムの構成例を示す説明図である。計算機システム１１００は、複数（図１１では例として５台）の計算機１００がリング状に接続されたクラスタである。各計算機１００は、実施例１で示したＫＶＳ２０５（ＫＶＳ１〜ＫＶＳ５）を有する。なお、計算機システム１１００は、１以上の計算機１００が存在すればよく、その場合も「計算機システム１１００」と称す。
【００８９】
なお、図１１中、ＫＶＳ２０５の配置は、データを格納するＫＶＳ２０５を決定するための論理空間におけるノード配置（論理位置）を示しており、計算機システム１１００における情報記憶ノードの物理配置を意味しない。この構成は、ＫＶＳ２０５の起動時に運用管理者によって設定される。または、図１１中、ＫＶＳ６に示すように、運用管理者によって起動後に追加される。なお、追加図２中ＫＶＳ５に示すように、各ＫＶＳ２０５で障害等が発生した場合には、当該ＫＶＳ２０５は論理構成から離脱する。
【００９０】
実施例２にかかる計算機システム１１００において、ＫＶＳ２０５はクライアント１１０１からのリクエストを受信し、対応したレスポンスをクライアント１１０１に返却する。受信した要求がオブジェクト１０４の書き込み要求であった場合、ＫＶＳ２０５は、受信データを自身の中に記録するだけでなく、他のＫＶＳ２０５に対してデータのコピーを送信する。このため、データは常に複数のＫＶＳ２０５によって保持されることになる。これにより、特定のＫＶＳ２０５が離脱した際にも、当該ＫＶＳ２０５が保持していたデータに対してクライアント１１０１がアクセス不能になる事態が防止される。
【００９１】
＜計算機の構成例＞
図１２は、実施例２にかかる計算機１００のブロック図である。実施例２において、計算機１００は、実施例１の図２で説明した構成に加え、新たにノード管理テーブル１２０２を備える。また、実施例２において、計算機１００は、起動処理プログラム２０３の代わりに、再起動処理プログラム１２０１を備える。また、実施例２において、ＪａｖａＶＭ２０４とＫＶＳ２０５の組みは、複数組（図１０では、例として２組）存在する。計算機１００のその他の構成は、実施例１と同様である。
【００９２】
実施例２において、ＫＶＳ２０５同士は、お互いのデータの複製を持ち合っているものとする。具体的には、たとえば、ＫＶＳ２０５同士は、複数のＫＶＳ２０５間でデータの複製を持ち合うことにより、構成するプログラムの追加や削除が生じた場合にも、全体としての可用性を維持する。
【００９３】
なお、計算機１００の台数は、１台に限定されるものではなく、２台以上存在しても良い。また、メモリ１０１上に存在するＪａｖａＶＭ２０４とＫＶＳ２０５の組は、２組に限定されるものではなく、３つ以上の組が存在しても良い。あるいは、計算機１００の台数が２台以上存在する場合、それぞれの計算機１００のメモリ１０１上に存在するＪａｖａＶＭ２０４とＫＶＳ２０５の組は、２組に限定されるものではなく、１組であってもよい。
【００９４】
再起動処理プログラム１２０１は、算出処理部２５２による算出結果に基づき、稼働中のＫＶＳ２０５の再起動を行う。ノード管理テーブル１２０２は、稼働中のＫＶＳ２０５の識別情報を保持するテーブルである。
【００９５】
図１３は、ノード管理テーブル１２０２の構成とデータ例を示す説明図である。ノード管理テーブル１２０２は、ノード識別子フィールド１３００を有する。ノード管理テーブル１２０２の行数は、稼働中のＫＶＳ２０５と同数である。ノード識別子フィールド１３００は、稼働中のＫＶＳ２０５を一意に識別する識別子を保持する。実施例２では、識別子として、ＫＶＳ２０５のプロセス識別子を用いるが、これに限定されるものではない。
【００９６】
＜計算機１００による計算処理手順例＞
以上で、実施例２に係る計算機１００の構成を説明した。次に、実施例２かかる分割領域１０２のサイズ及び台数算出処理、及び再起動処理について説明する。計算機１００のその他の処理は、実施例１と同様である。
【００９７】
図１４は、実施例２にかかる算出処理部２５２の詳細な処理手順例を示すフローチャートである。図１４のフローチャートは、ステップＳ１４０８の処理が、図８で説明したステップＳ８０５と異なる。その他のステップは図８と同様であるため、説明を省略する。
【００９８】
ステップＳ１４０８において、算出処理部２５２は、再起動処理プログラム１２０１の実行を開始する（ステップＳ１４０８）。算出処理部２５２は、再起動処理プログラム１２０１への入力として、変数ＲＣの値及び変数ＲＮの値を渡す。
【００９９】
図１５は、実施例２にかかる再起動処理の詳細な処理手順例を示すフローチャートである。図１５のフローチャートは、図１４のステップＳ１４０８の詳細な処理手順例である。まず、再起動処理プログラム１２０１は、算出処理部２５２による算出処理が終了した時点、などの所定タイミングで、本処理フローを開始する（ステップＳ１５００）。なお、ノード管理テーブル１２０２にノード識別子が存在するノード、すなわち、ＫＶＳ２０５は、クラスタを構成する。クラスタを構成する各ＫＶＳ２０５は、他のＫＶＳ２０５の複製データを保持する。
【０１００】
再起動処理プログラム１２０１は、算出処理部２５２による入力値ＲＣを、変数Ｃに設定する。また、算出処理部２５２による入力値ＲＮを、変数Ｎに設定する（ステップＳ１５０１）。
【０１０１】
つぎに、再起動処理プログラム１２０１は、ノード管理テーブル１２０２中の全ての行を処理し終えたかどうかを確認する（ステップＳ１５０２）。未処理の行が残っている場合は（ステップＳ１５０２：Ｎｏ）、ステップＳ１５０３に進む。全ての行を処理し終えた場合は（ステップＳ１５０２：Ｙｅｓ）、本フローチャートの処理を終了する。
【０１０２】
未処理の行が残っている場合（ステップＳ１５０２：Ｎｏ）、再起動処理プログラム１２０１は、ノード管理テーブル１２０２中の次の行を取得し、当該行のノード識別子フィールド１３００の値を変数Ｘに設定する（ステップＳ１５０３）。そして、再起動処理プログラム１２０１は、プロセス識別子の値が変数Ｘの値に等しいＫＶＳ２０５の実行を終了し、クラスタから除外する（ステップＳ１５０４）。
【０１０３】
つぎに、再起動処理プログラム１２０１は、変数Ｎの値に等しい個数のＪａｖａＶＭ２０４を、メモリ１０１上に展開して実行を開始させる（ステップＳ１５０５）。この際、起動処理プログラム２０３は、ＪａｖａＶＭ２０４の起動時オプションを介して、分割領域１０２のサイズとして変数Ｃの値を指定する。
【０１０４】
そして、再起動処理プログラム１２０１は、ステップＳ１５０５で起動したＪａｖａＶＭ２０４上で稼働するＫＶＳ２０５に対して、ステップＳ１５０４で終了させたＫＶＳ２０５が保持していたデータの複製を保持する他のＫＶＳ２０５から、複製データのコピーを行う（ステップＳ１５０６）。このあと、再起動処理プログラム１２０１は、ステップＳ１５０５で起動したＪａｖａＶＭ２０４上で稼働するＫＶＳ２０５をクラスタに参加させる（ステップＳ１５０７）。そして、ステップＳ１３０２に戻る。ステップＳ１５０２〜Ｓ１５０７のループを繰り返すことで、クラスタ内のすべてのＫＶＳ２０５の再起動が完了する。
【０１０５】
なお、本フローチャートの処理においては、ステップＳ１５０４の実行が完了した後、ステップＳ１５０７の実行が完了するまでの間は、データの複製数が１減少した状態になる。これは、ステップＳ１５０４〜Ｓ１５０６までの処理の順序を、ステップＳ１５０５，Ｓ１５０６，Ｓ１５０７，Ｓ１５０４の順に変更することで防ぐことが可能である。
【０１０６】
以上のようにして、実施例２にかかる計算機１００によれば、ＫＶＳ２０５の可用性を低下させることなく、全てのＫＶＳ２０５に対して、メモリ使用効率の向上を図ることができる。
【０１０７】
なお、本実施例２は、ハイパーバイザーと呼ばれるソフトウェアを用いて、一つの計算機システム１１００上で複数の仮想的な計算機システム１１００を動作させる環境においても、同様に利用可能である。また、そのような環境においては、ステップＳ１５０５の処理において、変数Ｎの値に等しい個数のＪａｖａＶＭ２０４を開始する代わりに、ＪａｖａＶＭ２０４を含んだ仮想的な計算機システム１１００を、変数Ｎの値に等しい個数だけ起動することにしてもよい。
【０１０８】
このように、実施例２においても、実施例１と同様、プログラムの稼働台数と分割領域のサイズとを調整することにより、メモリの使用効率の向上を図ることができる。また、実施例２では、クラスタ構成を採用するため、計算機１００の可用性を低下させることなく、メモリの使用効率の向上に即時対応することができる。
【図１】
2015072601.tif 000003
【図２】
2015072601.tif 000004
【図３】
2015072601.tif 000005
【図４】
2015072601.tif 000006
【図５】
2015072601.tif 000007
【図６】
2015072601.tif 000008
【図７】
2015072601.tif 000009
【図８】
2015072601.tif 000010
【図９】
2015072601.tif 000011
【図１０】
2015072601.tif 000012
【図１１】
2015072601.tif 000013
【図１２】
2015072601.tif 000014
【図１３】
2015072601.tif 000015
【図１４】
2015072601.tif 000016
【図１５】
2015072601.tif 000017