(57)【特許請求の範囲】
【請求項１】
プログラムの実行により生成されるオブジェクトを管理するシステムであって、
生成されてから予め定められた基準期間が経過したオブジェクトである旧オブジェクト、および、生成されてから前記基準期間が経過していないオブジェクトである新オブジェクトを区別可能に記憶している記憶装置と、
プログラムの実行に応じて新たにオブジェクトを生成した場合に、生成した当該オブジェクトを前記新オブジェクトとして前記記憶装置に格納する生成部と、
前記記憶装置に記憶されている前記新オブジェクトの中から、生成されてから前記基準期間が経過した新オブジェクトを選択する選択部と、
選択した当該新オブジェクトと内容が等しい前記旧オブジェクトを前記記憶装置から検索する検索部と、
選択した当該新オブジェクトと内容が等しい前記旧オブジェクトが検索されなかったことを条件に、選択した当該新オブジェクトを新たな前記旧オブジェクトとして前記記憶装置に格納する格納部と、
前記検索部により当該旧オブジェクトが検索されたことを条件に、選択した当該新オブジェクトに対する参照を、検索された当該旧オブジェクトに対する参照に統合する、統合部と
を備えるシステム。
【請求項２】
前記記憶装置内のある記憶領域を旧世代領域とし、前記記憶装置内の他の記憶領域を新世代領域とし、他の何れのオブジェクトからも参照されていないオブジェクトを検出したことを条件に、当該オブジェクトの記憶領域を解放する処理を、前記旧世代領域と比較して前記新世代領域に記憶されたオブジェクトについてより高い頻度で行うと共に、予め定められた条件を満たすオブジェクトを前記新世代領域から前記旧世代領域に殿堂入りさせる、世代別ガーベジ・コレクタ部を更に備え、
前記記憶装置は、前記旧世代領域に前記旧オブジェクトを、前記新世代領域に前記新オブジェクトを記憶し、
前記生成部は、プログラムの実行に応じて新たにオブジェクトを生成した場合に、生成した当該オブジェクトを前記新世代領域に格納し、
前記選択部は、ある新オブジェクトが、世代別ガーベジ・コレクタ部によって前記新世代領域から前記旧世代領域に殿堂入りすると判断されたことを条件に、当該新オブジェクトが生成されてから前記基準期間が経過したと判断する、請求項１に記載のシステム。
【請求項３】
前記世代別ガーベジ・コレクタ部は、前記新世代領域に新たに記憶されてから、前記新世代領域についてオブジェクトの記憶領域を解放する処理が、予め定められた基準回数行われても、前記新世代領域に記憶され続けているオブジェクトを、前記予め定められた条件を満たすオブジェクトとして、前記新世代領域から前記旧世代領域に殿堂入りさせる、請求項２に記載のシステム。
【請求項４】
前記格納部は、前記選択部が選択した当該新オブジェクトと内容が等しい前記旧オブジェクトが検索されなかったことを条件に、選択した当該新オブジェクトと内容が同一の新たな前記旧オブジェクトを、前記旧世代領域に生成し、
前記統合部は、前記選択部が選択した当該新オブジェクトと内容が等しい前記旧オブジェクトが検索されなかったことを条件に、選択した当該新オブジェクトに対する参照を、前記格納部が格納した当該旧オブジェクトに対する参照に変更し、
前記世代別ガーベジ・コレクタ部は、前記統合部により前記新オブジェクトに対する他のオブジェクトからの参照が、前記旧オブジェクトに対する参照に変更されことを条件に、前記新オブジェクトの記憶領域を解放する、請求項２に記載のシステム。
【請求項５】
前記記憶装置は、前記オブジェクトとして、不変文字列オブジェクトを記憶している、請求項１に記載のシステム。
【請求項６】
それぞれの前記オブジェクトは、他のオブジェクトから直接参照されるヘッダ部、および、前記ヘッダ部から参照されるボディ部を有し、
前記統合部は、ある新オブジェクトと内容が等しい前記旧オブジェクトが検索されたことに応じて、当該新オブジェクトのヘッダ部から当該新オブジェクトのボディ部に対する参照を、当該新オブジェクトのヘッダ部から当該旧オブジェクトのボディ部に対する参照に統合する、請求項１に記載のシステム。
【請求項７】
前記記憶装置は、記憶しているそれぞれの前記旧オブジェクトに対する参照を、当該旧オブジェクトの内容に基づき算出されるハッシュ値に対応付けた、ハッシュテーブルを記憶しており、
前記検索部は、ある新オブジェクトが生成されてから前記基準期間が経過した場合に、当該新オブジェクトの内容に基づくハッシュ値に対応する参照を前記ハッシュテーブルから読み出すことで、当該新オブジェクトと内容が等しい旧オブジェクトを検索し、
前記格納部は、新オブジェクトを新たに旧オブジェクトとして格納したことを条件に、更に、当該旧オブジェクトの内容に基づきハッシュ値を算出し、当該ハッシュ値を当該旧オブジェクトに対する参照に対応付けて前記ハッシュテーブルに追加し、当該旧オブジェクトが将来ガーベジ・コレクタにより解放される場合に前記ハッシュテーブルからも削除する、
請求項１に記載のシステム。
【請求項８】
プログラムの実行により生成されるオブジェクトをコンピュータにより管理する方法であって、
前記コンピュータは、
生成されてから予め定められた基準期間が経過したオブジェクトである旧オブジェクト、および、生成されてから前記基準期間が経過していないオブジェクトである新オブジェクトを区別可能に記憶している記憶装置を備え、
前記コンピュータにより、
プログラムの実行に応じて新たにオブジェクトを生成した場合に、生成した当該オブジェクトを前記新オブジェクトとして前記記憶装置に格納するステップと、
前記記憶装置に記憶されている前記新オブジェクトの中から、生成されてから前記基準期間が経過した新オブジェクトを選択するステップと、
選択した当該新オブジェクトと内容が等しい前記旧オブジェクトを前記記憶装置から検索するステップと、
選択した当該新オブジェクトと内容が等しい前記旧オブジェクトが検索されなかったことを条件に、選択した当該新オブジェクトを新たな前記旧オブジェクトとして前記記憶装置に格納するステップと
当該検索するステップにおいて当該旧オブジェクトが検索されたことを条件に、選択した当該新オブジェクトに対する参照を、検索された当該旧オブジェクトに対する参照に統合するステップと
を備える方法。
【請求項９】
プログラムの実行により生成されるオブジェクトを管理するシステムとして、コンピュータを機能させるプログラムであって、
前記コンピュータを、
生成されてから予め定められた基準期間が経過したオブジェクトである旧オブジェクト、および、生成されてから前記基準期間が経過していないオブジェクトである新オブジェクトを区別可能に記憶している記憶装置と、
プログラムの実行に応じて新たにオブジェクトを生成した場合に、生成した当該オブジェクトを前記新オブジェクトとして前記記憶装置に格納する生成部と、
前記記憶装置に記憶されている前記新オブジェクトの中から、生成されてから前記基準期間が経過した新オブジェクトを選択する選択部と、
選択した当該新オブジェクトと内容が等しい前記旧オブジェクトを前記記憶装置から検索する検索部と、
選択した当該新オブジェクトと内容が等しい前記旧オブジェクトが検索されなかったことを条件に、選択した当該新オブジェクトを新たな前記旧オブジェクトとして前記記憶装置に格納する格納部と、
前記検索部により当該旧オブジェクトが検索されたことを条件に、選択した当該新オブジェクトに対する参照を、検索された当該旧オブジェクトに対する参照に統合する、統合部と
して機能させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オブジェクトを記憶・管理するシステムに関する。特に、本発明は、プログラムの実行に応じて順次生成させるオブジェクトを記憶・管理するシステムに関する。
【背景技術】
【０００２】
近年、Ｊａｖａ（登録商標）言語などの、オブジェクト指向プログラム言語が広く用いられている。そのような言語で記述されたプログラムは、オブジェクトを単位として演算処理および入出力処理を行う。即ち、プログラムの実行システムは、プログラムの実行に応じ、そのプログラムの指令に従って各種のオブジェクトを動的に生成する。生成されたオブジェクトは、メモリ内のヒープと呼ばれる領域に記憶される。
【０００３】
オブジェクトを効率的に記憶・管理するためには、オブジェクトの遊休および重複をなるべく少なくすることが好ましい。オブジェクトの遊休とは、オブジェクトの全部または一部が既に使用されなくなったことをいう。オブジェクトの重複とは、他のオブジェクトと少なくとも一部が同一であることをいう。オブジェクトの遊休は、例えばガーベジ・コレクション（以下ＧＣと呼ぶ）などのメモリ管理技術を応用することで解消されることが知られている。
【０００４】
オブジェクトの重複は、例えば、重複する複数のオブジェクトに対する参照を、それらのうちの１つのオブジェクトに対する参照に統合することで、解消されると考えられる。そのオブジェクトが、内容が変更されないことが保証された不変オブジェクトである場合には、オブジェクトの重複解消は特に有効である。即ち、プログラムは、その後の実行において、参照の統合されたそのオブジェクトを、あたかも統合前の複数のオブジェクトのそれぞれであるかのように使用し続けることができる。
【０００５】
ガーベジ・コレクションに関する技術は特許文献１を、オブジェクト指向プログラムを実行する装置における文字列データの管理については特許文献２を参照されたい。
【特許文献１】特開２００１−１８４２１９号公報
【特許文献２】特開２００３−２５６２０９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
オブジェクトの重複を解消するためには、新たにオブジェクトを生成する場合に、例えば以下の処理を行うとよい。実行システムは、（１）その新たなオブジェクトと内容が同一の他のオブジェクトをヒープから検索し、（２）検索された場合には、その新たなオブジェクトに対する参照に代えて、検索されたそのオブジェクトに対する参照を生成する。これにより、新たなオブジェクトは生成される必要が無く、あるいは、仮に生成されたとしてもそれに対する参照が無いのでその記憶領域はその後に解放される。
【０００７】
しかしながら、上記（１）の検索処理は、既に生成されたオブジェクトの数に応じた時間を要する。この処理は、ハッシュテーブルなどのデータ構造を用いて効率化されることも可能だが、それでもある程度の時間を要する。さらには、オブジェクトによっては生成されてから短期間で使用されなくなる場合がある。そのようなオブジェクトについては、重複解消のために費やす時間に比べて、重複解消により得られる記憶領域の効率化の効果が小さい。即ち、そのようなオブジェクトについては、重複解消のための検索に時間を費やすよりも、使用されなくなった後にＧＣによって回収された方が、効率がよい。
【０００８】
そこで本発明は、上記の課題を解決することのできるシステム、方法およびプログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、本発明の一側面においては、プログラムの実行により生成されるオブジェクトを管理するシステムであって、生成されてから予め定められた基準期間が経過したオブジェクトである旧オブジェクト、および、生成されてから基準期間が経過していないオブジェクトである新オブジェクトを区別可能に記憶している記憶装置と、プログラムの実行に応じて新たにオブジェクトを生成した場合に、生成した当該オブジェクトを新オブジェクトとして記憶装置に格納する生成部と、記憶装置に記憶されている新オブジェクトの中から、生成されてから基準期間が経過した新オブジェクトを選択する選択部と、選択した当該新オブジェクトと内容が等しい旧オブジェクトを記憶装置から検索する検索部と、選択した当該新オブジェクトと内容が等しい旧オブジェクトが検索されなかったことを条件に、選択した当該新オブジェクトを新たな旧オブジェクトとして記憶装置に格納する格納部と、検索部により当該旧オブジェクトが検索されたことを条件に、選択した当該新オブジェクトに対する参照を、検索された当該旧オブジェクトに対する参照に統合する、統合部とを備えるシステムを提供する。また、当該システムとしてコンピュータを機能させるプログラム、および、当該システムによりオブジェクトを管理する方法を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明を実施するための最良の形態】
【００１０】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１１】
図１は、本実施形態に係るコンピュータ１０の全体構成を示す。コンピュータ１０は、ハードウェアの主要な構成要素として、演算装置の一例であるＣＰＵ１０００、および、記憶装置の一例であるＲＡＭ１０２０を備える。そして、ＲＡＭ１０２０は、プログラムを記憶するためのコード領域３０と、プログラムの実行により生成されるヒープ領域２０とを有する。ＣＰＵ１０００は、プログラムをコード領域３０から読み出して実行する。
【００１２】
例えば、ＣＰＵ１０００は、システム・プログラムをコード領域３０から読み出して実行することで、実行システム４０として機能する。このシステム・プログラムは、オペレーティング・システムおよびデバイスドライバなどのプログラムのみならず、Ｊａｖａ仮想機械およびそのクラス・ライブラリなどの、ミドルウェアを含む。
【００１３】
実行システム４０は、ユーザ・プログラム５０をコード領域３０から読み出す。このユーザ・プログラム５０は、例えばＪａｖａなどのオブジェクト指向言語により記述されている。そして、実行システム４０は、ユーザ・プログラム５０を実行する。その実行中に、実行システム４０は、ユーザ・プログラム５０内に記述された指令、例えばオブジェクトを新たに生成する指令に応じて、ヒープ領域２０に記憶領域を確保する。ユーザ・プログラム５０がオブジェクト指向言語で記述されている場合において、この指令は例えばクラス・ライブラリに対するメソッド呼び出しである。
【００１４】
そして、実行システム４０は、確保した記憶領域にデータを格納する。また、実行システム４０は、ユーザ・プログラム５０内に記述された他の指令に応じて、ヒープ領域２０からデータを読み出す。読み出されたデータは、例えば、メソッド呼び出しに対する戻り値としてユーザ・プログラム５０に返される。これに加えて、実行システム４０は、ユーザ・プログラム５０内の指令に従ってヒープ領域２０に記憶されたオブジェクトを変更してもよい。
【００１５】
ここで、実行システム４０がユーザ・プログラム５０内の指令に単に従ってオブジェクトを生成すると、同じ内容のオブジェクトが重複してヒープ領域２０に格納され、ヒープ領域２０の必要容量が大きくなってしまう場合がある。特に、オブジェクトが、一旦生成された後にはユーザ・プログラム５０内の指令によっては変更されることのない不変オブジェクトの場合、同じ内容の複数のオブジェクトをヒープ領域２０内に別々に記憶するのは非効率的である。
【００１６】
これに対し、本実施形態に係る実行システム４０は、ヒープ領域２０内に重複して記憶されているオブジェクトを検出して統合する処理を、適度な頻度で行う。これにより、記憶容量の節約と処理速度の向上をバランスさせて、全体としてユーザ・プログラム５０を効率的に実行できる。以下、具体的に説明する。
【００１７】
図２は、本実施形態に係るヒープ領域２０に記憶されるオブジェクトの一例を示す。ヒープ領域２０は、オブジェクトの具体例として文字列オブジェクトを記憶している。この文字列オブジェクトは、一旦生成されるとユーザ・プログラム５０によってはその内容が変更されないことが保証されている。この保証は、例えば、そのオブジェクトがユーザ・プログラム５０において定義される型（ｔｙｐｅ）およびプログラム言語の仕様に基づく。
【００１８】
一例として、Ｊａｖａ（登録商標）言語において、Ｓｔｒｉｎｇ型のオブジェクトは、一旦生成されるとユーザ・プログラム５０によってはその内容が変更されないことが保証されている。これに代えて、本実施形態に係るオブジェクトは、文字列以外の他の種類の不変オブジェクトであってよい。例えば、Ｊａｖａ言語におけるＢｉｇＤｅｃｉｍａｌ（ビッグ・デシマル）オブジェクトのような、高精度の演算実現のため実数の各桁の数値を要素とする配列変数型のオブジェクトであってよい。
【００１９】
具体的には、いま、図２に示すように、このオブジェクトは、ヘッダ部２２およびボディ部２５を有する。ヘッダ部２２は、他のオブジェクトから直接参照される。
【００２０】
ここでいう参照とは、例えば、他のオブジェクトが当該オブジェクトへのポインタを有することをいう。ポインタは、一例として、メモリ上の当該オブジェクトが記憶されている領域の先頭アドレスである。即ち、図２の例では、ヘッダ部２２の先頭アドレスが、他のオブジェクトの何れかのフィールドに格納されている。
【００２１】
ヘッダ部２２は、オブジェクトの操作を効率化するための各種のデータフィールドを有する。例えば、ヘッダ部２２は、バリュー（ｖａｌｕｅ）フィールド、オフセット（ｏｆｆｓｅｔ）フィールド、および、カウント（ｃｏｕｎｔ）フィールドを有する。バリューフィールドは、ボディ部２５に対する参照を記憶する。
【００２２】
ここでいう参照も上記の例と同様である。即ち、バリューフィールドは、例えば、ボディ部２５の先頭アドレスを記憶する。オフセットフィールドは、ボディ部２５のうち有効な文字列が記憶されている領域の、ボディ部２５の先頭からのオフセット値を記憶する。いま、オフセット値は４である。従って、ボディ部２５のうち先頭の４文字を除外した５文字目からが有効な文字列である。
【００２３】
カウントフィールドは、ボディ部２５のうち有効な文字列の文字数を示す。いま、カウントフィールドの値は６である。従って、ボディ部２５のうち先頭の４文字目から６文字が有効な文字列である。
ヒープ領域２０は、このように、文字列オブジェクトをその実体のみならずオフセット値などに対応付けて記憶している。これにより、例えばオフセット値またはカウント値を変更することで、文字列の一部削除または分割などをした新たな文字列オブジェクトを迅速に生成することができる。
【００２４】
図３は、本実施形態に係る実行システム４０およびヒープ領域２０の構成の具体例を示す。実行システム４０は、ユーザ・プログラム５０をＣＰＵ１０００により適切に実行させる機能の他、ユーザ・プログラム５０の実行に応じて生成されるオブジェクトを適切に記憶・管理するための機能を有する。具体的には、この機能は、文字列クラス・ライブラリ４００と、システムクラス・ライブラリ５００と、制御プログラム群６００等により実現される。
【００２５】
文字列クラス・ライブラリ４００は、文字列オブジェクトの生成、文字列オブジェクトの更新、および、文字列オブジェクトの参照などの、各種の処理を実現する。具体的には、文字列クラス・ライブラリ４００は、文字列クラスを定義する。文字列クラスにはフィールドおよびメソッドが定義される。文字列クラス・ライブラリ４００がこれらのメソッドの呼び出しを受けると、文字列クラス・ライブラリ４００を実行するＣＰＵ１０００は、ヒープ領域２０中の文字列オブジェクトにアクセスする。
【００２６】
システムクラス・ライブラリ５００は、例えばガーベジ・コレクションなどの、明示的にユーザ・プログラム５０に含まれている指令によらなくても実行される各種の処理を実現する。システムクラス・ライブラリ５００を実行するＣＰＵ１０００は、ガーベジ・コレクションとして、既に他のオブジェクトから参照されなくなったオブジェクトの記憶領域を解放してよい。
【００２７】
また、ヒープ領域２０は、オブジェクトを効率的に記憶・管理するために、複数の記憶領域を有する。具体的には、ヒープ領域２０は、新世代領域３００と、旧世代領域３１０と、制御用領域３２０とを有する。新世代領域３００および旧世代領域３１０は、いわゆる世代別ガーベジ・コレクションにより使用される領域である。新世代領域３００は、生成されてから予め定められた基準期間が経過していない新オブジェクトを記憶するための領域である。
【００２８】
一方、旧世代領域３１０は、生成されてから上記基準期間が経過した旧オブジェクトを記憶するための領域である。新世代領域３００は、第１領域３０５および第２領域３０７を有してよい。システムクラス・ライブラリ５００により実現されるガーベジ・コレクタは、第１領域３０５および第２領域３０７を交互に使用することで、いわゆるコピーＧＣを行う。その概略を以下に示す。
【００２９】
一例として、実行システム４０は、まず、第１領域３０５を、オブジェクトを記憶するための領域として設定している。即ち、文字列クラス・ライブラリ４００を実行するＣＰＵ１０００は、新たなオブジェクトを生成する指令に応じて、新たなオブジェクトを第１領域３０５内に格納する。そして、ガーベジ・コレクタは、予め定められた条件が成立した場合に、例えば予め定められたインターバル・タイムが経過した場合に、ユーザ・プログラム５０の動作を一旦中止させた上で、第１領域３０５内のオブジェクトのうち他のオブジェクトから参照されているオブジェクトを第２領域３０７にコピーする。
【００３０】
そして、ガーベジ・コレクタは、第１領域３０５内のオブジェクトに対する参照を、第２領域３０７内のオブジェクトに対する参照に変更する。そして、実行システム４０は、第２領域３０７を、オブジェクトを記憶するための領域に新たに設定する。そして、実行システム４０は、ユーザ・プログラム５０の動作を再開させる。これにより、ユーザ・プログラム５０は何の処理も行われなかったように正常動作を続けることができる。
【００３１】
この結果、第１領域３０５のうち既に使用されなくなったオブジェクトは、第２領域３０７には格納されない。また、第１領域３０５のうち使用中のオブジェクトは、いわゆるコンパクション処理により、第２領域３０７の中の連続領域に配置される。この結果、その後の処理において第２領域３０７を有効かつ効率的に利用できる。
【００３２】
ガーベジ・コレクタは、上記コピーＧＣよりも低い頻度で、旧世代領域３１０内のオブジェクトについてガーベジ・コレクションを行う。例えば、ガーベジ・コレクタは、旧世代領域３１０内のオブジェクトについては、コピーＧＣとは異なる方式、例えば、マーク・アンド・スイープ方式により、既に参照されなくなったオブジェクトを検出してもよい。
【００３３】
なお、新世代領域に十分長期間存在したオブジェクトはコピー時に旧世代領域に移動される。これを殿堂入りと呼ぶ。
【００３４】
以上のＧＣによる処理機能に加えて、制御プログラム群６００が、文字列オブジェクトを整理する処理を実現する。制御プログラム群６００は、例えばガーベジ・コレクタの動作に同期してこの処理を行ってもよい。制御プログラム群６００を実行するＣＰＵ１０００は、例えば内容が等しい複数のオブジェクトをヒープ領域２０内で統合してもよい。内容の等しいオブジェクトを検索し易くするために、制御用領域３２０は、ハッシュテーブル３２５を記憶・管理してもよい。
【００３５】
図４は、本実施形態に係る実行システム４０の構成のうち文字列クラス・ライブラリ４００に関する機能の構成を示す。ＣＰＵ１０００は、文字列クラス・ライブラリ４００を読み込んで実行することで、生成部４１０と、参照部４３０として機能する。生成部４１０は、ユーザ・プログラム５０の実行に応じて新たにオブジェクトを生成した場合に、生成した当該オブジェクトを、生成されてから基準期間が経過していないオブジェクトである新オブジェクトとしてヒープ領域２０内に格納する。その具体例を図４の第１領域３０５Ａおよび第１領域３０５Ｂに示す。
【００３６】
第１領域３０５Ａは、生成部４１０によりオブジェクトが生成される前の第１領域３０５を示す。あるオブジェクト２８が、ある文字列オブジェクトのヘッダ部２２−１と、他の文字列オブジェクトのヘッダ部２２−２を参照している。また、ヘッダ部２２−１は、ボディ部２５−１を参照しており、ヘッダ部２２−２は、ボディ部２５−２を参照している。
【００３７】
第１領域３０５Ｂは、生成部４１０によりオブジェクトが生成された後の第１領域３０５を示す。生成部４１０は、あらたに他の文字列オブジェクトを生成して第１領域３０５内に格納する。この文字列オブジェクトは、ヘッダ部２２−３およびボディ部２５−３を有する。オブジェクト２８は、このヘッダ部２２−３を新たに参照する。
【００３８】
参照部４３０は、ユーザ・プログラム５０内の指令に応じて文字列オブジェクトの内容を参照する。例えば、参照部４３０は、図２において説明した上記オフセット値などに基づいて、ボディ部２５−１に記憶された文字列データから有効部分を読み出してもよい。
【００３９】
なお、本実施形態において、ある第１オブジェクトが他の第２オブジェクトを参照している、とは、当該技術分野ではよくあることだが、当該第１オブジェクトの何れかのデータフィールドが、当該第２オブジェクトへのポインタ（例えばメモリ中のアドレス）を含むことをいう。以降の説明においても、説明の簡潔化のためこのような表現を使用する。
【００４０】
図５は、本実施形態に係る実行システム４０の構成のうちシステムクラス・ライブラリ５００に関する機能の構成を示す。ＣＰＵ１０００は、システムクラス・ライブラリ５００を読み込んで実行することで、ガーベジ・コレクタ部５１０として機能する。ガーベジ・コレクタ部５１０は、本発明に係る世代別ガーベジ・コレクタ部の一例である。具体的には、ガーベジ・コレクタ部５１０は、他の何れのオブジェクトからも参照されていないオブジェクトを検出したことを条件に当該オブジェクトの記憶領域を解放する処理を、新世代領域３００および旧世代領域３１０のそれぞれについて別々に行う。
【００４１】
詳細には、まず、ガーベジ・コレクタ部５１０は、この処理を、旧世代領域３１０と比較して新世代領域３００に対しより高い頻度で行う。そして、新世代領域３００に対するこの処理の毎に、ガーベジ・コレクタ部５１０は、新世代領域３００において予め定められた条件を満たすオブジェクトがあるかどうかを判断する。例えば、ガーベジ・コレクタ部５１０は、新世代領域３００に記憶されてから、上記処理が予め定められた基準回数行われても、新世代領域３００に記憶され続けているオブジェクトを、当該条件を満たすオブジェクトと判断する。
【００４２】
このようなオブジェクトは、長期間に渡り参照され続けており、その後も長期間参照され続けることが予想される。このため、ガーベジ・コレクタ部５１０は、このオブジェクトを、新世代領域３００から旧世代領域３１０に移動させる。この移動の処理のことを殿堂入りという。移動されたオブジェクトに対しては、そのオブジェクトは旧世代領域３１０に記憶されているので、その後低頻度でガーベジ・コレクションが行われる。
【００４３】
具体例として、第１領域３０５Ｃに、新世代領域３００に対するガーベジ・コレクションが処理される前の第１領域３０５を示す。これは、図４において説明した第１領域３０５Ｂと同様である。また、旧世代領域３１０Ｃに、新世代領域３００に対するガーベジ・コレクションが処理される前の旧世代領域３１０を示す。
【００４４】
旧世代領域３１０Ｃは、文字列オブジェクトでないオブジェクト２６およびオブジェクト２７を記憶している。また、旧世代領域３１０Ｃは、２つの文字列オブジェクトを記憶している。ある文字列オブジェクトは、ヘッダ部２２−４およびボディ部２５−４を含む。他の文字列オブジェクトはヘッダ部２２−５およびボディ部２５−５を含む。オブジェクト２６はオブジェクト２７およびヘッダ部２２−４を参照している。オブジェクト２７は、ヘッダ部２２−５を参照している。ヘッダ部２２−４はボディ部２５−４を参照している。ヘッダ部２２−５はボディ部２５−５を参照している。
【００４５】
第２領域３０７Ｄに、新世代領域３００に対するガーベジ・コレクションが処理された後の第２領域３０７を示す。旧世代領域３１０Ｄに、新世代領域３００に対するガーベジ・コレクションが処理された後の旧世代領域３１０を示す。ヘッダ部２２−３およびボディ部２５−３は、例えば図４の生成部４１０により生成されたばかりなので、新世代領域３００中に留まっている。また、オブジェクト２８も新世代領域３００中に留まっている。
【００４６】
一方で、ヘッダ部２２−１、ボディ部２５−１、ヘッダ部２２−２およびボディ部２５−２は、予め定められた条件を満たすので、殿堂入りにより旧世代領域３１０Ｄに移動されている。また、ガーベジ・コレクタ部５１０は、オブジェクト２８から第１領域３０５Ｃ中のヘッダ部２２−１およびヘッダ部２２−２に対する参照を、オブジェクト２８から旧世代領域３１０Ｄ中のヘッダ部２２−１およびヘッダ部２２−２に対する参照に変更する。
【００４７】
以上により、ヘッダ部２２−１、ボディ部２５−１、ヘッダ部２２−２およびボディ部２５−２を、その後の新世代領域３００に対するガーベジ・コレクションの対象から除外できる。この結果、新世代領域３００の記憶容量を新たなオブジェクトのために空けることができると共に、その後の新世代領域３００に対するガーベジ・コレクションを効率化できる。
【００４８】
しかしながら、図５の旧世代領域３１０Ｄとして示したように、ボディ部２５−１およびボディ部２５−４が、共に同一の文字列「ａａａ」を含んでいる。このように、ガーベジ・コレクションによっては、使用されなくなったオブジェクトを除外することはできるが、重複を解消することはできない。これに対し、本実施形態に係るガーベジ・コレクタ部５１０は、以下に示すように制御プログラム群６００と協調動作することで、そのような重複を適切に解消することができる。
【００４９】
図６は、本実施形態に係る実行システム４０の構成のうち制御プログラム群６００に関する機能の構成を示す。ＣＰＵ１０００は、制御プログラム群６００を読み込んで実行することで、選択部６１０と、検索部６２０と、格納部６３０と、統合部６４０として機能する。選択部６１０は、ヒープ領域２０に記憶されている新オブジェクトの中から、生成されてから基準期間が経過した新オブジェクトを選択する。
【００５０】
具体的には、選択部６１０は、ある新オブジェクトが、ガーベジ・コレクタ部５１０によって新世代領域３００から旧世代領域３１０に殿堂入りすると判断されたことを条件に、当該新オブジェクトが生成されてから基準期間が経過したと判断してよい。この殿堂入りは、上記のように、予め定められた条件が満たされたことに応じて行われる。
【００５１】
具体例として、第１領域３０５Ｃに、新世代領域３００に対するガーベジ・コレクションが処理される前の第１領域３０５を示す。これは、図５において説明した第１領域３０５Ｃと略同一である。第２領域３０７Ｅに、新世代領域３００に対するガーベジ・コレクションが処理された後の第２領域３０７を示す。
【００５２】
ヘッダ部２２−３およびボディ部２５−３は、例えば図４の生成部４１０により生成されたばかりなので、新世代領域３００中に留まっている。一方で、ヘッダ部２２−１、ボディ部２５−１、ヘッダ部２２−２およびボディ部２５−２は、予め定められた条件を満たすので、殿堂入りすると判断される。
【００５３】
このように殿堂入りするとして選択部６１０により選択された新オブジェクトについて、検索部６２０は、当該新オブジェクトと内容が等しい旧オブジェクトをヒープ領域２０の旧世代領域３１０から検索する。この検索の処理には、制御用領域３２０に記憶されたハッシュテーブル３２５が利用される。
【００５４】
具体例として、旧世代領域３１０Ｃに、新世代領域３００に対するガーベジ・コレクションが処理される前の旧世代領域３１０を示す。これは、図５において説明した旧世代領域３１０Ｃと略同一である。また、制御用領域３２０Ｃに、新世代領域３００に対するガーベジ・コレクションが処理される前の制御用領域３２０を示す。
【００５５】
制御用領域３２０Ｃは、所望の旧オブジェクトを旧世代領域３１０Ｃから検索し易くするためにハッシュテーブル３２５を記憶している。このハッシュテーブル３２５は、旧世代領域３１０Ｃに記憶されているそれぞれの旧オブジェクトに対する参照を、当該旧オブジェクトの内容に基づき算出されるハッシュ値に対応付けている。
【００５６】
オブジェクトが文字列オブジェクトの場合、当該ハッシュ値は、例えば、文字列オブジェクトが示す各文字の文字コードに対し、予め定められた演算を行うことで算出される数値である。例えば、文字列「ａａａ」に対し数値２２、および、文字列「ｂｂｂ」に対し数値６０などのように、オブジェクトの内容に基づきハッシュ値は一意に定まる。
【００５７】
これを利用した検索部６２０の処理は以下の通りである。まず、検索部６２０は、選択部６１０により選択された新オブジェクトの内容に基づきハッシュ値を算出する。検索部６２０は、このハッシュ値を、次の利用の利便のため、ヘッダ部２２中の所定のフィールドに格納してもよい。これに代えて、ハッシュ値はオブジェクトの生成時または更新時に既に算出されてヘッダ部２２中に格納されていてもよい。この場合、検索部６２０は、単にそのハッシュ値をヘッダ部２２から読み出す。
【００５８】
次に、検索部６２０は、当該ハッシュ値に対応する参照をハッシュテーブル３２５から読み出す。これにより、当該新オブジェクトと内容が等しい旧オブジェクトが検索される。読み出した参照は統合部６４０に通知される。また、ハッシュ値がハッシュテーブル３２５に格納されていないことは、そのような旧オブジェクトが旧世代領域３１０から検索されないことを示す。この場合には、検索部６２０は、ハッシュ値がハッシュテーブル３２５に格納されていないことを、格納部６３０に通知する。
【００５９】
具体例として、第１領域３０５Ｃおよび第２領域３０７Ｅを対比して理解されるように、選択部６１０により選択された新オブジェクトは２つであり、その一方は文字列「ａａａ」を示し、他方は文字列「ｂｂｂ」を示す。従って、検索部６２０は、まず、それらの新オブジェクトのそれぞれについて、その内容に基づきハッシュ値を算出する。
【００６０】
一例として、検索部６２０は、ボディ部２５−１に記憶された文字列「ａａａ」に基づきハッシュ値２２を算出し、ボディ部２５−２に記憶された文字列「ｂｂｂ」に基づきハッシュ値６０を算出する。そして、検索部６２０は、ハッシュ値２２に対応する参照をハッシュテーブル３２５から読み出す。その結果、ヘッダ部２２−４に対する参照が読み出される。読み出された参照は統合部６４０に対し通知される。
【００６１】
一方、検索部６２０は、ハッシュ値６０に対応する参照をハッシュテーブル３２５から読み出す。しかし、このハッシュ値はハッシュテーブル３２５に登録されていない。従って、検索部６２０は、当該新オブジェクトと内容が等しい他の旧オブジェクトは検索できなかった旨、格納部６３０に通知する。
【００６２】
なお、互いに異なる文字列について同一のハッシュ値が算出される場合もある。この場合には、ハッシュテーブル３２５は、同じハッシュ値を有する複数のオブジェクトのそれぞれに対する参照をリスト形式のデータで表し、そのリスト形式のデータをそのハッシュ値に対応付けて記憶している。
【００６３】
その場合には、検索部６２０は、まず、選択部６１０により選択された新オブジェクトの内容に基づくハッシュ値に対応する、そのリスト形式のデータをハッシュテーブル３２５から読み出す。そして、検索部６２０は、そのリスト形式のデータを先頭から走査して、複数の参照を次々に読み出す。
【００６４】
そして、検索部６２０は、参照を読み出す毎に、その参照先のヘッダ部２２およびボディ部２５に基づき旧オブジェクトの内容を特定する。それが選択部６１０により選択された新オブジェクトの内容と一致すれば、検索部６２０は、旧オブジェクトを検索できたと判断する。一方、何れの参照の参照先についても、選択部６１０により選択された新オブジェクトの内容と一致しなければ、検索部６２０は、旧オブジェクトを検索できなかったと判断する。
【００６５】
但し、図６を含め本実施形態においては、説明の簡潔化のため、上記のように同じハッシュ値を有する複数のオブジェクトは旧世代領域３１０内に無いものとして、説明をすすめる。
次に、格納部６３０について説明する。格納部６３０は、選択部６１０により選択された新オブジェクトと内容が等しい旧オブジェクトが検索されなかったことを条件に、選択された当該新オブジェクトを新たな旧オブジェクトとしてヒープ領域２０に格納する。
【００６６】
具体的には、第１領域３０５Ｃ内の文字列「ｂｂｂ」を示す新オブジェクトと、内容が同一の旧オブジェクトは、旧世代領域３１０Ｃに格納されていない。従って、格納部６３０は、当該新オブジェクトに含まれるヘッダ部２２−２およびボディ部２５−２を読み出したうえで、これらを、新たな旧オブジェクトのヘッダ部およびボディ部として旧世代領域３１０に格納する。その結果、旧世代領域３１０Ｅには、ヘッダ部２２−２およびボディ部２５−２が記憶される。
【００６７】
この格納の処理に応じ、格納部６３０は、当該旧オブジェクトの内容に基づきハッシュ値を算出し、当該ハッシュ値を当該旧オブジェクトに対する参照に対応付けてハッシュテーブル３２５に追加する。例えば格納部６３０は、ボディ部２５−２に記憶された文字列「ｂｂｂ」に基づきハッシュ値６０を算出し、そのハッシュ値をヘッダ部２２−２に対する参照に対応付けてハッシュテーブル３２５に追加する。これにより、その後の処理において新オブジェクトと旧オブジェクトとを容易に区別することができると共に、所望の旧オブジェクトを検索し易くすることができる。
【００６８】
また、この格納の処理に応じ、格納部６３０は、当該新オブジェクトに対する参照を、あらたな当該旧オブジェクトに対する参照に変更してもよい。例えば、第１領域３０５Ｃに示すように、ヘッダ部２２−２は、オブジェクト２８から参照されている。従って、格納部６３０は、このオブジェクト２８からヘッダ部２２―２に対する参照を、第２領域３０７Ｅに移動されたオブジェクト２８から新たに旧世代領域３１０Ｅに格納したヘッダ部２２−２に対する参照に変更する。これにより、ユーザ・プログラム５０のその後の実行において各オブジェクトは正しく参照されることができる。
【００６９】
なお、この参照の変更は必ずしも行わなくてよい。例えば、新オブジェクトを新たに旧オブジェクトとして格納する場合において、オブジェクトを記憶するアドレスを変更しなくとも、オブジェクトを例えばハッシュテーブル３２５に単に登録すればよい他の形態において、当該新オブジェクトと当該旧オブジェクトの記憶されるアドレスは等しい。従って、格納部６３０は、他のオブジェクトからの参照を変更しなくても、プログラムを正しく継続動作させることができる。
【００７０】
さらに、格納部６３０は、新たな当該旧オブジェクトが将来参照されなくなって、その記憶域がガーベジ・コレクタ部５１０により解放される場合には、当該旧オブジェクトへの参照をハッシュテーブル３２５から削除する。
【００７１】
次に、統合部６４０について説明する。統合部６４０は、検索部６２０により旧オブジェクトが検索されたことを条件に、選択部６１０により選択された新オブジェクトに対する全ての参照を、検索された当該旧オブジェクトに対する参照に統合する。具体的には以下の通りである。
【００７２】
第１領域３０５Ｃと旧世代領域３１０Ｃを対比して理解されるように、ボディ部２５−１に記憶された文字列「ａａａ」と等しい内容の旧オブジェクトが旧世代領域３１０Ｃに記憶されている。この旧オブジェクトは、検索部６２０によりハッシュテーブル３２５を利用して検索される。この結果、ヘッダ部２２−４に対する参照が統合部６４０に対し出力される。
【００７３】
従って、統合部６４０は、ヘッダ部２２−１に対するオブジェクト２８からの参照を、検索されたこのヘッダ部２２−４に対するオブジェクト２８からの参照に変更する。具体的には、統合部６４０は、オブジェクト２８内におけるヘッダ部２２−１の先頭アドレスを、ヘッダ部２２−４の先頭アドレスと同じになるように変更してよい。
【００７４】
この例においてヘッダ部２２−１に対する参照は１つだけだが、この参照が複数の場合には統合部６４０は全ての参照を同様にヘッダ部２２−４に対する参照に変更する。以上の処理により、文字列「ａａａ」を内容とする２つのオブジェクトは１つに統合されると共に、オブジェクト２６およびオブジェクト２８はその統合されたオブジェクトを正しく参照し続けることができる。
【００７５】
ヘッダ部２２−１に対する参照がヘッダ部２２−４に対する参照に変更された結果、ヘッダ部２２−１は何れのオブジェクトからも参照されなくなる。したがって、ガーベジ・コレクタ部５１０は、ガーベジ・コレクションを継続することで、ヘッダ部２２−１およびボディ部２５−１の記憶領域を解放する。このため、統合部６４０は、この記憶領域を解放するための明示的な処理を行わなくてもよい。
【００７６】
以上、図６に示した例によれば、文字列の重複を排除することで、ヒープ領域２０の占有量を低減してユーザ・プログラム５０の実行を効率化できる。例えば、図５および図６を対比すると、文字列「ａａａ」を内容とするオブジェクトの重複が解消されて、その結果旧世代領域３１０Ｄよりも旧世代領域３１０Ｅの空き容量が増加している。
【００７７】
図７は、本実施形態に係る実行システム４０によりオブジェクトが操作される処理の流れを示す。生成部４１０は、ユーザ・プログラム５０によりオブジェクト生成のためのメソッドが呼び出されたことに応じて（Ｓ７００：ＹＥＳ）、オブジェクトを生成して新オブジェクトとして新世代領域３００に格納する（Ｓ７１０）。このメソッドは、一例として、オブジェクト指向プログラム言語におけるコンストラクタ・メソッドである。
【００７８】
なお、処理の対象が不変オブジェクトではない場合には、実行システム４０は、オブジェクトを変更する処理を行ってもよい。例えば、実行システム４０は、ユーザ・プログラム５０によりオブジェクト変更のためのメソッドが呼び出されたことに応じて（Ｓ７２０：ＹＥＳ）、新世代領域３００または旧世代領域３１０に記憶されたオブジェクトを変更する（Ｓ７３０）。このメソッドは、具体的には、オブジェクトの結合・分割などのメソッドである。
【００７９】
また、参照部４３０は、１５０によりオブジェクト参照のためのメソッドが呼び出されたことに応じて（Ｓ７４０：ＹＥＳ）、新世代領域３００または旧世代領域３１０に記憶されたオブジェクトを読み出して、例えば他のオブジェクト内にその内容を格納し、または、画面に表示等する（Ｓ７５０）。何れの場合も、生成部４１０および参照部４３０は、処理の結果を戻り値として出力してよい（Ｓ７６０）。
【００８０】
図８は、本実施形態に係る実行システム４０によりオブジェクトが統合される処理の流れを示す。実行システム４０は、以下の処理を、例えばガーベジ・コレクタ部５１０による新世代領域３００に対するガーベジ・コレクションのタイミングで行う。まず、ガーベジ・コレクタ部５１０は、新世代領域３００内の各新オブジェクトが、殿堂入りのための予め定められた条件を満たすか判定する（Ｓ８００）。
【００８１】
次に、選択部６１０は、殿堂入りのための当該条件を満たす新オブジェクトがあったかどうかを判断する（Ｓ８１０）。そのような新オブジェクトが無ければ（Ｓ８１０：ＮＯ）、選択部６１０は、図８の処理を終了する。一方、そのような新オブジェクトがある場合に（Ｓ８１０：ＹＥＳ）、選択部６１０は、その新オブジェクトが不変オブジェクトかどうかを判断する（Ｓ８２０）。
【００８２】
その新オブジェクトが不変オブジェクトの場合に（Ｓ８２０：ＹＥＳ）、選択部６１０は、その新オブジェクトを、重複を解消する候補のオブジェクトとして選択する（Ｓ８３０）。次に、検索部６２０は、選択したその新オブジェクトと内容が等しい旧オブジェクトをＲＡＭ１０２０から検索する（Ｓ８４０）。
【００８３】
ここで、内容が等しいとは、オブジェクトのデータ構造の一致を必ずしも意味しない。例えば、図２に例示した文字列オブジェクトのように、ボディ部２５の中の有効部分をヘッダ部２２により特定する場合においては、その有効部分が等しければ、その他の部分が異なっていても、内容が等しいものとみなす。
【００８４】
新オブジェクトと内容が等しい旧オブジェクトが検索されたことを条件に（Ｓ８５０：ＹＥＳ）、統合部６４０は、選択部６１０により選択されたその新オブジェクトに対する参照を、検索部６２０により検索されたその旧オブジェクトに対する参照に統合する（Ｓ８６０）。一方、新オブジェクトと内容が等しい旧オブジェクトが検索されなかったことを条件に（Ｓ８５０：ＮＯ）、格納部６３０は、選択部６１０により選択されたその新オブジェクトを、新たな旧オブジェクトとしてＲＡＭ１０２０に格納する。
【００８５】
新オブジェクトと新たな旧オブジェクトとで格納されるアドレスが異なる場合には、統合部６４０は、選択部６１０により選択されたその新オブジェクトに対する参照を、当該旧オブジェクトに対する参照に変更する（Ｓ８８０）。これにより、その新オブジェクトを参照していたオブジェクトを利用した処理を、その後も適切に継続させることができる。
【００８６】
図９は、本実施形態に係る実行システム４０を実現するプログラムコードの一例を示す。（ａ）に、比較のため、ガーベジ・コレクタを実現するプログラムコードの断片を示す。このプログラムコードは、文字列オブジェクトの重複を解消する機能は有しない。一方、（ｂ）に、ガーベジ・コレクションに同期して文字列オブジェクトの重複を解消する機能を実現するプログラムコードの断片を示す。
【００８７】
何れのプログラム断片も、あるオブジェクトを殿堂入りさせると判断した場合に、そのオブジェクトを新世代領域から旧世代領域にコピーする関数（ＣｏｐｙＴｏＴｅｎｕｒｅｄＳｐａｃｅ）を示す。（ａ）の１行目に示すように、まず、殿堂入りするオブジェクトのポインタが引数として関数に与えられる。
【００８８】
そして、２行目に示すように、そのオブジェクトのデータサイズが変数ｓｉｚｅに代入される。そして、３行目に示すように、そのデータサイズの記憶領域が旧世代領域（ここではＴｅｎｕｒｅｄＳｐａｃｅ）に確保される。その記憶領域へのポインタは変数ｎｅｗｏｂｊに代入される。
【００８９】
そして、４行目に示すように、殿堂入りさせようとするオブジェクトが、新たに旧世代領域に確保された記憶領域にコピーされる。これに応じ、５行目に示すように、殿堂入りさせようとするオブジェクトに対する参照が、新たに旧世代領域に確保されたその記憶領域に対する参照に変更される。
【００９０】
本実施形態に係る重複文字列の解消の機能は、（ａ）に示す関数に、ほんの僅かな変更を加えることで実現される。具体的には、（ａ）と比較して（ｂ）には３−５行目および９行目が追加されている。なお、厳密には、（ａ）の３行目と（ｂ）の７行目は異なるが、これは、ｃｈａｒ型のデータへのポインタを示す変数ｎｅｗｏｂｊが定義される位置が異なるためで、実質的な処理内容は同じである。
【００９１】
２行目は、ｃｈａｒ型のデータへのポインタを示す変数ｎｅｗｏｂｊを定義する。３行目は、殿堂入りさせようとするオブジェクトのクラスが不変文字列クラス（例えばＪａｖａ言語におけるＳｔｒｉｎｇＣｌａｓｓ）であるかどうかを判断するコードを示す。これは、上記の選択部６１０の一部機能に相当する。
【００９２】
４行目のコードは、検索部６２０および格納部６３０の機能に相当する。即ち、４行目のコードは、殿堂入りさせようとするオブジェクトと内容の等しい旧オブジェクトを、ハッシュテーブル３２５を利用して旧世代領域３１０から検索する処理、検索されたならばその旧オブジェクトへのポインタを変数ｎｅｗｏｂｊに代入する処理、および、検索されなかったならば、殿堂入りさせようとするそのオブジェクトを旧世代領域にコピー（殿堂入り）し、コピーしたオブジェクトを新たにハッシュテーブル３２５に登録する処理、を示す。
【００９３】
ここで用いられる「ｉｎｔｅｒｎ」というメソッドは、予め準備された、文字列をハッシュテーブルから検索して、検索されなければ新たに登録するという処理を実現するためのメソッドである。このメソッドをこのタイミングで呼び出すことで、文字列重複の解消というある程度の時間を要する処理を、適度なタイミングで行わせることができる。このメソッドは、Ｊａｖａ言語の内部処理で用いるために予め準備されたものであってよいし、このような処理を行うために独自に開発されたものであってもよい。
【００９４】
５−９行目のコードは、上記（ａ）の２−４行目と同様である。即ち、不変文字列以外のオブジェクトについては、通常の殿堂入りに対応した処理が行われる。
以上、図９に関連して説明したように、本実施形態の諸機能は、例えば、既存のガーベジ・コレクションに対する僅かな改変で実現することができる。このため、プログラム開発や保守の手間は極めて小さく、更には、同様のガーベジ・コレクタを有する実行システムに広く適用することができる。
【００９５】
以上、図１から図９において説明したように、本実施形態によれば、ガーベジ・コレクタと同期した適度な頻度で、これまである程度の期間参照され続けており今後も参照され続けることが見込まれるオブジェクトについてのみ、重複を排除する処理を行う。これにより、記憶領域の節約および処理オーバヘッドの低減をバランスして、全体としてユーザ・プログラムを効率的に実行することができる。
【００９６】
続いて、文字列の重複を解消する他の例を、図１０において変形例として説明する。本例においては、オブジェクトのボディ部２５のみを統合し、ヘッダ部２２は統合しない。これにより、ヒープ領域２０の占有容量をある程度節約できると共に、別々のオブジェクトは別々のヘッダ部２２を有することがユーザ・プログラム５０の言語使用上厳格に要求される場合であっても、ユーザ・プログラム５０を正常動作させることができる。
【００９７】
図１０は、本実施形態の変形例に係る実行システム４０について、制御プログラム群６００に関する機能の構成を示す。本変形例においても、ＣＰＵ１０００は、制御プログラム群６００を読み込んで実行することで、選択部６１０と、検索部６２０と、格納部６３０と、統合部６４０として機能する。この変形例は、統合部６４０により参照が統合される部分の処理が、図６の例とは異なるので、以下、相違点を中心に説明する。
【００９８】
まず、図６の例と同様に、ガーベジ・コレクションの前の第１領域３０５を第１領域３０５Ｃに示す。その中で、文字列「ａａａ」を内容とするオブジェクト（即ち、ヘッダ部２２−１およびボディ部２５−１）と、文字列「ｂｂｂ」を内容とするオブジェクト（即ち、ヘッダ部２２−２およびボディ部２５−２）とが、殿堂入りされると判断される。選択部６１０は、これらのオブジェクトを選択する。
【００９９】
次に、検索部６２０は、選択されたこれらのオブジェクトのそれぞれについて、当該オブジェクトと内容が等しい旧オブジェクトを旧世代領域３１０から検索する。この検索にはハッシュテーブル３２５が用いられる。その結果、文字列「ａａａ」を内容とする旧オブジェクト（即ちヘッダ部２２−４およびボディ部２５−４）が検索される。一方、文字列「ｂｂｂ」を内容とする旧オブジェクトは検索されない。
【０１００】
従って、格納部６３０は、文字列「ｂｂｂ」を内容とする新オブジェクト（即ちヘッダ部２２−２およびボディ部２５−２）を、新たな旧オブジェクトとして、旧世代領域３１０Ｅに格納する。ここまでの処理は、図６の例と略同一である。一方、統合部６４０により参照が統合される部分の処理は、図６の例と異なる。
【０１０１】
本例において、統合部６４０は、オブジェクトのヘッダ部を除くボディ部のみを統合する。具体的には、統合部６４０は、ある新オブジェクトと内容が等しい旧オブジェクトが検索されたことに応じて、当該新オブジェクトのヘッダ部から当該新オブジェクトのボディ部に対する参照を、当該新オブジェクトのヘッダ部から当該旧オブジェクトのボディ部に対する参照に統合する。
【０１０２】
図１０の例において、文字列「ａａａ」を内容とする新オブジェクト（ヘッダ部２２−１およびボディ部２５−１）と内容が等しい旧オブジェクト（ヘッダ部２２−４およびボディ部２５−４）が検索されている。従って、統合部６４０は、この新オブジェクトのヘッダ部２２−１からボディ部２５−１に対する参照を、この新オブジェクトのヘッダ部２２−１からこの旧オブジェクトのボディ部２５−４に対する参照に統合する。その結果、参照されなくなったボディ部２５−１の記憶域は、ガーベジ・コレクタによって解放される。
【０１０３】
以上、本変形例によっても、相互に内容が等しいオブジェクトのボディ部を統合することで、オブジェクトを記憶するための必要容量を節約できる。更に、本変形例によれば、別々のオブジェクトは別々のヘッダ部を有することを前提としたプログラムを正しく動作させることができる。
【０１０４】
一例として、Ｊａｖａ（登録商標）などのプログラム言語では、ｓｙｎｃｈｒｏｎｉｚｅｄ  ｍｅｔｈｏｄ（シンクロナイズド・メソッド）により、様々なオブジェクトを排他資源として設定して、スレッド間の排他処理を実現することができる。例えば複数の不変文字列オブジェクトを独立した排他資源に設定した場合においては、複数のスレッドのそれぞれがこれらのオブジェクトのそれぞれを排他資源として独立して獲得し、動作することもできる。この場合には、これらのスレッド間では排他制御は行われない。
【０１０５】
しかしながら、もしこれらのオブジェクトのヘッダ部を本実施形態のように統合したならば、本来別々の排他資源であるべき複数のオブジェクトが同一の排他資源を表すこととなる。従って、この場合にはスレッド間で予期しない排他制御が行われ、デッドロックが生じるおそれがある。これに対し、本変形例によれば、このような予期しない排他制御の発生を防ぎ、ユーザ・プログラムを正しく動作させることができる。
【０１０６】
なお、このように不変文字列オブジェクトを排他資源として設定することは、極めて稀であるから、多くの場合には図１から図９に示す実施形態により、ヘッダ部を含めてオブジェクトを統合することが有効である。
【０１０７】
図１１は、本実施形態に係るコンピュータ１０のハードウェア構成の一例を示す。コンピュータ１０は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、及びグラフィックコントローラ１０７５を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【０１０８】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【０１０９】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ１０４０は、コンピュータ１０が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からプログラム又はデータを読み取り、ＲＡＭ１０２０又はハードディスクドライブ１０４０に提供する。
【０１１０】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、コンピュータ１０の起動時にＣＰＵ１０００が実行するブートプログラムや、コンピュータ１０のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からプログラム又はデータを読み取り、入出力チップ１０７０を介してＲＡＭ１０２０またはハードディスクドライブ１０４０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【０１１１】
コンピュータ１０に提供されるプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ１０７０及び/又は入出力コントローラ１０８４を介して、記録媒体から読み出されコンピュータ１０にインストールされて実行される。プログラムがコンピュータ１０等に働きかけて行わせる動作は、図１から図１０において説明したコンピュータ１０における動作と同一であるから、説明を省略する。
【０１１２】
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ１０に提供してもよい。
【０１１３】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることのできることが当業者にとって明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【０１１４】
【図１】図１は、本実施形態に係るコンピュータ１０の全体構成を示す。
【図２】図２は、本実施形態に係るヒープ領域２０に記憶されるオブジェクトの一例を示す。
【図３】図３は、本実施形態に係る実行システム４０およびヒープ領域２０の構成の具体例を示す。
【図４】図４は、本実施形態に係る実行システム４０の構成のうち文字列クラス・ライブラリ４００に関する機能の構成を示す。
【図５】図５は、本実施形態に係る実行システム４０の構成のうちシステムクラス・ライブラリ５００に関する機能の構成を示す。
【図６】図６は、本実施形態に係る実行システム４０の構成のうち制御プログラム群６００に関する機能の構成を示す。
【図７】図７は、本実施形態に係る実行システム４０によりオブジェクトが操作される処理の流れを示す。
【図８】図８は、本実施形態に係る実行システム４０によりオブジェクトが統合される処理の流れを示す。
【図９】図９は、本実施形態に係る実行システム４０を実現するプログラムコードの一例を示す。
【図１０】図１０は、本実施形態の変形例に係る実行システム４０について、制御プログラム群６００に関する機能の構成を示す。
【図１１】図１１は、本実施形態に係るコンピュータ１０のハードウェア構成の一例を示す。
【符号の説明】
【０１１５】
１０  コンピュータ
２０  ヒープ領域
２２  ヘッダ部
２５  ボディ部
２６  オブジェクト
２７  オブジェクト
２８  オブジェクト
３０  コード領域
４０  実行システム
５０  ユーザ・プログラム
３００  新世代領域
３０５  第１領域
３０７  第２領域
３１０  旧世代領域
３２０  制御用領域
３２５  ハッシュテーブル
４００  文字列クラス・ライブラリ
４１０  生成部
４３０  参照部
５００  システムクラス・ライブラリ
５１０  ガーベジ・コレクタ部
６１０  選択部
６２０  検索部
６３０  格納部
６４０  統合部
６００  制御プログラム群
１０００  ＣＰＵ
１０２０  ＲＡＭ
【図１】
0005044816.tif 000002
【図２】
0005044816.tif 000003
【図３】
0005044816.tif 000004
【図４】
0005044816.tif 000005
【図５】
0005044816.tif 000006
【図６】
0005044816.tif 000007
【図７】
0005044816.tif 000008
【図８】
0005044816.tif 000009
【図９】
0005044816.tif 000010
【図１０】
0005044816.tif 000011
【図１１】
0005044816.tif 000012