(57)【要約】【課題】長い期間アクセスされないオブジェクトの存在により、ガベージコレクション（ＧＣ）プロセスの動作があってもアクセス速度の低下がないようにする。【解決手段】コンピュータでガベージコレクションが動作する際、仮想メモリ空間に存在し、予め規定された長い期間アクセスされないオブジェクトを隔離するため、予め規定された長い期間アクセスされないオブジェクト１２を非アクセスオブジェクトとして検出する第１のステップと、非アクセスオブジェクトを検出した後所定の期間が経過すると新たに確保した仮想メモリ領域に前記非アクセスオブジェクトを移動する第２のステップと、新たに確保した仮想メモリ領域に移動した後さらに所定の期間が経過すると当該新たに確保した仮想メモリ領域をアクセス不可領域１５としてガベージコレクションが当該アクセス不可領域にアクセスしないようにする第３のステップとを実行する。【選択図】図１
2010015223.tif 000002
【特許請求の範囲】
【請求項１】
仮想メモリ領域に存在し、規定の期間アクセスされないオブジェクトを隔離するための方法であって、ガベージコレクションが動作するコンピュータによって実行され、
前記規定の期間アクセスされないオブジェクトを非アクセスオブジェクトとして検出する第１のステップと、
前記非アクセスオブジェクトを検出した後、所定の期間が経過すると新たに確保した仮想メモリ領域に前記非アクセスオブジェクトを移動する第２のステップと、
前記新たに確保した仮想メモリ領域に移動した後さらに所定の期間が経過すると当該新たに確保した仮想メモリ領域をアクセス不可領域として前記ガベージコレクションが当該アクセス不可領域にアクセスしないようにする第３のステップとを有することを特徴とするオブジェクト隔離方法。
【請求項２】
前記第１のステップでは、前記規定の期間内にアクセスされたとみなされる前記オブジェクトに関してアクセスフラグを立て、前記アクセスされないオブジェクトと区別することによって検出を行うことを特徴とする請求項１記載のオブジェクト隔離方法。
【請求項３】
前記第１のステップは、物理メモリの使用量を削減する必要が生じた際に開始されることを特徴とする請求項２記載のオブジェクト隔離方法。
【請求項４】
前記第１のステップでは、ロード・ストア命令の度にその対象となるオブジェクトにアクセスフラグを立てることを特徴とする請求項２記載のオブジェクト隔離方法。
【請求項５】
前記第１のステップでは、キャッシュミスをおこしたオブジェクト、一定時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト、ガベージコレクションが起動した際にレジスタもしくはスタックから直接指されていたオブジェクト、新たに生成されたオブジェクト、世代別ガベージコレクションを用いている場合に新世代領域にあるオブジェクト、世代別ガベージコレクションを用いている場合に旧世代領域にあるが新世代領域を直接指しているオブジェクトのうち少なくとも１つが発生すると、オブジェクトへのアクセスがあったとすることを特徴とする請求項２記載のオブジェクト隔離方法。
【請求項６】
前記第２のステップでは、前記新たに確保した仮想メモリ領域を準アクセス不可領域とし、前記アクセスされないオブジェクトを準アクセス不可領域に移した後、不要となった物理メモリを解放することを特徴とする請求項１記載のオブジェクト隔離方法。
【請求項７】
前記第３のステップでは、さらに所定の期間が経過する間に、前記準アクセス不可領域にあるオブジェクトに対して、ユーザプログラムからのアクセスがないと、前記準アクセス不可領域をアクセス不可領域とし、前記ユーザプログラムからのアクセスがあると、当該アクセスの対象となったオブジェクトを準アクセス不可領域の外に戻すことを特徴とする請求項６記載のオブジェクト隔離方法。
【請求項８】
前記第３のステップでは、前記アクセス不可領域の内容を物理メモリ以外のメモリに保存することを特徴とする請求項７記載のオブジェクト隔離方法。
【請求項９】
前記第３のステップでは、前記アクセス不可領域から外を指すポインタの分身をガベージコレクションのルート集合に追加して、前記ガベージコレクションによって前記アクセス不可領域に対するアクセスが行われないようにすることを特徴とする請求項７記載のオブジェクト隔離方法。
【請求項１０】
前記第３のステップでは、前記ガベージコレクションのアルゴリズムを変更して前記アクセス不可領域に対するアクセスが行われないようにすることを特徴とする請求項７記載のオブジェクト隔離方法。
【請求項１１】
ガベージコレクションが動作するコンピュータによって実行され、仮想メモリ領域に存在し規定の期間アクセスされないオブジェクトを隔離するためのプログラムであって、
前記規定の期間アクセスされないオブジェクトを非アクセスオブジェクトとして検出する第１の命令と、
前記非アクセスオブジェクトを検出した後、所定の期間が経過すると新たに確保した仮想メモリ領域に前記非アクセスオブジェクトを移動する第２の命令と、
前記新たに確保した仮想メモリ領域に移動した後さらに所定の期間が経過すると当該新たに確保した仮想メモリ領域をアクセス不可領域として前記ガベージコレクションが当該アクセス不可領域にアクセスしないようにする第３の命令とを有することを特徴とするオブジェクト隔離プログラム。
【請求項１２】
前記第１の命令では、前記規定の期間内にアクセスされたとみなされる前記オブジェクトに関してアクセスフラグを立て、前記アクセスされないオブジェクトと区別することによって検出を行うことを特徴とする請求項１１記載のオブジェクト隔離プログラム。
【請求項１３】
前記第１の命令は、物理メモリの使用量を削減する必要が生じた際に開始されることを特徴とする請求項１２記載のオブジェクト隔離プログラム。
【請求項１４】
前記第１の命令では、ロード・ストア命令の度にその対象となるオブジェクトにアクセスフラグを立てることを特徴とする請求項１２記載のオブジェクト隔離プログラム。
【請求項１５】
前記第１の命令では、キャッシュミスをおこしたオブジェクト、一定時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト、ガベージコレクションが起動した際にレジスタもしくはスタックから直接指されていたオブジェクト、新たに生成されたオブジェクト、世代別ガベージコレクションを用いている場合に新世代領域にあるオブジェクト、世代別ガベージコレクションを用いている場合に旧世代領域にあるが新世代領域を直接指しているオブジェクトのうち少なくとも１つが発生すると、オブジェクトへのアクセスがあったとすることを特徴とする請求項１２記載のオブジェクト隔離プログラム。
【請求項１６】
前記第２の命令では、前記新たに確保した仮想メモリ領域を準アクセス不可領域とし、前記アクセスされないオブジェクトを準アクセス不可領域に移した後、不要となった物理メモリを解放することを特徴とする請求項１１記載のオブジェクト隔離プログラム。
【請求項１７】
前記第３の命令では、さらに所定の期間が経過する間に、前記準アクセス不可領域にあるオブジェクトに対して、ユーザプログラムからのアクセスがないと、前記準アクセス不可領域をアクセス不可領域とし、前記ユーザプログラムからのアクセスがあると、当該アクセスの対象となったオブジェクトを準アクセス不可領域の外に戻すことを特徴とする請求項１６記載のオブジェクト隔離プログラム。
【請求項１８】
前記第３の命令では、前記アクセス不可領域の内容を物理メモリ以外のメモリに保存することを特徴とする請求項１７記載のオブジェクト隔離プログラム。
【請求項１９】
前記第３の命令では、前記アクセス不可領域から外を指すポインタの分身をガベージコレクションのルート集合に追加して、前記ガベージコレクションによって前記アクセス不可領域に対するアクセスが行われないようにすることを特徴とする請求項１７記載のオブジェクト隔離プログラム。
【請求項２０】
前記第３の命令では、前記ガベージコレクションのアルゴリズムを変更して前記アクセス不可領域に対するアクセスが行われないようにすることを特徴とする請求項１７記載のオブジェクト隔離プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ領域に存在し所定の期間アクセスされないオブジェクトを隔離してメモリ領域を有効に使用するための方法に関し、特に、ヒープメモリ中に存在するオブジェクトを隔離するための方法に関する。
【背景技術】
【０００２】
一般に、パソコンなどのコンピュータにおいて、プロセスの仮想メモリ空間を全て物理メモリ上に保持しておくと、多くのメモリモジュールを必要としてしまい、経済的、エネルギー的に極めて非効率である。このため、有効なデータを保持しているが、長い期間アクセスされない仮想メモリページは、例えば、ディスクへスワップアウトするか、又は低速であるがエネルギー効率のよいメモリへマップすることが望ましい（以下「有効なデータを保持している」ことを「生きている」という）。
【０００３】
Ｊａｖａ（登録商標）などのプロセスでは、多数のオブジェクトはそのサイズがページサイズより小さく、従って、ヒープメモリ中の同一のページ内に生きているが長い期間アクセスされないオブジェクトと、それ以外のオブジェクトが混在することになる。
【０００４】
図１３は、仮想メモリページ中にオブジェクトが混在する様子を示す図である。図１３において、Ｘ印の付いているオブジェクト１１はアクセスされ、Ｘ印の付いていないオブジェクト１２は長い期間アクセスされないものである。図示のように、全ての仮想メモリページ１３中において、アクセスされるオブジェクト（アクセスオブジェクト）１１は、少なくとも１つは存在する関係上、これら仮想メモリページ１３をスワップアウトしたり、低速なメモリ（図示せず）にマップしたりすることは好ましくない。
【０００５】
さらに、Ｊａｖａ（登録商標）などのプロセスでは、所謂ガベージコレクション（Ｇａｒｂａｇｅ  Ｃｏｌｌｅｃｔｉｏｎ：ＧＣ（ゴミ集め））プロセスが数秒〜数分おきに、全ての生きているオブジェクトにアクセスする（このＧＣプロセスとは、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能である）。従って、たとえ、ユーザプログラムから長い間アクセスされないオブジェクト（非アクセスオブジェクト）があったとしても、当該非アクセスオブジェクトをスワップアウトしたり、低速なメモリにマップしたりすることは好ましくない。
【０００６】
よって、Ｊａｖａ（登録商標）などのプロセスにおいて、物理メモリ使用量を削減する際には、ユーザプログラムから長い間アクセスされないオブジェクトを、それ以外のオブジェクトから隔離して別の仮想メモリページに配置することが望ましい。
【０００７】
この際、高確率で長い期間アクセスされないオブジェクトを選ばないと、ディスクなどにスワップアウトされるか又は低速なメモリにマップされた仮想メモリページにユーザプログラムがアクセスすることになってしまい、アクセス速度が大幅に低下してしまうことになる。
【０００８】
加えて、Ｊａｖａ（登録商標）などのプロセスでは、ＧＣプロセスが動作するから、オブジェクトを隔離した際には、当該隔離されたオブジェクトに対するＧＣプロセスのアクセスを不要とする必要がある。
【０００９】
ところで、最近アクセスしたオブジェクトを監視して再配置する手法として、特許文献１に記載のものが知られており、ここでは、最近アクセスされたオブジェクトの集合を検出して、同一の仮想メモリページに配置することによってデータ局所性を高めている。そして、特許文献１に記載の手法では、頻繁にアクセスされるオブジェクトとそれ以外のオブジェクトを隔離することになる。
【００１０】
一方、非特許文献１には、メモリリークするプログラムを対象にして、生きているが長い間アクセスされないオブジェクトを仮想メモリ空間中で隔離して、ディスクへスワップアウトする手法が提案されている。
【００１１】
この手法ではＧＣプロセスの際に、全てのオブジェクトのヘッダ中の１ビットと全てのオブジェクト中のポインタの下位１ビットに１をセットし、ユーザプログラム中の全てのオブジェクトアクセスの直前にバリアコードを挿入して、ポインタとヘッダのビットを０にすることによってＧＣとＧＣの間にアクセスされないオブジェクトを検出するようにしている。
【特許文献１】特開２００６−９２５３２号公報
【非特許文献１】Ｍ．  Ｄ．  Ｂｏｎｄ  ａｎｄ  Ｋ．  Ｓ．  ＭｃＫｉｎｌｅｙ．  Ｔｏｌｅｒａｔｉｎｇ  ｍｅｍｏｒｙ  ｌｅａｋｓ．  ＵＴ  Ａｕｓｔｉｎ  Ｔｅｃｈｎｉｃａｌ  Ｒｅｐｏｒｔ  ＴＲ−０７−６４，  ２００７．
【発明の開示】
【発明が解決しようとする課題】
【００１２】
ところが、特許文献１に記載の手法においては、長い間アクセスされないオブジェクトを物理メモリから追い出す（隔離する）ことは行わず、単に再配置しているだけであるから、結果的に、ＧＣプロセスが全ての生きているオブジェクトをアクセスしてしまうことになって、アクセス速度の高速化は図れないという課題がある。
【００１３】
また、特許文献１に記載の手法では、頻繁にはアクセスされないオブジェクトの中から高確率で長い間アクセスされないオブジェクトを選び出すことも行っていないため、物理メモリ使用量を効果的に削減することは困難であるという課題もある。
【００１４】
一方、非特許文献１に記載の手法においては、バリアコードのオーバーヘッドに起因して、プログラムの実行速度が平均９％程度低下してしまい、特に、ユーザプログラム中にバリアコードが必要なために、物理メモリ量が足りなくなってきた場合にのみ、長い期間アクセスされないオブジェクトを検出するための検出機構を発動するという柔軟な対応を行うことは極めて困難であるという課題がある。
【００１５】
本発明の目的は、ＧＣプロセスの動作があってもアクセス速度が低下することのないオブジェクト隔離方法を提供することにある。
【００１６】
本発明の他の目的は、物理メモリ使用量を効果的に削減することのできるオブジェクト隔離方法を提供することにある。
【００１７】
本発明のさらに他の目的は、物理メモリ量の使用量に応じて規定の期間（メモリの確保がある定められた閾値よりも長い期間）アクセスされないオブジェクトを検出して隔離を行うことのできるオブジェクト隔離方法を提供することにある。
【課題を解決するための手段】
【００１８】
本発明は、上記課題に鑑み、以下のような解決手段を提供する。
【００１９】
（１）本発明は、仮想メモリ領域に存在し、規定の期間アクセスされないオブジェクトを隔離するための方法であって、ガベージコレクションが動作するコンピュータによって実行され、前記規定の長い期間アクセスされないオブジェクトを非アクセスオブジェクトとして検出する第１のステップと、前記非アクセスオブジェクトを検出した後、所定の期間が経過すると新たに確保した仮想メモリ領域に前記非アクセスオブジェクトを移動する第２のステップと、前記新たに確保した仮想メモリ領域に移動した後、さらに所定の期間が経過すると当該新たに確保した仮想メモリ領域をアクセス不可領域として前記ガベージコレクションが当該アクセス不可領域にアクセスしないようにする第３のステップとを有することを特徴とするものである。
【００２０】
（１）に記載の方法では、非アクセスオブジェクトを検出した後、所定の期間が経過すると新たに確保した仮想メモリ領域に前記非アクセスオブジェクトを移動し、さらに所定の期間が経過すると当該新たに確保した仮想メモリ領域をアクセス不可領域としてガベージコレクションが当該アクセス不可領域にアクセスしないようにしたので、ガベージコレクションが動作してもアクセス速度が低下することがない。
【００２１】
（２）本発明は、（１）に記載の方法において、前記第１のステップでは、前記規定の期間内にアクセスされたとみなされる前記オブジェクトに関してアクセスフラグを立て、前記アクセスされないオブジェクトと区別することによって検出を行うことを特徴とするものである。
【００２２】
（２）に記載の方法では、アクセスフラグを用いてアクセスされないオブジェクトと区別するようにしたので、容易にオブジェクトの区別を行うことができる。
【００２３】
（３）本発明は、（２）に記載の方法において、前記第１のステップは、物理メモリの使用量を削減する必要が生じた際に開始されることを特徴とするものである。
【００２４】
（３）に記載の方法では、第１のステップを、物理メモリの使用量を削減する必要が生じた際に開始するようにしたので、必要に応じて効果的に物理メモリ使用量を削減することができる。
【００２５】
（４）本発明は、（２）に記載の方法において、前記第１のステップでは、ロード・ストア命令の度にその対象となるオブジェクトにアクセスフラグを立てることを特徴とするものである。
【００２６】
（４）に記載の方法では、ロード・ストア命令の度にその対象となるオブジェクトにアクセスフラグを立てるようにしたので、頻繁にはアクセスされないオブジェクトの中から高確率で規定の長い間アクセスされないオブジェクトを選び出すことができる。
【００２７】
（５）本発明は、（２）に記載の方法において、前記第１のステップでは、キャッシュミスをおこしたオブジェクト、一定時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト、ガベージコレクションが起動した際にレジスタもしくはスタックから直接指されていたオブジェクト、新たに生成されたオブジェクト、世代別ガベージコレクションを用いている場合に新世代領域にあるオブジェクト、世代別ガベージコレクションを用いている場合に旧世代領域にあるが新世代領域を直接指しているオブジェクトのうち少なくとも１つが発生すると、オブジェクトへのアクセスがあったとすることを特徴とするものである。
【００２８】
（５）に記載の方法では、キャッシュミスをおこしたオブジェクト、一定時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト、ガベージコレクションが起動した際にレジスタもしくはスタックから直接指されていたオブジェクト、新たに生成されたオブジェクト、世代別ガベージコレクションを用いている場合に新世代領域にあるオブジェクト、世代別ガベージコレクションを用いている場合に旧世代領域にあるが新世代領域を直接指しているオブジェクトのうち少なくとも１つが発生すると、オブジェクトへのアクセスがあったとするので、頻繁にはアクセスされないオブジェクトの中から高確率で長い間アクセスされないオブジェクトを選び出すことができる。
【００２９】
（６）本発明は、（１）に記載の方法において、前記第２のステップでは、前記新たに確保した仮想メモリ領域を準アクセス不可領域とし、前記アクセスされないオブジェクトを準アクセス不可領域に移した後、不要となった物理メモリを解放することを特徴とするものである。
【００３０】
（６）に記載の方法では、新たに確保した仮想メモリ領域を準アクセス不可領域とし、アクセスされないオブジェクトを準アクセス不可領域に移した後、不要となった物理メモリを解放するようにしたので、プログラムの実行に必要な物理メモリ量を削減することができる。
【００３１】
（７）本発明は、（６）に記載の方法において、前記第３のステップでは、さらに所定の期間が経過する間に、前記準アクセス不可領域にあるオブジェクトに対して、ユーザプログラムからのアクセスがないと、前記準アクセス不可領域をアクセス不可領域とし、前記ユーザプログラムからのアクセスがあると、当該アクセスの対象となったオブジェクトを準アクセス不可領域の外に戻すことを特徴とするものである。
【００３２】
（７）に記載の方法では、準アクセス不可領域をアクセス不可領域とし、ユーザプログラムからのアクセスがあると、当該アクセスの対象となったオブジェクトを準アクセス不可領域の外に戻すようにしたので、ユーザプログラムによる処理に不都合が生じることがない。
【００３３】
（８）本発明は、（７）に記載の方法において、前記第３のステップでは、前記アクセス不可領域の内容を物理メモリ以外のメモリに保存することを特徴とするものである。
【００３４】
（８）に記載の方法では、アクセス不可領域の内容を物理メモリ以外のメモリに保存するようにしたので、物理メモリの使用量を効果的に削減することができる。
【００３５】
（９）本発明は、（７）に記載の方法において、前記第３のステップでは、前記アクセス不可領域から外を指すポインタの分身をガベージコレクションのルート集合に追加して、前記ガベージコレクションによって前記アクセス不可領域に対するアクセスが行われないようにすることを特徴とするものである。
【００３６】
（９）に記載の方法では、アクセス不可領域から外を指すポインタの分身をガベージコレクションのルート集合に追加するようにしたので、ガベージコレクションがアクセス不可領域をアクセスすることを確実に防止できる。
【００３７】
（１０）本発明は、（７）に記載の方法において、前記第３のステップでは、前記ガベージコレクションのアルゴリズムを変更して前記アクセス不可領域に対するアクセスが行われないようにすることを特徴とするものである。
【００３８】
（１０）に記載の方法では、ガベージコレクションのアルゴリズムを変更して、アクセス不可領域に対するアクセスが行われないようにしたので、ガベージコレクションがアクセス不可領域をアクセスすることを確実に防止できる。
【００３９】
（１１）本発明は、ガベージコレクションが動作するコンピュータによって実行され、仮想メモリ領域に存在し規定の期間アクセスされないオブジェクトを隔離するためのプログラムであって、前記規定の期間アクセスされないオブジェクトを非アクセスオブジェクトとして検出する第１の命令と、前記非アクセスオブジェクトを検出した後、所定の期間が経過すると新たに確保した仮想メモリ領域に前記非アクセスオブジェクトを移動する第２の命令と、前記新たに確保した仮想メモリ領域に移動した後さらに所定の期間が経過すると当該新たに確保した仮想メモリ領域をアクセス不可領域として前記ガベージコレクションが当該アクセス不可領域にアクセスしないようにする第３の命令とを有することを特徴とするものである。
【００４０】
（１１）に記載のプログラムでは、非アクセスオブジェクトを検出した後、所定の期間が経過すると新たに確保した仮想メモリ領域に前記非アクセスオブジェクトを移動し、さらに所定の期間が経過すると当該新たに確保した仮想メモリ領域をアクセス不可領域としてガベージコレクションが当該アクセス不可領域にアクセスしないようにしたので、ガベージコレクションが動作してもアクセス速度が低下することがない。
【００４１】
（１２）本発明は、（１１）に記載のプログラムにおいて、前記第１の命令では、前記規定の期間内にアクセスされたとみなされる前記オブジェクトに関してアクセスフラグを立て、前記アクセスされないオブジェクトと区別することによって検出を行うことを特徴とするものである。
【００４２】
（１２）に記載のプログラムでは、アクセスフラグを用いてアクセスされないオブジェクトと区別するようにしたので、容易にオブジェクトの区別を行うことができる。
【００４３】
（１３）本発明は、（１２）に記載のプログラムにおいて、前記第１の命令は、物理メモリの使用量を削減する必要が生じた際に開始されることを特徴とするものである。
【００４４】
（１３）に記載のプログラムでは、第１の命令を、物理メモリの使用量を削減する必要が生じた際に開始するようにしたので、必要に応じて効果的に物理メモリ使用量を削減することができる。
【００４５】
（１４）本発明は、（１２）に記載のプログラムにおいて、前記第１の命令では、ロード・ストア命令の度にその対象となるオブジェクトにアクセスフラグを立てるようにしたことを特徴とするものである。
【００４６】
（１４）に記載のプログラムでは、ロード・ストア命令の度にその対象となるオブジェクトにアクセスフラグを立てるようにしたので、頻繁にはアクセスされないオブジェクトの中から高確率で規定の長い間アクセスされないオブジェクトを選び出すことができる。
【００４７】
（１５）本発明は、（１２）に記載のプログラムにおいて、前記第１の命令では、キャッシュミスをおこしたオブジェクト、一定時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト、ガベージコレクションが起動した際にレジスタもしくはスタックから直接指されていたオブジェクト、新たに生成されたオブジェクト、世代別ガベージコレクションを用いている場合に新世代領域にあるオブジェクト、世代別ガベージコレクションを用いている場合に旧世代領域にあるが新世代領域を直接指しているオブジェクトのうち少なくとも１つが発生すると、オブジェクトへのアクセスがあったとすることを特徴とするものである。
【００４８】
（１５）に記載のプログラムでは、キャッシュミスをおこしたオブジェクト、一定時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト、ガベージコレクションが起動した際にレジスタもしくはスタックから直接指されていたオブジェクト、新たに生成されたオブジェクト、世代別ガベージコレクションを用いている場合に新世代領域にあるオブジェクト、世代別ガベージコレクションを用いている場合に旧世代領域にあるが新世代領域を直接指しているオブジェクトのうち少なくとも１つが発生すると、オブジェクトへのアクセスがあったとするので、頻繁にはアクセスされないオブジェクトの中から高確率で規定の長い間アクセスされないオブジェクトを選び出すことができる。
【００４９】
（１６）本発明は、（１１）に記載のプログラムにおいて、前記第２の命令では、前記新たに確保した仮想メモリ領域を準アクセス不可領域とし、前記アクセスされないオブジェクトを前記準アクセス不可領域に移した後、不要となった物理メモリを解放することを特徴とするものである。
【００５０】
（１６）に記載のプログラムでは、新たに確保した仮想メモリ領域を準アクセス不可領域とし、アクセスされないオブジェクトを準アクセス不可領域に移した後、不要となった物理メモリを解放するようにしたので、プログラムの実行に必要な物理メモリ量を削減することができる。
【００５１】
（１７）本発明は、（１６）に記載のプログラムにおいて、前記第３の命令では、さらに所定の期間が経過する間に、前記準アクセス不可領域にあるオブジェクトに対して、ユーザプログラムからのアクセスがないと、前記準アクセス不可領域をアクセス不可領域とし、前記ユーザプログラムからのアクセスがあると、当該アクセスの対象となったオブジェクトを準アクセス不可領域の外に戻すことを特徴とするものである。
【００５２】
（１７）に記載のプログラムでは、準アクセス不可領域をアクセス不可領域とし、ユーザプログラムからのアクセスがあると、当該アクセスの対象となったオブジェクトを準アクセス不可領域の外に戻すようにしたので、ユーザプログラムによる処理に不都合が生じることがない。
【００５３】
（１８）本発明は、（１７）に記載のプログラムにおいて、前記第３の命令では、前記アクセス不可領域の内容を物理メモリ以外のメモリに保存することを特徴とするものである。
【００５４】
（１８）に記載のプログラムでは、アクセス不可領域の内容を物理メモリ以外のメモリに保存するようにしたので、物理メモリの使用量を効果的に削減することができる。
【００５５】
（１９）本発明は、（１７）に記載のプログラムにおいて、前記第３の命令では、前記アクセス不可領域から外を指すポインタの分身をガベージコレクションのルート集合に追加して、前記ガベージコレクションによって前記アクセス不可領域に対するアクセスが行われないようにすることを特徴とするものである。
【００５６】
（１９）に記載のプログラムでは、アクセス不可領域から外を指すポインタの分身をガベージコレクションのルート集合に追加するようにしたので、ガベージコレクションがアクセス不可領域をアクセスすることを確実に防止できる。
【００５７】
（２０）本発明は、（１７）に記載のプログラムにおいて、前記第３の命令では、前記ガベージコレクションのアルゴリズムを変更して前記アクセス不可領域に対するアクセスが行われないようにすることを特徴とするものである。
【００５８】
（２０）に記載の方法では、ガベージコレクションのアルゴリズムを変更して、アクセス不可領域に対するアクセスが行われないようにしたので、ガベージコレクションがアクセス不可領域をアクセスすることを確実に防止できる。
【発明の効果】
【００５９】
以上のように、本発明によれば、ガベージコレクションが動作するコンピュータにおいて、仮想メモリ領域に存在し予め規定された長い期間アクセスされないオブジェクトについて、予め規定された長い期間アクセスされないオブジェクトを非アクセスオブジェクトとして検出し、この非アクセスオブジェクトを検出した後、所定の期間が経過すると新たに確保した仮想メモリ領域に非アクセスオブジェクトを移動して、新たに確保した仮想メモリ領域に移動した後、さらに所定の期間が経過すると当該新たに確保した仮想メモリ領域をアクセス不可領域としてガベージコレクションが当該アクセス不可領域にアクセスしないようにしているので、物理メモリ使用量を効果的に削減することができ、しかもオブジェクトを隔離した際、当該隔離されたオブジェクトに対するガベージコレクションのアクセスが不要となって、アクセス速度が低下することがない。そして、物理メモリ使用量を効果的に削減することができるばかりでなく、物理メモリ量の使用量に応じて長い期間アクセスされないオブジェクトを検出して隔離を行うことができる。
【発明を実施するための最良の形態】
【００６０】
以下、本発明の実施形態について図を参照しながら説明する。図１は、規定の長い期間アクセスされないオブジェクトを隔離した状態を示す図である。まず、コンピュータにおいて、物理メモリ使用量を削減する必要が生じると、オブジェクト隔離機能（図示せず）が動作し、所定の期間内にアクセスされたと見なされるオブジェクトに関してアクセスフラグを立てる。
【００６１】
例えば、ヒープメモリ（図示せず）への全てのロード・ストア命令の度に対象オブジェクトに対してアクセスフラグを立てても実行速度が大きく低下しないならば、これが最も正確な手法であるが、現実には実行速度が大きく低下するので、近似的な手法として以下のオブジェクトをアクセスされたと見なすことにする。
【００６２】
（１）キャッシュミスを起こしたオブジェクト、（２）所定時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト、（３）ＧＣプロセスが起動したときにレジスタもしくはスタックから直接指されていたオブジェクト、（４）新たに生成されたオブジェクト、（５）世代別ＧＣを用いている場合は新世代領域にあるオブジェクト、（６）世代別ＧＣを用いている場合は旧世代領域にあるが新世代領域を直接指しているオブジェクト（世代別ＧＣのライトセットに入っているオブジェクト）のうち少なくとも１つが発生すると、オブジェクト隔離機能は、オブジェクトへのアクセスがあったとする。これらの手法はユーザプログラム中のバリアコードを必要としないため、特定の期間だけ発動することが可能である。
【００６３】
所定の期間が経過した時点で、オブジェクト隔離機能は、アクセスフラグが立っていないオブジェクトを新たに確保した仮想メモリページに移動する。ここでは、この仮想メモリページを準アクセス不可領域と呼ぶ。期間が十分に長くない場合は、アクセスされるにもかかわらずフラグが立っていないオブジェクトが存在しうる。この場合は、フラグが立っているオブジェクトの間をつなぐオブジェクトにもフラグを立てて補間する。
【００６４】
準アクセス不可領域にはこの時点ではまだ物理メモリがマップされており、また同時に、フラグが立っているオブジェクトはより狭い領域に詰め込むことで不要になった物理メモリを解放することができる（図中破線で示す領域１４）。そして、オブジェクトのフラグはクリアする。
【００６５】
さらに、所定の期間経過する間に、オブジェクト隔離機能は、準アクセス不可領域にあるオブジェクトへのユーザプログラムのアクセスが無いことを確認する。ここでは、準アクセス不可領域全体をページ保護機構でアクセス不可にして（つまり、準アクセス不可領域を図中斜線のアクセス不可領域１５とする）、シグナルハンドラでアクセスを検出する。なお、ユーザプログラムからのアクセスがあったオブジェクトは準アクセス不可領域から追い出して通常のヒープメモリへ戻す。
【００６６】
前述のように、所定の期間が経過した時点で準アクセス不可領域をアクセス不可領域１５とする。アクセス不可領域１５は物理メモリにはマップされず、その内容は物理メモリ以外の場所に保存される。例えば、ディスクに書き出すか、低速だがエネルギー効率のよいメモリにマップすることができる。
【００６７】
ここで、ＧＣプロセスがアクセス不可領域１５にアクセスしなくても済むように、アクセス不可領域１５の中から外を指すポインタの分身１７をＧＣのルート集合に追加する。また、ＧＣアルゴリズムを変更してアクセス不可領域へのポインタはたどらないようにする。
【００６８】
続いて、上述した各機能について図面を参照して詳細に説明する。
【００６９】
前述したように、物理メモリ使用量を削減する必要が生じた場合に、オブジェクト隔離機能は、所定の期間内にアクセスされたと見なされるオブジェクトを検出してアクセスフラグを立てる。このアクセスフラグとして各オブジェクトのヘッダ中の１ビットを用いることができる。また、ヒープメモリとは別のメモリ領域にアクセスフラグビット用のテーブルを確保するようにしてもよい。
【００７０】
本実施の形態では、前述したように、（１）キャッシュミスを起こしたオブジェクト、（２）所定の時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト、（３）ＧＣプロセスが起動したときにレジスタもしくはスタックから直接指されていたオブジェクト、（４）新たに生成されたオブジェクト、（５）世代別ＧＣを用いている場合は新世代領域にあるオブジェクト、（６）世代別ＧＣを用いている場合は旧世代領域にあるが新世代領域を直接指しているオブジェクト（世代別ＧＣのライトセットに入っているオブジェクト）について、アクセスされたと見なしている。
【００７１】
（１）キャッシュミスを起こしたオブジェクト
【００７２】
キャッシュミスを起こしたオブジェクトはアクセスされたことは確実である。近年のプロセッサでは実行時プロファイルをとる機能の一部として、データキャッシュミスが起きた時に仮想メモリアドレスを記録することができる。また、指定した回数のキャッシュミスに一回だけプロファイリング関数に制御を移すことが可能である。
【００７３】
プロファイリング関数の中では、それまでに記録された全ての仮想メモリアドレスについてヒープメモリ中にあるかどうかを判定した上で、後述する手法を用いてその仮想メモリアドレスを含むオブジェクトを同定することができる。
【００７４】
この手法では全てのオブジェクトの先頭には仮想関数テーブルへのポインタがあることを利用して、取得した仮想メモリアドレスから低い方へメモリをスキャンして仮想関数テーブルへのポインタと見なすことができるワードを見つけることになる。
【００７５】
（２）所定時間毎のサンプリングでヒットしたロード・ストア命令によりアクセスされたオブジェクト
【００７６】
上記のキャッシュミスのプロファイリングと同様に、所定時間毎にプロファイリング関数に制御を移すことのできるプロセッサが多い。プロファイリング関数の中では直前に実行していた命令とレジスタの内容が取得できるプロセッサが多い。
【００７７】
直前にロード・ストア命令を実行していたならば、そのロード・ストア命令がアクセスしていた仮想メモリアドレスをレジスタの内容から求めて上述した手法と同様の手法でオブジェクトを同定することができる。
【００７８】
（３）ＧＣプロセスが起動したときにレジスタもしくはスタックから直接指されていたオブジェクト
【００７９】
レジスタもしくはスタックから直接指されているオブジェクトは近い過去にアクセスされたか、又は近い将来にアクセスされると考えることができる。ＧＣが発生したときにはレジスタやスタックから指されているオブジェクトをたどるので、直接指されているオブジェクトへのアクセスフラグを少ない追加実行コストで立てることが可能となる。
【００８０】
（４）新たに生成されたオブジェクト
【００８１】
新たに生成されたオブジェクトは近い将来にアクセスされる可能性が高い。従って、オブジェクトの生成時に対応するアクセスフラグを立てておく。
【００８２】
（５）世代別ＧＣを用いている場合は新世代領域にあるオブジェクト
【００８３】
新世代領域にあるオブジェクトは近い過去にアクセスされて近い将来にＧＣで回収される可能性が高いので、アクセス不可領域に隔離すべきではない。あるオブジェクトが新世代領域にあるか否かは一般にアドレスから判定可能なので、実際にフラグを立てる必要はない。
【００８４】
（６）世代別ＧＣを用いている場合は、旧世代領域にあるが新世代領域を直接指しているオブジェクト（世代別ＧＣのライトセットに入っているオブジェクト）
【００８５】
新世代領域にあるオブジェクトは近い将来にＧＣで回収されるか、もしくは旧世代領域に移動する。従って、旧世代領域にあるオブジェクト中の新世代領域を直接指しているフィールドは近い将来にアクセスされて書き換えられる。このようなフィールドは、世代別ＧＣのライトセットに入っているので、それを含むオブジェクトもＧＣの時に容易にアクセスフラグを立てることができる。
【００８６】
図２（ａ）及び（ｂ）は、物理メモリ量を増加することなくオブジェクトの移動を説明するための図であり、所定の期間が経過した時点で、アクセスフラグが立っていないオブジェクトは準アクセス不可領域へ移動される。この移動はＧＣにオブジェクトを移動する仕組みが備わっていればそれを利用することが望ましい。よって、上記の移動はＧＣと同時に行ってもよく、移動が終わったら全てのアクセスフラグがクリアされる。
【００８７】
次段階以降においては、あるオブジェクトが準アクセス不可領域に含まれているか否かをアドレスから容易に判定可能とする必要がある。従って、将来的に準アクセス不可領域として用いる連続した広い仮想メモリ領域を予め起動時にメモリマップに類するシステムコールで予約しておくことが好ましい。
【００８８】
準アクセス不可領域は、この段階では物理メモリにマップされている必要がある。従って、単純な実装では一時的に必要な物理メモリ量が増加する。ただし、アクセスフラグが立っているオブジェクトはより狭い領域へ詰め込まれるため、オブジェクトの移動が終わった時点で不要になったヒープメモリ領域を解放することができる。
【００８９】
必要とする物理メモリ量を増やさない実装としては、まず図２（ａ）に示すように、通常のヒープメモリ領域中でアクセスフラグが立っているオブジェクト１１と、アクセスフラグが立っていないオブジェクト１２とを異なる仮想メモリページ１３に隔離する
【００９０】
続いて、図２（ｂ）に示すように、アクセスフラグが立っていないオブジェクト１２の入ったページをオペレティングシステム（ＯＳ）のサポートにより、準アクセス不可領域１６として予約された仮想メモリページにマップし直す。つまり、図中の太線で示すようにオブジェクト１２の物理メモリアドレスを変えずに仮想メモリアドレスだけを変えることになる。
【００９１】
この際、オブジェクト１１のアクセスフラグを立てる期間を十分にとらないと、図３に示すように、アクセスフラグが不十分な状態となる。図３に示す例では、オブジェクト１１ａとオブジェクト１１ｂにアクセスがあったにもかかわらずアクセスフラグが立っていないものとすると、アクセスフラグが立っていないオブジェクトをこのままの状態で、準アクセス不可領域に移動すると、後述するように、次段階において実行時間の大きな増加につながる。
【００９２】
この場合、アクセスフラグが立っているオブジェクトの間を繋ぐオブジェクトにもアクセスフラグを立てて補間するようにしてもよい。
【００９３】
ここでは、ヒューリスティクスを用いてアクセスフラグを補間するアルゴリズムについて説明する。
【００９４】
図４は、ヒューリスティクスを用いてアクセスフラグを補間するアルゴリズムを示すフローチャートである。図４において、Ｒ＝ＧＣのルート集合（ポインタ値を持つマシンレジスタやマシンスタック中のエントリ）をフィールドとして持つ仮想的なオブジェクトとする（ステップＳ１）。
【００９５】
Ｒを引数として、ｍａｒｋ＿ｐｏｉｎｔｅｒ＿ｆｉｅｌｄｓ（）を呼び出す。ｍａｒｋ＿ｐｏｉｎｔｅｒ＿ｆｉｅｌｄｓ（）の機能は、オブジェクトのグラフを深さ優先探索して、各オブジェクトのポインタフィールドのうちアクセスフラグが立っている他のオブジェクトまでの距離が遠いフィールドをマークすることである（ステップＳ２）。マークはフィールドの最下位１ビットを用いる。
【００９６】
Ｒを引数として、ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（）を呼び出す。ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（）の機能は、オブジェクトのグラフを再び深さ優先探索して、アクセスフラグが立っているオブジェクトを初めて訪れた時にそこに至るまでのパス中の全てのオブジェクトへのアクセスフラグを立てることである。各オブジェクトの先を探索する際にはマークされていないフィールドを優先する（ステップＳ３）。
【００９７】
図５は、ｍａｒｋ＿ｐｏｉｎｔｅｒ＿ｆｉｅｌｄｓ（ｏｂｊｅｃｔ）の機能を示すフローチャートである。図５において、ｍａｒｋ＿ｐｏｉｎｔｅｒ＿ｆｉｅｌｄｓ（ｏｂｊｅｃｔ）が開始されると、オブジェクトｏｂｊｅｃｔを引数として受け取り（ステップＳ４）、当該ｏｂｊｅｃｔが処理済であるか否かを判定する（ステップＳ５）。
【００９８】
ｏｂｊｅｃｔが処理済であると、続いて、ｏｂｊｅｃｔのアクセスフラグが立っているか否かを判定し（ステップＳ６）、アクセスフラグが立っていれば、アクセスフラグが立っている最も近いオブジェクトへの近似的な距離を求めるので、この場合は距離としてゼロを返す（ステップＳ７）。一方、アクセスフラグが立っていなければ、距離がわからない場合に該当するので、１以上の任意の整数を返す（ステップＳ８）。
【００９９】
ステップＳ５においてｏｂｊｅｃｔが処理済でなければ、ステップＳ９でｏｂｊｅｃｔに処理済フラグを立て、配列ｄｉｓｔａｎｃｅｓをゼロに初期化する。そして、ｏｂｊｅｃｔの全てのポインタフィールドについて処理を行ったか否かを判定し（ステップＳ１０）、処理していなければ、当該ポインタフィールドｐが指すオブジェクトを引数として、ｍａｒｋ＿ｐｏｉｎｔｅｒ＿ｆｉｅｌｄｓ（ｏｂｊｅｃｔ）を呼び出し、その結果をｄｉｓｔａｎｃｅｓ［ｐ］に格納する（ステップＳ１１）。そして、ステップＳ１０に戻る。
【０１００】
ステップＳ１０において、ｏｂｊｅｃｔの全てのポインタフィールドについて処理を行っていれば、続いて、配列ｄｉｓｔａｎｃｅｓの中から閾値を１つ選ぶ（ステップＳ１２）。なお、最も単純なアルゴリズムとしては最小値を選択する。
【０１０１】
さらに、ｏｂｊｅｃｔの全てのポインタフィールドについて処理したか否かを判定し（ステップＳ１３）、処理していなければ、このポインタフィールドｐに対応する値ｄｉｓｔａｎｃｅｓ［ｐ］が閾値より大きいか否かを判断する（ステップＳ１４）。大きければ、このポインタフィールドの最下位１ビットを立ててマークし（ステップＳ１５）、ステップＳ１３に戻る。なお、ポインタフィールドｐに対応する値ｄｉｓｔａｎｃｅｓ［ｐ］が閾値以下であると、ステップＳ１３に戻る。
【０１０２】
一方、ステップＳ１３において、ｏｂｊｅｃｔの全てのポインタフィールドについて処理していれば、ｏｂｊｅｃｔのアクセスフラグが立っているか否かを判定し（ステップＳ１６）、アクセスフラグが立っていれば、ゼロを返す（ステップＳ１７）。ステップＳ１６において、ｏｂｊｅｃｔのアクセスフラグが立っていないと、ｏｂｊｅｃｔがポインタフィールドを持つか否かを判定する（ステップＳ１８）。
【０１０３】
ステップＳ１８において、ｏｂｊｅｃｔがポインタフィールドを持っていれば、配列ｄｉｓｔａｎｃｅｓの最小値＋１を返し（ステップＳ１９）、ｏｂｊｅｃｔがポインタフィールドを持っていなければ、行き止まりオブジェクトであるので、無限遠をあらわす最大の整数値を返す（ステップＳ２０）。
【０１０４】
図６は、ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（ｏｂｊｅｃｔ）の機能について説明するフローチャートである。図６において、ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（ｏｂｊｅｃｔ）が開始されると、オブジェクトｏｂｊｅｃｔを引数として受け取り（ステップＳ２１）、当該ｏｂｊｅｃｔが処理済であるか否かを判定する（ステップＳ２２）。
【０１０５】
ｏｂｊｅｃｔが処理済であると、呼び出し元に戻り（ステップＳ２３）、ｏｂｊｅｃｔが処理済でないと、ｏｂｊｅｃｔに処理済フラグを立てる（ステップＳ２４）。続いて、ｏｂｊｅｃｔのアクセスフラグが立っているか否かを判定し（ステップＳ２５）、アクセスフラグが立っていれば、ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（ｏｂｊｅｃｔ）の再帰呼び出しスタックを遡ってアクセスフラグが立っていない引数オブジェクトのフラグを立てる（ステップＳ２６）。
【０１０６】
続いて、ｏｂｊｅｃｔの全てのポインタフィールドについて処理を行ったか否かを判定する（ステップＳ２７）。なお、ステップＳ２５でアクセスフラグが立っていないと、処理はステップＳ２７に進む。
【０１０７】
ステップＳ２７でｏｂｊｅｃｔの全てのポインタフィールドについて処理を行っていると、再度ｏｂｊｅｃｔの全てのポインタフィールドについて処理したか否かを判定し（ステップＳ２８）、処理していれば、呼び出し元に戻る（ステップＳ２９）。
【０１０８】
ステップＳ２８において、ｏｂｊｅｃｔの全てのポインタフィールドについて処理を行っていないと、当該ポインタフィールドにマークが付いているか否かを判定し（ステップＳ３０）、マークが付いていれば、このポインタフィールドの最下位ビットをゼロにして、このポインタフィールドが指すオブジェクトを引数として、ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（ｏｂｊｅｃｔ）を呼び出す（ステップＳ３１）。そして、ステップＳ２８に戻る。なお、ステップＳ３０においてマークが付いていなければ、処理はステップＳ２８に戻る。
【０１０９】
前述のステップＳ２７において、ｏｂｊｅｃｔの全てのポインタフィールドについて処理を行っていないと、当該ポインタフィールドにマークが付いているか否かを判定し（ステップＳ３２）、マークが付いていれば、ステップＳ２７に戻る。
【０１１０】
一方、ステップＳ３２においてマークが付いていないと、このポインタフィールドが指すオブジェクトを引数として、ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（ｏｂｊｅｃｔ）を呼び出す（ステップＳ３３）。そして、ステップＳ２７に戻る。
【０１１１】
図７（ａ）にｍａｒｋ＿ｐｏｉｎｔｅｒ＿ｆｉｅｌｄｓ（）の結果の例を示す。ここではｔｈｒｅｓｈｏｌｄとしてｄｉｓｔａｎｃｅの最小値を用いたと仮定する。括弧で示す番号は深さ優先順の一例、太い矢印はマークが付かなかったポインタを表す。次のｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（）ではマークが付いていないポインタを優先してもう一度深さ優先探索を行う。その結果を図７（ｂ）に示す。
【０１１２】
このアルゴリズムによりオブジェクト１１ａのアクセスフラグを立てることができる。オブジェクト１１ｂのフラグは立てることができないが、後述の段階でオブジェクト１１ｂへのアクセスを検出することができる。
【０１１３】
続いて、準アクセス不可領域にあるオブジェクトが長い間アクセスされないことの確認を行う。上述したアクセスフラグを立てる手法は近似的であるため、準アクセス不可領域に移動したオブジェクトが高い確率で長い間アクセスされないことを確認する必要がある。そこで、さらに所定の期間、ＧＣ以外の時間は準アクセス不可領域全体をページ保護機構でアクセス不可にする。
【０１１４】
もしもユーザプログラムから準アクセス不可領域にアクセスがあった場合はシグナルハンドラに制御が移る。シグナルハンドラ中ではアクセスした仮想メモリアドレスが取得できるので、オブジェクトを同定してアクセスフラグを立てる。次のＧＣの時にアクセスフラグが立っているオブジェクトは通常のヒープメモリ領域に戻してフラグをクリアする。
【０１１５】
図８は図２に続く状態を示している。オブジェクト１１ｃにアクセスがあったので、通常のヒープメモリ領域に戻している。また、この期間中にオブジェクトのリンク関係が変わり、図８に示すオブジェクト１１ｂのように準アクセス不可領域１６からしか指されないオブジェクトが生じることがある。このようなオブジェクト１１ｂは後述するように準アクセス不可領域１６に移動される。
【０１１６】
続いて、準アクセス不可領域１６をアクセス不可領域１５に設定する。所定の期間が経過した時点で、準アクセス不可領域１６を実際にアクセス不可領域１５として物理メモリから追い出す。ただし、この時点で準アクセス不可領域１６中からある閾値数以上のオブジェクトが通常のヒープメモリ領域に戻されていたならば、物理メモリから追い出すのをやめて全体を通常のヒープメモリ領域に戻すようにしてもよい。
【０１１７】
まず準備として、図９（ａ）に示すように準アクセス不可領域１６からしか指されないオブジェクトを準アクセス不可領域１６に移動する。具体的には、ＧＣと同様にルート集合からオブジェクトをたどってマークを付けるが、準アクセス不可領域１６へのポインタはたどらずに記録しておく。次に、準アクセス不可領域１６へのポインタをルート集合として残りのオブジェクトをたどり、マークされていない通常のヒープ領域中のオブジェクトを見つけたら再帰的に準アクセス不可領域１６へ移動する。
【０１１８】
上記の探索と移動の際に、準アクセス不可領域１６の中から外を指すポインタを見つけた場合は、分身１７をＧＣのルート集合に登録しておく。ここで分身１７は対応するポインタの参照元と参照先の情報を有する。この分身１７からオブジェクトへの参照がないと、将来的にアクセス不可領域１５からしか指されなくなった場合に間違ってＧＣで回収されてしまうことになる。
【０１１９】
オブジェクトの探索と移動が終わると、準アクセス不可領域１６をアクセス不可領域１５として設定する。設定の仕方にはアクセス不可領域１５の内容をどこに保存するかによって３つの選択肢がある。ただし、いずれの場合もＧＣはアクセス不可領域１５へのポインタはたどらない。
【０１２０】
図９（ｂ）に低速だがエネルギー効率の良いメモリへアクセス不可領域１５をマップする場合を示す。この場合には、ユーザプログラムがアクセス不可領域１５にアクセスした時にも低速だがそのまま読み書きできる。ただし、ユーザプログラムからの読み書きを検出するためにページ保護機構により読み書き禁止にするようにしてもよい。
【０１２１】
分身１７から指されるオブジェクトをＧＣが移動した場合、参照元のアクセス不可領域１５中のオブジェクトのフィールドも書き換える必要がある。ただし、書き換える必要のあるオブジェクトはアクセス不可領域１５中の全オブジェクトのごく一部である。この設定ではオブジェクトの移動のたびにアクセス不可領域１５への書き込みが必要なため、ディスクへスワップアウトする場合には向いていない。
【０１２２】
ＧＣによるオブジェクトの書き換えを避けるためには図１０（ａ）及び（ｂ）に示す２種類の設定のいずれかが用いられる。
【０１２３】
図１０（ａ）に示す設定では、分身１７から指されるオブジェクトを移動不可とする。このため、ヒープメモリ領域のフラグメンテーションが起きる可能性がある。アクセス不可領域１５を低速だがエネルギー効率のよいメモリへマップする場合、ユーザプログラムはそのまま読み書きできる。ディスクへスワップアウトする場合は、ページ保護機構で読み書き禁止にして、ユーザプログラムからアクセスがあった場合は物理メモリに一時的にスワップインする必要がある。
【０１２４】
図１０（ｂ）に示す設定では、準アクセス不可領域１６をアクセス不可領域１５にする際に中から外を指すポインタを書き換えて対応する分身１７を指すようにする。分身１７の仮想メモリ空間上の位置は変わらないため、分身１７から指されるオブジェクトを移動してもアクセス不可領域１５中のオブジェクトを書き換える必要はない。
【０１２５】
その代わりに、ユーザプログラムはアクセス不可領域１５をそのまま読み書きできないため、ページ保護機構で読み書き禁止にする。そして、ユーザプログラムからアクセスがあった場合は物理メモリに一時的にスワップインして、分身１７の情報を用いてポインタを正しく書き直す必要がある。
【０１２６】
一度設定したアクセス不可領域１５に新たにオブジェクトが追加されることはない。これは、既存のアクセス不可領域１５にはなるべくアクセスしないで済ますためである。もし長い間アクセスされないオブジェクトを新たに検出した場合は、図１１に示すように、新たなアクセス不可領域１５ａを設定する。ここで、新たなアクセス不可領域１５ａの中から外を指すポインタについては、その指す先が通常のヒープメモリか他のアクセス不可領域１５かに関わらずに分身１７を生成する。
【０１２７】
アクセス不可領域１５、１５ａをページ保護機構で読み書き禁止にする場合、ユーザプログラムからのアクセスを監視することができる。もし頻繁にアクセスがあるならば、そのアクセス不可領域１５、１５ａ中のオブジェクト全てを通常のヒープメモリ領域に戻すようにしてもよい。その例を図１２に示す。また、アクセス不可領域１５、１５ａに対応する分身１７は削除される。
【０１２８】
このようにして、本実施の形態では、ユーザプログラムのアクセスがあっても、アクセス速度が低下することがなく、しかもオブジェクトを隔離した際、当該隔離されたオブジェクトに対するガベージコレクションのアクセスが不要となって、アクセス速度が低下することがない。そして、物理メモリ使用量を効果的に削減することができるばかりでなく、物理メモリ量の使用量に応じて長い期間アクセスされないオブジェクトを検出して隔離を行うことができることになる。
【図面の簡単な説明】
【０１２９】
【図１】本発明の実施の形態によるオブジェクト隔離方法によって、長い期間アクセスされないオブジェクトを隔離した状態を示す図である。
【図２】本発明の実施の形態によるオブジェクト隔離方法において、物理メモリ量を増加することなくオブジェクトの移動を説明するための図であり、図２（ａ）は非アクセスオブジェクトを１つの仮想メモリページに集めた状態を示す図、図２（ｂ）は同一の物理メモリにマップした状態で仮想メモリ中を移動させる状態を示す図である。
【図３】アクセスフラグが不十分な状態を示す図である。
【図４】ヒューリスティクスを用いてアクセスフラグを補間するアルゴリズムを示すフローチャートである。
【図５】ｍａｒｋ＿ｐｏｉｎｔｅｒ＿ｆｉｅｌｄｓ（ｏｂｊｅｃｔ）の機能を示すフローチャートである。
【図６】ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（ｏｂｊｅｃｔ）の機能について説明するフローチャートである。
【図７】ヒューリスティクスを用いたアクセスフラグの補間結果示す図であり、図６（ａ）は、ｍａｒｋ＿ｐｏｉｎｔｅｒ＿ｆｉｅｌｄｓ（）の結果を示す図、図６（ｂ）は、ｉｎｔｅｒｐｏｌａｔｅ＿ａｃｃｅｓｓｅｄ＿ｏｂｊｅｃｔｓ（）の結果を示す図である。
【図８】準アクセス不可領域にあるオブジェクトに対するアクセスのページ保護機構による検出を示す図である。
【図９】アクセス不可領域の設定を説明するための図であり、（ａ）は準アクセス不可領域の設定を示す図、（ｂ）は準アクセス不可領域をアクセス不可領域とし低速だがエネルギー効率のよいメモリへのマップを示す図である。
【図１０】ＧＣによる書き換えを防止するためのアクセス不可領域の設定を示す図であり、（ａ）は低速だがエネルギー効率のよいメモリへアクセス不可領域をマップする例を示す図、（ｂ）は分身から指されるオブジェクトを移動不可とする例を示す図である。
【図１１】新たにアクセス不可領域を追加した例を示す図である。
【図１２】アクセス不可領域中のオブジェクトを通常のヒープメモリ領域へ移動する例を示す図である。
【図１３】仮想メモリページ中にオブジェクトが混在する様子を示す図である。
【符号の説明】
【０１３０】
１１、１１ａ、１１ｂ、１１ｃ、１２  オブジェクト
１３  仮想メモリページ
１５  アクセス不可領域
１６  準アクセス不可領域
１７  分身
【図１】
2010015223.tif 000003
【図２】
2010015223.tif 000004
【図３】
2010015223.tif 000005
【図４】
2010015223.tif 000006
【図５】
2010015223.tif 000007
【図６】
2010015223.tif 000008
【図７】
2010015223.tif 000009
【図８】
2010015223.tif 000010
【図９】
2010015223.tif 000011
【図１０】
2010015223.tif 000012
【図１１】
2010015223.tif 000013
【図１２】
2010015223.tif 000014
【図１３】
2010015223.tif 000015