(57)【特許請求の範囲】
【請求項１】
（ａ）オブジェクト・ヒープに複数のデータ・オブジェクトを格納するステップと、
（ｂ）前記オブジェクト・ヒープ内で、少なくとも第１及び第２のデータ・オブジェクトを、該データ・オブジェクトのロード回数及びストア回数を示すロード・ストア・テーブル並びに該データ・オブジェクトの相対アクセス順序を示すアクセス順序木で表されるアクセス関係に基づいて連続するメモリ・セグメント内に配置するステップと、
（ｃ）コンピュータ・プログラムの実行中に前記（ｂ）に記載の配置するステップを行うトリガとなるイベントを発生させるステップと、
を含み、
前記アクセス関係は、複数のデータ・オブジェクトへのアクセス間の時間的近接性又は異なるデータ・オブジェクトのアクセスの相対頻度を含んでいることを特徴とするコンピュータ・メモリ内のデータを管理する方法。
【請求項２】
前記アクセス関係が、前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップをさらに含む、請求項１に記載の方法。
【請求項３】
前記アクセス関係が前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップが、前記第１及び第２のデータ・オブジェクトへのアクセス間の時間的近接性を判定するステップを含む、請求項２に記載の方法。
【請求項４】
前記アクセス関係が前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップが、前記第１及び第２のデータ・オブジェクトが、次々にアクセスされる可能性が高いことを判定するステップを含む、請求項３に記載の方法。
【請求項５】
前記アクセス関係が前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップが、前記第１及び第２のデータ・オブジェクトに関するアクセスの相対頻度を判定するステップを含む、請求項２に記載の方法。
【請求項６】
前記データ・オブジェクトが、コンピュータ・プログラムに応答してアクセスされ、前記アクセス関係が前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップが、前記コンピュータ・プログラムのコンパイル及びローディングのうちの少なくとも１つの間に実行される、請求項２に記載の方法。
【請求項７】
前記第１及び第２のデータ・オブジェクトの間の前記アクセス関係を判定するステップが、前記コンピュータ・プログラムのためのプロファイリングされたアクセス情報を生成するために、前記コンピュータ・プログラムの少なくとも一部の実行をシミュレートするステップを含む、請求項６に記載の方法。
【請求項８】
前記プロファイリングされたアクセス情報が、前記第１及び第２のデータ・オブジェクトのアクセス順序を表すアクセス順序木を含む、請求項７に記載の方法。
【請求項９】
前記プロファイリングされたアクセス情報が、さらに、前記第１及び第２のデータ・オブジェクトのそれぞれのアクセス・カウントを含む、請求項８に記載の方法。
【請求項１０】
前記プロファイリングされたアクセス情報を前記コンピュータ・プログラムと関連付けるステップをさらに含む、請求項７に記載の方法。
【請求項１１】
前記プロファイリングされたアクセス情報を前記コンピュータ・プログラムと関連付けるステップが、前記プロファイリングされたアクセス情報を、前記コンピュータ・プログラムの実行可能コードと同一のファイルに格納するステップを含む、請求項１０に記載の方法。
【請求項１２】
前記第１及び第２のデータ・オブジェクトが、複数のデータ・オブジェクトの中にあり、前記オブジェクト・ヒープ内で少なくとも前記第１及び第２のデータ・オブジェクトをそれらの間の前記アクセス関係に基づいて配置するステップが、データ・オブジェクトのサブセットを、データ・オブジェクトの前記サブセット内の各データ・オブジェクト間のアクセス関係に基づいて、前記オブジェクト・ヒープ内で一緒にオブジェクト・グループにグループ化するステップを含む、請求項１に記載の方法。
【請求項１３】
データ・オブジェクトの前記サブセットを一緒にグループ化するステップが、データ・オブジェクトの前記サブセット内の前記データ・オブジェクトをメモリの連続するセグメントに格納するステップを含む、請求項１２に記載の方法。
【請求項１４】
前記オブジェクト・グループ内の前記データ・オブジェクトを、それらのアクセスの相対頻度に少なくとも部分的に基づいて配置するステップをさらに含む、請求項１３に記載の方法。
【請求項１５】
前記オブジェクト・グループ内の前記データ・オブジェクトを、前記データ・オブジェクトがアクセスされる可能性が高い順序に少なくとも部分的に基づいて配置するステップをさらに含む、請求項１３に記載の方法。
【請求項１６】
前記複数のデータ・オブジェクトを前記オブジェクト・ヒープに格納するステップが、各データ・オブジェクトについて前記オブジェクト・ヒープ内の空間を割り振るステップを含む、請求項１に記載の方法。
【請求項１７】
前記オブジェクト・ヒープが、From区画とTo区画とに区分され、前記複数のデータ・オブジェクトを前記オブジェクト・ヒープに格納するステップが、コンピュータ・プログラムの実行中に前記第１及び第２のデータ・オブジェクトを前記From区画に動的に格納するステップを含み、前記オブジェクト・ヒープ内で前記第１及び第２のデータ・オブジェクトを配置するステップが、前記第１及び第２のデータ・オブジェクトを、それらの間の前記アクセス関係に基づいたアクセス順序で、前記From区画から前記To区画にコピーするステップを含む、請求項１６に記載の方法。
【請求項１８】
前記オブジェクト・ヒープ内で前記第１及び第２のデータ・オブジェクトを配置するステップが、ガーベジ・コレクタによって時々実行され、前記方法がさらに、前記オブジェクト・ヒープ内で前記第１及び第２のデータ・オブジェクトを配置した後に、前記From及びTo区画をスワップするステップを含む、請求項１７に記載の方法。
【請求項１９】
前記データ・オブジェクトが、Java仮想マシンによるJavaクラス・ファイルの実行に応答してアクセスされる、請求項１に記載の方法。
【請求項２０】
前記第１及び第２のデータ・オブジェクトが、前記Java仮想マシン内の呼出しスタック上のアクセス連鎖内で次々に参照され、前記オブジェクト・ヒープ内で前記第１及び第２のデータ・オブジェクトを配置するステップが、前記第１及び第２のデータ・オブジェクトが次々に参照されることの判定に応答して、前記第１及び第２のデータ・オブジェクトをメモリの連続するセグメント内でお互いの次に配置するステップを含む、請求項１９に記載の方法。
【請求項２１】
前記第１及び第２のデータ・オブジェクトが、クラス・ファイル内で定義される第３のデータ・オブジェクトによって参照され、前記方法がさらに、前記クラス・ファイル内で、前記第１及び第２のデータ・オブジェクト間のアクセス関係に基づいて、前記第１データ・オブジェクトへの第１参照と前記第２データ・オブジェクトへの第２参照とを配置するステップを含み、
前記アクセス関係は、相対的なアクセス頻度を含んでいることを特徴とする請求項１９に記載の方法。
【請求項２２】
（ａ）参照するデータ・オブジェクトによって参照される、複数の参照されるデータ・オブジェクトのそれぞれのアクセスの相対頻度を判定するステップと、
（ｂ）前記複数の参照されるデータ・オブジェクトを該データ・オブジェクトのロード回数及びストア回数を示すロード・ストア・テーブルで表されるアクセスの前記相対頻度に基づいてオブジェクト・ヒープ内の連続するメモリ・セグメント内に配置するステップと、
（ｃ）コンピュータ・プログラムの実行中に前記（ｂ）に記載の配置するステップを行うトリガとなるイベントを発生させるステップと、
を含むことを特徴とするコンピュータ・メモリ内のデータを管理する方法。
【請求項２３】
（ａ）メモリと、
（ｂ）前記メモリ内に存在する、複数のデータ・オブジェクトを記憶するように構成されたオブジェクト・ヒープと、
（ｃ）前記メモリ内に存在する、前記オブジェクト・ヒープ内で少なくとも第１及び第２のデータ・オブジェクトを該データ・オブジェクトのロード回数及びストア回数を示すロード・ストア・テーブル並びに該データ・オブジェクトの相対アクセス順序を示すアクセス順序木で表されるアクセス関係に基づいて連続するメモリ・セグメント内に配置するように構成し、かつ、その配置のトリガとなるイベントを発生させるように構成したプログラムと、
を含み、
前記アクセス関係は、複数のデータ・オブジェクトへのアクセス間の時間的近接性又は異なるデータ・オブジェクトのアクセスの相対頻度を含んでいることを特徴とする装置。
【請求項２４】
前記プログラムがさらに、前記第１及び第２のデータ・オブジェクトへのアクセス間の時間的近接性を判定することによって、前記第１及び第２のデータ・オブジェクトの間に前記アクセス関係が存在することを判定するように構成される、請求項２３に記載の装置。
【請求項２５】
前記プログラムがさらに、前記第１及び第２のデータ・オブジェクトのアクセスの相対頻度を判定することによって、前記第１及び第２のデータ・オブジェクトの間に前記アクセス関係が存在することを判定するように構成される、請求項２３に記載の装置。
【請求項２６】
前記プログラムが、第２プログラムのプロファイリングされたアクセス情報を生成するために前記第２プログラムの少なくとも一部の実行をシミュレートするように構成された第１プログラムを含む、請求項２３に記載の装置。
【請求項２７】
前記第１プログラムがさらに、前記第２プログラムの実行可能コードと同一のファイルに前記プロファイリングされたアクセス情報を格納するように構成される、請求項２６に記載の装置。
【請求項２８】
前記第１及び第２のデータ・オブジェクトが、複数のデータ・オブジェクトの中にあり、前記プログラムがさらに、データ・オブジェクトのサブセットを、データ・オブジェクトの前記サブセット内の各データ・オブジェクトの間の前記アクセス関係に基づいて、前記オブジェクト・ヒープ内のメモリの連続するセグメント内に一緒にグループ化するように構成される、請求項２３に記載の装置。
【請求項２９】
前記プログラムがさらに、前記オブジェクト・グループ内の前記データ・オブジェクトのアクセスの相対頻度と、前記オブジェクト・グループ内の前記データ・オブジェクトがアクセスされる可能性が高い順序とのうちの少なくとも１つに少なくとも部分的に基づいて、前記オブジェクト・グループ内の前記データ・オブジェクトを配置するように構成される、請求項２８に記載の装置。
【請求項３０】
前記オブジェクト・ヒープが、From区画とTo区画とに区分され、前記プログラムが、データ・オブジェクト間の前記アクセス関係に基づく所定の順序で、前記From区画から前記To区画へデータ・オブジェクトをコピーするように構成される、請求項２３に記載の装置。
【請求項３１】
前記データ・オブジェクトが、Java仮想マシンによるJavaクラス・ファイルの実行に応答してアクセスされる、請求項２３に記載の装置。
【請求項３２】
オブジェクト・ヒープに格納された複数のオブジェクトからの少なくとも第１及び第２のデータ・オブジェクトを、該データ・オブジェクトのロード回数及びストア回数を示すロード・ストア・テーブル並びに該データ・オブジェクトの相対アクセス順序を示すアクセス順序木で表されるアクセス関係であって前記第１及び第２のデータ・オブジェクトへのアクセス間の時間的近接性又はアクセスの相対頻度を含むアクセス関係に基づいて連続するメモリ・セグメント内に配置するように構成し、かつ、その配置のトリガとなるイベントを発生させるように構成したプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、全般的にはコンピュータ及びコンピュータ・ソフトウェアに関する。具体的には、本発明は、全般的にオブジェクト・ヒープ内のオブジェクトの管理に関する。
【０００２】
【従来の技術】
使用可能メモリの管理は、コンピュータなどのデータ処理システムの性能及び信頼性にとって非常に重要である。具体的に言うと、コンピュータ・プログラムによって使用されるデータは、通常は、コンピュータ内で、限られたアドレス空間を有するメモリ内に記憶される。多くのコンピュータでは、データは、「オブジェクト・ヒープ」と称するメモリの部分に割り当てられた空間である「オブジェクト」の形で記憶される。オブジェクトには、しばしば、他のオブジェクトへの「参照」（ポインタとも称する）が含まれ、その結果、コンピュータ・プログラムが、あるオブジェクトからの参照に従うことによって別のオブジェクトの情報にアクセスできるようになる。通常、各コンピュータ・プログラムは、それ自体のオブジェクト・ヒープを有するので、複数のコンピュータ・プログラムが１台のコンピュータで活動状態になっている場合には、複数のオブジェクト・ヒープが、そのコンピュータ内で維持される可能性がある。
【０００３】
コンピュータ・プログラムが新しいデータを使用する時には、必ず、空きメモリの一部が、メモリ「割振り」と称する処理を使用してそのデータのために予約される。コンピュータ内で使用可能なメモリの量が限られているので、もはやコンピュータによって使用されなくなったデータのために予約されたメモリを解放または「割振り解除」することが重要である。そうしなければ、使用可能メモリが使い果たされると、コンピュータの性能が、通常は低下し、また、システム障害が発生する場合がある。
【０００４】
ガーベジ・コレクタと称するコンピュータ・プログラムが、コンピュータ内の他のコンピュータ・プログラムによって割り当てられた未使用メモリを解放するために使用されることがよくある。しばしば、ガーベジ・コレクタは、他のコンピュータ・プログラムと並列に動作して、オブジェクト・ヒープ全体を周期的に走査し、未使用オブジェクトに割り振られているメモリを割振り解除する（オブジェクトの「収集」とも称する処理）。コンピュータ内で並列に動作する異なるコンピュータ・プログラムには、互いに並列に実行される１つまたは複数の「スレッド」が含まれることがしばしばである。さらに、異なるコンピュータ・プログラムが異なるオブジェクト・ヒープを使用する時には、コレクタ・スレッドとも称する別々のガーベジ・コレクタ・コンピュータ・プログラムが、各オブジェクト・ヒープの管理に使用される場合がある。
【０００５】
ガーベジ・コレクタの具体的な種類の１つが、コピー型（copying）ガーベジ・コレクタであり、これは、オブジェクト・ヒープを「from空間」と「to空間」の区画に区分し、有効で現在使用されているオブジェクトをfrom空間からto空間にコピーし、効果的に未使用のオブジェクトを後に残すことによって、オブジェクト・ヒープを管理する。コピー型ガーベジ・コレクタの具体的な実施形態が、生成型（generational）ガーベジ・コレクタであり、これは、オブジェクト・ヒープをnew区画とold区画に区分する。生成型ガーベジ・コレクタは、新しいオブジェクトが古いオブジェクトより頻繁に「死ぬ」すなわち使用されなくなる傾向に依存する。言い換えれば、オブジェクトは、長時間にわたって使用されるにつれて、使用されなくなる可能性がますます低くなる。
【０００６】
生成型ガーベジ・コレクタは、オブジェクト・ヒープのnew区画の新しいオブジェクトを繰り返し走査し、もはや使用中でないオブジェクトのためのメモリを破棄し、割振り解除し、閾時間期間を超えて生存するオブジェクトをオブジェクト・ヒープのold区画に移動することによって、オブジェクト・ヒープを管理する。古いオブジェクトはより安定する傾向を有すると仮定すると、通常、オブジェクト・ヒープのold区画の走査は不要である。
【０００７】
生成型ガーベジ・コレクタは、通常は、線形の形すなわち、各オブジェクトがold区画への移動の判断基準に合致することが判明するたびに次々に、オブジェクトをオブジェクト・ヒープのold区画に格納する。同様に、オブジェクト・ヒープのnew区画内のオブジェクトは、通常は、ガーベジ・コレクタによる割振り解除及びオブジェクトの移動と、ある時点で区画内で使用可能な位置への新しいオブジェクトの追加とに起因して、new区画全体に広く分散する。
【０００８】
生成型ガーベジ・コレクタと同様に、他のコピー型ガーベジ・コレクタ実施形態でも、線形の形でfrom空間からto空間にオブジェクトがコピーされる。しかし、ガーベジ・コレクタ以外のプロセスによって行われるfrom空間内の割振りとオブジェクトの初期配置に関して、オブジェクトは、これらのコピー型ガーベジ・コレクタ実施形態でもfrom空間全体に広く分散する傾向を有する。
【０００９】
オブジェクト・ヒープにオブジェクトを格納する通常の形に固有の結果は、コンピュータ・プログラムによって使用されるさまざまなオブジェクトが、時間に伴ってオブジェクト・ヒープ全体に広く分散するようになる可能性があることである。しかし、オブジェクト・ヒープ内でのオブジェクトの比較的広い分散は、メモリ・スワッピング問題に起因する、コンピュータの最適でない性能をもたらす可能性がある。
【００１０】
具体的に言うと、ほとんどのコンピュータは、多重レベル・メモリ・アーキテクチャに依存して、メモリ性能とコストのバランスをとっている。ほとんどのコンピュータには、１つまたは複数のレベルの、小容量で高速のキャッシュ・メモリと、それにインターフェースされた、大容量だが比較的低速の主記憶が含まれる。コンピュータ・プログラムがデータを必要とする時に、データは、コンピュータ内のプロセッサによるアクセスのために主記憶からキャッシュ・メモリにコピーされる。データは、通常はブロックまたは「キャッシュ・ライン」に編成され、特定のキャッシュ・ラインに割り振られたデータのすべてが、グループとしてキャッシュとの間でスワップされる。
【００１１】
いくつかのコンピュータでは、アドレッシング可能な記憶空間が、主記憶に使用可能な物理的記憶域より大きい、仮想記憶方式が実装されている。キャッシングに似て、仮想記憶方式では、データがページに編成され、データは、主記憶と、直接アクセス記憶装置（ＤＡＳＤ）などの外部記憶装置との間でページ単位でスワップされる。
【００１２】
多重レベル・メモリ・アーキテクチャの主な利益は、より頻繁に使用されるデータを、しばしば、より高いレベルのメモリ内に維持することができ、その結果、そのデータによりすばやくアクセスできることである。キャッシュ・メモリからアクセスされるデータが、現在キャッシュ・メモリ内に格納されていないキャッシュ・ラインに割り振られている時には、必ずキャッシュ・ミスが発生し、そのデータの取出は、より低いレベルのメモリからデータを取り出さなければならないので長時間を要する。同様に、主記憶からアクセスされるデータが、現在主記憶内に格納されていないページに割り振られている時には、必ずページ・フォルトが発生し、そのデータの取出は、そのデータを外部記憶装置からスワップ・インしなければならないので長時間を要する。
【００１３】
オブジェクト・ヒープは、通常は複数のキャッシュ・ラインを占め、多くの場合に、複数のページを占める。その結果、オブジェクト・ヒープ内のオブジェクトが比較的広く分散している状態では、オブジェクト・ヒープ内の異なる位置に配置されたオブジェクトへの連続するアクセスが、各キャッシュ・メモリ内と、おそらくは主記憶内でのかなりの量のメモリ・スワップを必要とする可能性がある。その結果、オブジェクト・ヒープへのアクセスは長時間を要する傾向を有し、コンピュータは、ピーク効率より低い効率で動作する。
【００１４】
【発明が解決しようとする課題】
したがって、当技術分野には、特に改良されたガーベジ・コレクション技法によって、オブジェクト・ヒープにアクセスする際のコンピュータの性能を改良する方法に対する実質的な必要が存在する。
【００１５】
【課題を解決するための手段】
本発明は、データ・オブジェクト間のアクセス関係に基づいてオブジェクト・ヒープ内のデータ・オブジェクトを編成する装置、プログラム製品及び方法を提供することによって、従来技術に関連する上記及び他の問題に対処する。それを行うことによって、互いに密に連続してアクセスされるデータ・オブジェクトが、互いに同一のページ内に配置される可能性が高まり、おそらくは同一のキャッシュ・ラインに配置される可能性が高まる。その結果、そのようなオブジェクトにアクセスする時に、多重レベル・メモリ・アーキテクチャ内（たとえば、具体的なアーキテクチャに応じて、特定のキャッシュ・メモリ内または仮想記憶方式内）のメモリ・スワッピングの頻度が、しばしば低下し、システム性能の総合的な改善がもたらされる。
【００１６】
複数のデータ・オブジェクトの間のアクセス関係は、少なくとも部分的には、そのようなデータ・オブジェクトへのアクセスの有望な時間的近接性、たとえば、コンピュータ・プログラムの実行中にオブジェクトのグループが通常は次々とアクセスされる時に基づくものとすることができる。複数のデータ・オブジェクトの間のアクセス関係は、少なくとも部分的に、異なるデータ・オブジェクトのアクセスの相対頻度に基づくものとすることもできる。アクセス関係を定義する他の形は、本明細書に示された開示を読めば、当業者には明白になる。
【００１７】
本発明の１つの実施例では、オブジェクト・ヒープ内のデータ・オブジェクトの順序付けが、コンピュータ・プログラムによって使用されるデータ・オブジェクトの異なるクラスについて生成された、プロファイリングされたアクセス情報に頼る。このプロファイリングは、コンピュータ・プログラムのコンパイル中、ロード中または実行中を含む、さまざまな時に実行することができる。通常、データ・オブジェクトへのアクセスの回数またはデータ・オブジェクトがアクセスされる順序などの情報は、予測することができ、オブジェクト・ヒープ内でデータ・オブジェクトを順序付ける方法の決定に使用することができる。
【００１８】
【発明の実施の形態】
ハードウェア環境とソフトウェア環境
図面を参照すると、複数の図面を通じて同様の符号によって同様の部分が表されているが、図１には、本発明との一貫性を有するコンピュータ・システム１０が示されている。コンピュータ・システム１０は、ネットワーク１８を介してサーバ１６（たとえば、ＰＣベースのサーバ、ミニコンピュータ、ミッドレンジ・コンピュータ、メインフレーム・コンピュータなど）に結合された１つまたは複数のクライアント・コンピュータ１２、１４及び２０（たとえば、デスクトップ・コンピュータまたはＰＣベースのコンピュータ、ワークステーションなど）を含むネットワーク化されたコンピュータ・システムとして図示されている。ネットワーク１８は、ローカル・エリア・ネットワーク、広域ネットワーク、無線ネットワーク及び公衆ネットワーク（たとえばインターネット）を含むがこれに制限されない、事実上すべての種類のネットワーク化相互接続を表すことができる。さらに、たとえば複数のサーバなど、任意の台数のコンピュータ及び他の装置を、ネットワーク１８を介してネットワーク化することができる。
【００１９】
クライアント・コンピュータ２０は、クライアント・コンピュータ１２及び１４に類似するものとすることができるが、これには、とりわけ、中央処理装置（ＣＰＵ）２１、コンピュータ表示装置２２などの複数の周辺構成要素、記憶装置２３、プリンタ２４及びさまざまな入力装置（たとえばマウス２６及びキーボード２７）を含めることができる。サーバ１６は、当技術分野で周知の通り、通常はより高い処理性能とより大きい記憶容量を有するが、同様に構成することができる。
【００２０】
図２は、本発明との一貫性を有する装置３０のハードウェア及びソフトウェアの環境の例を別の形で示す図である。本発明の目的のために、装置３０は、事実上すべての種類のコンピュータ、コンピュータ・システムまたは他のプログラム可能電子装置を表すことができ、これには、クライアント・コンピュータ（たとえば、図１のクライアント・コンピュータ１２、１４及び２０に類似の）、サーバ・コンピュータ（たとえば、図１のサーバ１６に類似の）、ポータブル・コンピュータ、組込みコントローラなどが含まれる。装置３０は、図１に示された形でネットワークに結合することができ、代替形態では、独立型の装置とすることができる。装置３０を、以下では「コンピュータ」と呼称するが、用語「装置」は、本発明との一貫性を有する、他の適当なプログラム可能電子装置を含むことができることを諒解されたい。
【００２１】
コンピュータ３０には、通常は、メモリ３２に結合された少なくとも１つのプロセッサ３１が含まれる。プロセッサ３１は、１つまたは複数のプロセッサ（たとえばマイクロプロセッサ）を表すことができ、メモリ３２は、既知の多重レベル・メモリ・アーキテクチャのいずれかを使用して実装することができ、これには、たとえば、ランダム・アクセス・メモリ（ＲＡＭ）デバイスを使用して実装される主記憶３２ａと、たとえば１つまたは複数のレベルのキャッシュ・メモリ３２ｂ（プロセッサ３１の内部または外部）ならびにさまざまな不揮発性メモリまたはバックアップ・メモリ（たとえば、プログラム可能メモリまたはフラッシュ・メモリ）及び読取専用メモリなどの１つまたは複数の補助レベルのメモリが含まれる。当技術分野で既知の通り、データは、主記憶とキャッシュ・メモリの間及び「キャッシュ・ライン」の形で異なるレベルのキャッシュ・メモリの間でスワップされ、特定のレベルのキャッシュに存在しないデータへのアクセスは、「キャッシュ・ミス」と、別のレベルのメモリからの必要なデータの取出しに関連する追加の遅延をもたらす。
【００２２】
さらに、メモリ３２は、たとえば（上で説明したように）キャッシュ・メモリまたはプロセッサ３１内のレジスタなど、物理的にコンピュータ３０内の別の場所に配置されるメモリ記憶域ならびに、たとえば大容量記憶装置３６上またはネットワーク３８を介してコンピュータ３０に結合される別のコンピュータ上に格納されるものなどの仮想記憶として使用される記憶容量を含むものと考えることができる。当技術分野で既知の通り、仮想記憶アーキテクチャを用いると、データは、大容量記憶装置と主記憶の間で「ページ」の形でスワップされ、主記憶に存在しないデータへのアクセスは、「ページ・フォルト」と、外部記憶装置からの必要なデータの取出に関連する追加の遅延をもたらす。
【００２３】
コンピュータ３０は、通常は、外部と情報を通信するために、複数の入力及び出力も受け取る。ユーザまたは操作員とのインターフェースのために、コンピュータ３０には、通常は、１つまたは複数のユーザ入力装置３３（たとえば、とりわけ、キーボード、マウス、トラックボール、ジョイスティック、タッチパッドまたはマイクロフォン）と、表示装置３４（たとえば、とりわけ、ＣＲＴモニタ、ＬＣＤ表示パネルまたはスピーカ）が含まれる。しかし、たとえばいくつかのサーバ実施形態など、コンピュータ３０のいくつかの実施形態では、直接のユーザ入出力がコンピュータによってサポートされない場合があることを諒解されたい。
【００２４】
追加の記憶域のために、コンピュータ３０には、１つまたは複数の大容量記憶装置３６、たとえば、とりわけ、フロッピまたは他の取外し可能ディスク駆動装置、ハード・ディスク装置、直接アクセス記憶装置（ＤＡＳＤ）、光ディスク駆動装置（たとえば、ＣＤ駆動装置、ＤＶＤ駆動装置など）または、テープ駆動装置も含めることができる。さらに、コンピュータ３０には、ネットワークに結合された他のコンピュータとの情報の通信を可能にするために、１つまたは複数のネットワーク３８（たとえば、とりわけ、ＬＡＮ、ＷＡＮ、無線ネットワークまたはインターネット）とのインターフェースを含めることができる。コンピュータ３０には、通常は、当技術分野で周知の通り、プロセッサ３１とメモリ３２、ユーザ入力装置３３、表示装置３４、大容量記憶装置３６及びネットワーク３８のそれぞれとの間のアナログまたはディジタルの適当なインターフェースが含まれることを諒解されたい。
【００２５】
コンピュータ３０は、オペレーティング・システム４０の制御下で動作し、さまざまなコンピュータ・ソフトウェア・アプリケーション、コンポーネント、プログラム、オブジェクト、モジュール、データ構造など（たとえば、とりわけ、コンパイラ４２、仮想マシン４４、ソース・コード４６及びクラス・ファイル４８）を実行するか、他の方法でこれらを利用する。さらに、さまざまなアプリケーション、コンポーネント、プログラム、オブジェクト、モジュールなどは、たとえば分散コンピューティング環境またはクライアント−サーバ・コンピューティング環境など、ネットワーク３８を介してコンピュータ３０に結合された別のコンピュータ内の１つまたは複数のプロセッサ上で実行でき、これによって、コンピュータ・プログラムの機能を実装するのに必要な処理を、ネットワーク上の複数のコンピュータに割り振ることができる。
【００２６】
一般に、本発明の実施例を実装するために実行されるルーチンは、オペレーティング・システムの一部として実装されるものであれ、特定のアプリケーション、コンポーネント、プログラム、オブジェクト、モジュールまたは命令のシーケンスとして実装されるものであれ、本明細書では「コンピュータ・プログラム」または単に「プログラム」と呼称する。コンピュータ・プログラムには、通常は、さまざまな時点でコンピュータ内のさまざまなメモリ及び記憶装置に存在し、コンピュータ内の１つまたは複数のプロセッサによって読み取られ、実行される時に、そのコンピュータに本発明のさまざまな態様を実施するステップまたは要素を実行するのに必要なステップを実行させる、１つまたは複数の命令が含まれる。さらに、本明細書では、完全に機能するコンピュータ及びコンピュータ・システムに関して本発明を説明するが、本発明のさまざまな実施形態が、さまざまな形のプログラム製品として配布可能であり、本発明が、配布の実行に実際に使用される信号担持媒体の特定の種類に無関係に同等に適用されることを、当業者は諒解するであろう。信号担持媒体の例には、とりわけ、揮発性及び不揮発性のメモリ・デバイス、フロッピ及び他の取外し可能ディスク、ハード・ディスク装置、光ディスク（たとえば、ＣＤ−ＲＯＭ、ＤＶＤなど）などの記録可能型媒体と、ディジタル通信リンク及びアナログ通信リンクなどの伝送型媒体とが含まれるが、これに制限されない。
【００２７】
さらに、以下で説明するさまざまなプログラムは、本発明の特定の実施形態でそれらが実施される目的の応用分野に基づいて識別することができる。しかし、以下の特定のプログラムの命名法は、単に便宜のために使用されるものであり、したがって、本発明は、そのような命名法によって識別または暗示される特定の応用分野だけでの使用に制限されないことを諒解されたい。
【００２８】
図１及び図２に示された例の環境が、本発明を制限する目的のものでないことを、当業者は諒解するであろう。実際、当業者は、他の代替ハードウェアまたはソフトウェア環境を、本発明の範囲から逸脱せずに使用することができることを諒解するであろう。
【００２９】
関係に基づくオブジェクトの順序付け
本明細書で説明する実施例は、全般的に、データ・オブジェクト間のアクセス関係に基づいてオブジェクト・ヒープ内のデータ・オブジェクトを編成することによって動作する。オブジェクト・ヒープには、コンピュータ・プログラムのための作業メモリを表すコンピュータ・メモリのどのセグメントでも含めることができ、通常は、コンピュータ・プログラムの実行中にデータが動的に割り振られ、使用され、管理されるメモリのセグメントを含めることができる。必ずではないが、通常、オブジェクト・ヒープは、ガーベジ・コレクタによって管理され、ガーベジ・コレクタは、ガーベジ・コレクションが実行される時には必ず、コンピュータ・プログラムと並列に走行するか、コンピュータ・プログラムの実行を停止させる「ストップ・ザ・ワールド（stop-the-world）」コレクタとして動作するか、単にプログラムの特定のスレッドとすることができる。当技術分野で全般的に既知のさまざまな種類のガーベジ・コレクタを、本発明との一貫性を有する形で使用することができる。
【００３０】
本明細書で説明するアクセス関係は、通常は、データ・オブジェクトへのアクセスの有望な時間的な近接性に少なくとも部分的に基づくか、異なるデータ・オブジェクトのアクセスの相対頻度に少なくとも部分的に基づいて、複数のデータ・オブジェクトの間に存在する。たとえば、アクセス関係は、２つのオブジェクトの間に親子関係が存在する時すなわち、あるオブジェクト（親）が他方のオブジェクト（子）のメモリのある部分にアクセスする時に、必ず定義することができる。子も、それが親である場合に（それ自体がこれらの子の親である他のオブジェクトの親である場合も含めて）、それ自体の関係を有することができる。本明細書で説明する形でオブジェクトを編成することによって、多重レベル・メモリ・アーキテクチャでのキャッシュ・ミスまたはページ・フォルトが減る。というのは、短い時間枠内でアクセスされるオブジェクトが、メモリ内の同一の編成ブロック（たとえば、キャッシュ・ラインまたは仮想メモリ・ページ）内に存在する可能性が高まるからである。
【００３１】
本明細書で説明するいくつかの実施例では、同一のアクセス連鎖に含まれる複数のデータ・オブジェクトすなわち、特定のルート・オブジェクトがアクセスされた後にさまざまなシーケンスで参照されるオブジェクトを、それらのオブジェクトの間の時間的近接性に基づいて、メモリ内（たとえば、オブジェクト・ヒープ内の連続するメモリ・セグメント内）で一緒に論理的にグループ化することができる。さらに、いくつかの実施例では、そのようなグループ内の特定のオブジェクトを、相対アクセス頻度またはオブジェクトがアクセスされる順序に基づいて、互いに相対的に配置することができる。
【００３２】
以下で説明する特定の実施例では、Sun Microsystems社によって開発されたJavaプログラミング環境で実行されるコンピュータ・プログラムの性能の最適化における本発明の具体的な応用例に焦点を合わせる。しかし、本発明は、オブジェクト・ヒープを使用する他のオブジェクト指向プログラミング環境での適用可能性を有することを諒解されたい。さらに、すべてのデータ（オブジェクト指向の意味で「オブジェクト」と呼ばれない時であっても）をオブジェクトとして表現できる場合、本発明は、非オブジェクト指向プログラミング環境での適用可能性をも有する。したがって、本発明は、以下で説明する特定のJavaベースの実施形態に制限されない。
【００３３】
図３は、本発明との一貫性を有する関係ベースのオブジェクト順序付けを実装するために例の実施例で使用される主要なソフトウェア・コンポーネントを示す図である。具体的に言うと、図３には、仮想マシン４４に結合されたコンパイラ４２が示されており、このコンパイラは、入力としてソース・コード４６を受け取り、それに応答して、仮想マシン４４によって実行できる１つまたは複数のクラス・ファイル４８を出力する。
【００３４】
コンパイラ４２、仮想マシン４４、ソース・コード４６及びクラス・ファイル４８のそれぞれは、さまざまな既知のJava言語仕様との互換性を有するように構成される。ソース・コード４６は、コンピュータ・プログラムの人間可読Javaソース・コード表現である。コンパイラ４２は、ブロック５０に示されるように、Javaのソース・コード４６から、Javaコンピュータ・プログラムの中間表現を表す複数のバイトコードを生成するのに使用される。
【００３５】
生成されたバイトコードは、１つまたは複数のクラスに編成され、このクラスは、仮想マシン４４によるコンピュータ・プログラムの実行中に割り振られ、使用されるオブジェクトのテンプレートを表す。クラスは、実行可能バイトコードとそのような実行可能コードが頼るデータの両方を含むクラス・ファイルに編成される。オブジェクトに関する他の情報も、通常は、当技術分野で既知の通りクラス・ファイルに含まれる。
【００３６】
生成されたクラスは、クラス検証ブロック５１によって処理され、クラス検証ブロック５１は、クラスに対するさまざまな検証動作及び分析動作を実行して、クラスにエラーがなく、クラスがさまざまな実行時エラーを引き起こさないようにし、また、Java言語のすべてのセキュリティ要件が満たされるようにする。バイトコード生成とクラス検証の両方が周知であり、したがって、本明細書でこれ以上詳細に説明する必要がないことを諒解されたい。
【００３７】
検証されたクラスは、オブジェクト・アクセス・プロファイリング・ブロック５２に渡されて、本発明との一貫性を有する形でのアクセス・プロファイリングが実行される。具体的に言うと、クラスのアクセス・パターンは、クラス内で定義されている実行可能コードのシミュレーションに基づいて生成される（図４及び図５に関して下で詳細に説明する）。オブジェクト・アクセス・プロファイリング・ブロック５２の出力は、１つまたは複数のクラス・ファイル４８である。下で詳細に説明するように、このようなクラス・ファイルには、それに埋め込まれたプロファイリングされたアクセス情報が含まれる場合があるが、いくつかの実施形態では、そのような情報がクラス・ファイルに格納されない場合があり、これによって、オブジェクト・アクセス・プロファイリング・ブロック５２でのオブジェクト・アクセス・プロファイリングが実行されなくなる。
【００３８】
生成されたクラス・ファイルは、後に実行するために第三者に配布するかなんらかの持続性媒体に格納することができ、また、仮想マシン４４によって即座に実行することができる。仮想マシン４４によって、Java仮想マシン（ＪＶＭ）が実装されるが、これは、基本的には、特定のコンピュータ・プラットホーム上で仮定のマイクロプロセッサの動作をエミュレートするものである。異なる仮想マシンを使用して、クラス・ファイルを異なるプラットホーム上で実行できるようにすることが可能である。さらに、コンパイラ４２と仮想マシンは、同一のコンピュータ・システム上に存在する必要がないことを諒解されたい。
【００３９】
クラス・ファイルは、当技術分野で一般に既知の形で、クラス・ローダ・コンポーネント５４を使用して、仮想マシン４４によってロードされる。しかし、図示の実施例のクラス・ローダ・コンポーネント５４は、ロードされたクラス・ファイルに関するプロファイリングされたアクセス情報がコンパイラによってクラス・ファイルに埋め込まれていない場合に、そのクラス・ファイルをオブジェクト・アクセス・プロファイリング・ブロック５６に渡して、そのような情報を得ることもできる。さらに、クラス・ローダ・コンポーネント５４は、追加のクラス検証を実行して、やはり当技術分野で既知の形で、Javaセキュリティ規則に合致することを検証することもできる。
【００４０】
コンピュータ・プログラムの実行中に作業記憶域を提供するために、仮想マシン４４には、「From」区画６０と「To」区画６２を含むオブジェクト・ヒープ５８が含まれる。データ記憶域は、実行時中に、作業記憶域として使用するためにFrom区画６０内で割り振られる。その後、ガーベジ・コレクタ（ガーベジ・コレクション論理７０によって表される）が、到達可能なオブジェクトをFrom区画６０からTo区画６２へ周期的にコピーし、From区画とTo区画をスワップし、その結果、前のTo区画が新しいFrom区画になり、前のFrom区画が新しいTo区画になるようにする。このようなオブジェクト・ヒープ管理アルゴリズムを、コピー型ガーベジ・コレクションと称する。しかし、他のオブジェクト・ヒープ管理アルゴリズムを使用することができるので、他のオブジェクト・ヒープ編成を使用することもできる。
【００４１】
クラス・ローダ・コンポーネント５４によるクラスのロードに応答して、１つまたは複数のスレッド６４が、インタープリタ６３によって実行され、インタープリタ６３は、バイトコードのそれぞれについて、仮想マシンが動作するプラットホームに適したネイティブ・コードを生成する。したがって、各スレッドは、異なるメソッド呼び出しを介するコヒーレンシを維持するのに必要なデータが維持される呼出しスタック６６を割り振られる。さらに、ブロック６８に示されているように、必要であれば、追加のオブジェクト・アクセス・プロファイリングを実行時中に実行することができる。オブジェクト・ヒープは、ガーベジ・コレクション論理７０によって管理され、ガーベジ・コレクション論理７０は、図示の実施例ではコピー型ガーベジ・コレクタである。
【００４２】
図３からわかるように、各スレッドは、単一のガーベジ・コレクタ・スレッドによって管理されるオブジェクト・ヒープを共用する。同一のコンピュータ・システム上で同時に実行される複数のコンピュータ・プログラムも、同一のオブジェクト・ヒープを共用することができる。しかし、図示の実施例では、追加のコンピュータ・プログラムは、別々のオブジェクト・ヒープ（及び関連するガーベジ・コレクタ）を割り振られるが、それらはこの図には示されていない。
【００４３】
仮想マシン４４によるJavaバイトコードの解釈と実行は、当技術分野で周知の動作であることが諒解されるであろう。他の代替案の中でもジャストインタイム・コンパイルを含む、仮想マシンに対する追加の変更も、仮想マシン４４内で実施することができる。
【００４４】
上で述べたように、本発明との一貫性を有するオブジェクト・アクセス・プロファイリングは、コンピュータ・プログラムの寿命のうちのさまざまな時、たとえば、コンパイル中（オブジェクト・アクセス・プロファイリング・ブロック５２によって表される）、ロード中（オブジェクト・アクセス・プロファイリング・ブロック５６によって表される）または実行中（ブロック６８によって表される）に実行することができる。通常、プロファイリングは、そのような期間のうちのただ１つで実行されるが、コンパイル中にオブジェクト・アクセス・プロファイリングへのアクセスを有しない他のシステムによって生成されたクラス・ファイルを仮想マシンが実行する可能性があると予想される場合には、たとえばクラス・ロード中に、オブジェクト・アクセス・プロファイリングが実行されたことと、適当なアクセス情報が生成されたことを調べるために検査する必要が生じる場合があることを諒解されたい。一般に、プロファイリングは、コンピュータの実行中の性能ペナルティを最小にするために、たとえばコンパイル中またはロード中など、処理のうちでできる限り早期に実行することが好ましい。
【００４５】
本発明との一貫性を有するオブジェクト・アクセス・プロファイリングを実行するのに適したルーチンの１つを、図４及び図５の１００に示す。図４からわかるように、ルーチン１００は、必要であればクラスを取り出すことによって、ブロック１０２で開始される。上で述べたように、オブジェクト・アクセス・プロファイリングは、すでにクラスがロードされた後、または、クラス・ファイルに格納されたプログラム・コードの実行中に、実行することができる。そのような場合には、クラスの取出が不要になる可能性がある。
【００４６】
次に、ブロック１０４で、ロード／ストア・カウント・テーブルとアクセス順序木データ構造を初期設定する。ロード／ストア・カウント・テーブルは、あるクラスで参照されるオブジェクトのそれぞれへの予測されたアクセスのカウントを、ロード・アクセスとストア・アクセスによって分離して維持するのに使用される。たとえば、図６からわかるように、ロード／ストア・カウント・テーブルに適したデータ構造の１つが、テーブル７５に示されており、これには、それぞれにオブジェクトＩＤフィールド７８、ロード・カウント・フィールド８０及びストア・カウント・フィールド８２が含まれる、複数の項目７６が含まれる。オブジェクトＩＤフィールド７８には、参照されるオブジェクトを識別することのできる一意の識別子が含まれる。プロファイリング情報に基づいて、ロード・カウント・フィールド８０には、ロード型のアクセス（たとえば、Javaのaload動作とget field動作）の回数が格納され、ストア・カウント・フィールド８２には、同様に、ストア型アクセス（たとえば、Javaのastore動作とput field動作）の回数が格納される。通常、テーブル７５は、すべての項目のデータがクリアされた状態で初期設定される。
【００４７】
他のデータ構造を使用して、とりわけ連係リストとハッシュ・テーブルを含む、所与のクラスに関するロード・アクセス及びストア・アクセスの数を表すことができることを諒解されたい。さらに、いくつかの実施形態では、ロード・アクセスとストア・アクセスの別々のカウントを維持する必要がなく、これによって、ロード・カウント・フィールド８０及びストア・カウント・フィールド８２を同一のフィールドに組み合わせることができることを諒解されたい。さらに、下で詳細に説明するように、あるオブジェクトに関するアクセス情報は、アクセス順序木データ構造内で維持することができ、これによって、テーブル７５または同等のデータ構造が不要になる。
【００４８】
図７は、複数のノード８８が依存するルート・オブジェクトまたはルート・ノード８６を含む、アクセス順序木８５の１例を示す図である。ルート・ノード８６は、その下ですべてのオブジェクトが特定のメソッドによって参照される、木の出発点を表す。ノード８８は、一般に、ルート・ノード８６によって表される特定のメソッド内のフィールドまたは参照されるオブジェクトを表す。ノード８８のうちのいくつかを、他のノード８８が参照でき、参照されるオブジェクトの連鎖が表されることに留意されたい。たとえば、アクセス順序木８５で表現される例のクラスの「this」オブジェクトについて、「this」オブジェクトから「table[]」オブジェクト、「tempObject」オブジェクト及び「next」オブジェクトへの呼出しまたはアクセスの連鎖が図示されており、これは、例のクラスによって定義されるオブジェクトの実行中に、オブジェクト「table[]」、「tempObject」及び「next」が、「this」オブジェクトへの参照の直後に順番に参照されることを表す。
【００４９】
各ノード内には、呼出しアクセス連鎖内のオブジェクトのオブジェクト識別子を単純に格納することができる。他の実施形態では、各ノード内に、そのオブジェクトに対するアクセスの数を表すアクセス・カウントが含まれることが望ましい場合がある。そのようなアクセス・カウントは、ロード及びストアによって分離するか、一緒にグループ化することができる。上で述べたように、この情報は、別々のアクセス・テーブルの使用に対する代替物として、ノード内に格納することができる。
【００５０】
さらに、各木は、通常は、そのクラスについて定義される各メソッドによって参照されるオブジェクトによって分離される。そのような場合には、たとえば、ルート・ノード８６と各フィールドのノード８８の間に追加ノードを挿入し、フィールド・ノードをメソッドによって分類できるようにすることが望ましい場合がある。さまざまなデータ構造、たとえば連係リストなどを使用して、本発明との一貫性を有する呼出し木を表すことができることを諒解されたい。通常、アクセス順序木の初期設定には、子ノードを関連付けられていないルート・ノード・オブジェクトの初期設定が含まれる。
【００５１】
図４を参照すると、ロード／ストア・カウント・テーブルとアクセス順序木が初期設定された後に、制御をブロック１０６に移して、クラス内の各バイトコードを分析してロード／ストア・カウント・テーブルを構築するループに入る。具体的に言うと、クラス内の各バイト・コードについて、制御をブロック１０８に移して、バイトコードが新しいオブジェクトを操作するかどうかすなわち、バイトコードが、ロード／ストア・カウント・テーブルに対応する項目を有しないオブジェクトを参照するかどうかを判定する。そうである場合には、制御をブロック１１０に移して、新しいオブジェクトのためにロード／ストア・カウント・テーブルに新しい項目を追加する。これには、新しい項目へのオブジェクト識別子の格納と、ロード・カウント及びストア・カウントの０への初期設定が含まれる。その後、制御をブロック１１２に移して、バイトコードがオブジェクトに対するロード・アクセスを実行するかどうかを判定する。また、ブロック１０８に戻って、バイトコードが新しいオブジェクトを操作しない場合には、制御は、ブロック１１０を迂回して、ブロック１１２に直接に移される。
【００５２】
バイトコードが、オブジェクトに対するロード型のアクセスを実行する場合には、制御をブロック１１４に移して、そのオブジェクトのロード・カウントを増分する、すなわち、オブジェクトに対応する項目のロード・カウント・フィールドに格納された値を１つ増やす。その後、制御をブロック１０６に戻して、追加のバイトコードを処理する。
【００５３】
ブロック１１２に戻って、バイトコードがオブジェクトに対するロード・アクセスを実行しない場合、制御をブロック１１６に移して、バイトコードがオブジェクトに対するストア型のアクセスを実行するかどうかを判定する。そうでない場合には、このバイトコードのそれ以上の処理を行う必要はなく、制御をブロック１０６に戻す。しかし、バイトコードがオブジェクトに対するストア・アクセスを実行する場合には、制御をブロック１１８に移して、そのオブジェクトのストア・カウントを増分した後に、ブロック１０６に制御を返す。
【００５４】
クラスのすべてのバイトコードを処理した後に、ブロック１０６から図５のブロック１２０に制御を移す。ブロック１２０から、クラスのアクセス順序木を構築するためにクラスの各バイトコードを処理する、第２のループが開始される。
【００５５】
各バイトコードについて、制御をブロック１２２に移して、シミュレーション・スタックを使用してバイトコードを検査する。具体的に言うと、バイトコード実行の効果をシミュレートして、「シミュレートされた」呼出しスタックを構築する。
【００５６】
シミュレーション・スタックを用いてバイトコードを検査した後に、制御をブロック１２４に移して、バイトコードが、そこからロードまたはストアを行うオブジェクト参照を使用するロード動作またはストア動作であるかどうか、すなわち、バイトコードが、ロード動作またはストア動作を実行するために、本明細書で「参照されるオブジェクト」と称する別のオブジェクトにアクセスするかどうかを判定する。そうでない場合には、制御をブロック１２０に戻し、追加のバイトコードを処理する。
【００５７】
しかし、バイトコードが、オブジェクト参照を使用するロード動作またはストア動作である場合には、制御をブロック１２６に移して、この参照されるオブジェクトをロードまたはストアした前のオブジェクトが存在するかどうかを判定する。本明細書で使用する前のオブジェクトとは、問題の参照されるオブジェクトへのアクセスに到達するために以前にアクセスされたオブジェクトを表す。したがって、前のオブジェクトが存在するならば、呼出し連鎖またはアクセス連鎖が、前のオブジェクトと参照されるオブジェクトの間で定義される。
【００５８】
まず、参照されるオブジェクトに関して前のオブジェクトがまだ存在しないと仮定すると、制御をブロック１２８に移して、参照されるオブジェクトがアクセス順序木にすでに存在するかどうかを判定する。そうでない場合には、参照されるオブジェクトのために新しいノードを木に追加し、制御をブロック１３２に移して、参照されるオブジェクトのアクセス・カウントを増分する。ブロック１２８に戻って、そのオブジェクトがすでに木に存在する場合には、新しいノードを追加せず、制御を直接にブロック１３２に移して、アクセス・カウンタを増分する。
【００５９】
上で述べたように、アクセス・カウントは、木の各ノード内で維持することができる。代替案では、アクセス・カウント情報を、ロード／ストア・カウント・テーブル内で維持することができ、これによって、ブロック１３２が不要になる。
【００６０】
参照されるオブジェクトのアクセス・カウントを増分した後に、制御をブロック１３４に移して、バイトコードがロード動作であるかどうかを判定する。そうでない場合には、制御をブロック１２０に返して、追加のバイトコードを処理する。しかし、バイトコードがロード動作である場合には、制御をブロック１３６に移して、前のオブジェクトに参照されるオブジェクトをセットし、基本的に木を１レベル下にトラバースして、後続のロード動作またはストア動作に関する前のオブジェクトとして、参照されるオブジェクトをセットする。その後、制御をブロック１２０に返して、追加のバイトコードを処理する。
【００６１】
ブロック１２６に戻って、ロード動作またはストア動作に関して前のオブジェクトが存在する場合には、制御をブロック１３８に移して、参照されるオブジェクトが、前のオブジェクトの子のリストに存在するかどうかを判定する。そうである場合には、制御を直接ブロック１３２に移して、参照されるオブジェクトのアクセス・カウントを増分する。しかし、参照されるオブジェクトが子のリストに存在しない場合には、まず制御をブロック１４に移して、前のオブジェクトの子のリストに参照されるオブジェクトのノードを追加し、参照されるオブジェクトが、前のオブジェクトへのアクセスの直後にアクセスされることによって前のオブジェクトとのアクセス関係を有することを示す。
【００６２】
クラスのすべてのバイトコードを処理した後に、そのクラスのアクセス順序木データ構造を構築し、そのアクセス順序木から、クラス内のどのオブジェクトがどの順序でアクセスされるかを確認することができる。その後、制御をブロック１２０からブロック１４２に移して、各ノードの子を、そのアクセス・カウンタに基づいて順序付ける。具体的に言うと、各ノードについて、その子は、これらのノードのそれぞれに格納されたアクセス・カウントに基づいてアクセス木内で順序付けられ、最も高いアクセス・カウントを有する子が、最初に配置され、他の子は、アクセス・カウントの降順でそれに続く。したがって、この２次レベルの順序付けによって、より頻繁にアクセスされる子ノードが、親ノードの近くに編成されて、より頻繁にトラバースされる呼出し連鎖またはアクセス連鎖が、互いにできる限り近くに格納されるようになる。
【００６３】
各ノードの子が、上で説明した形で編成された後に、制御をブロック１４４及び１４６に移して、任意選択として、後に実行時中に使用するために、クラス・ファイルに最近生成されたプロファイリングされたアクセス情報を格納する。しかし、オブジェクト・アクセス・プロファイリングが実行時に実行される場合には、クラス・ファイル内でオブジェクトを順序付けることと、アクセス情報をクラス・ファイルに格納することが不要になる可能性があることを諒解されたい。したがって、そのような状況では、ブロック１４４及び１４６を省略することができる。
【００６４】
ブロック１４４では、クラス・ファイル内のオブジェクト参照を、アクセス順序木に従って、したがって、木に固有のアクセス情報を使用して順序付け、これによって、特定の連鎖またはシーケンスで（すなわち、時間的近接性を伴って）アクセスされるオブジェクトへの参照が、互いに近くに順序付けられてグループを形成し、そのようなグループ内のオブジェクト（たとえば、同一の親オブジェクトから依存する兄弟）への参照は、さらに、相対的なアクセス頻度によって順序付けられる。この種の順序付けは、単純に、現在処理されているノードの最も左側の未処理の子としてクラスに格納された次のノードを再帰的に選択するアルゴリズムを介して木をトラバースし、すべての子ノードを処理し終えた時に親ノードへ戻ることによって、実行できることを諒解されたい。
【００６５】
その結果、上で説明したアルゴリズムを使用して、クラス・ファイル自体が、関連するオブジェクトへの参照が互いに近くに配置される形で編成される。その結果、この形で最適化されたクラス・ファイルの、実行時中のオブジェクト・ヒープへの後続のロードは、改良されたガーベジ・コレクションに関連する利益と独立に、オブジェクト・ヒープのFrom区画内のキャッシュ・ミスまたはページ・フォルトを減らす能力も有する。
【００６６】
ブロック１４４で、クラス内のオブジェクト参照を順序付けた後に、制御をブロック１４６に移して、クラス・ファイルにロード／ストア・カウント・テーブルとアクセス順序木を格納する。その後、プロファイリングが完了し、ルーチン１００が終了する。
【００６７】
図８は、図３のコンパイラ４２によって出力される、図４及び図５のルーチン１００によって生成されたプロファイリングされたアクセス情報を含む、Javaのクラス・ファイル１５０の例を示す図である。クラス・ファイル１５０は、Javaの「可搬性」すなわち、Java仮想マシン（ＪＶＭ）をサポートするプラットホームの基礎となるアーキテクチャに無関係に、規格に準拠するＪＶＭと共にすべてのシステムで走行する能力を可能にする、Javaクラスの標準外部表現である。クラス・ファイル１５０には、複数のデータ・フィールド１５２ないし１７３が含まれる。「magic（マジック）」データ・フィールド１５２は、このファイルをJavaクラス・ファイルとして識別できるようにする、特定の任意のビット・シーケンスである。このビット・シーケンスは、ファイルがJavaクラス・ファイルとして認識されるようにするために、１６進値0xCAFEBABEを有しなければならない。また、「minor version（マイナ・バージョン）」データ・フィールド１５４及び「major version（メジャー・バージョン）」データ・フィールド１５６は、クラス・ファイルのバージョンを識別するためのフィールドである。
【００６８】
「constant pool（定数プール）」データ・フィールド１５９では、可変長の項目のリストが定義され、この定数プールのサイズは、「constant pool count（定数プール・カウント）」データ・フィールド１５８によって識別される。各項目は、このクラス・ファイル内の他の場所で使用される定数または外部参照を表す。定数プールを使用することによって、値の単一の出現によってクラス・ファイル内の複数の必要を満たすことができるようになる。
【００６９】
「access flags（アクセス・フラグ）」データ・フィールド１６０では、他のクラスからこのクラスを参照するのに必要なオーソリティを含む、クラス・ファイルによって表されるクラスの基本特性の一部が定義される。「this class（このクラス）」データ・フィールド１６２は、このクラスの名前を含む項目の定数プールへのインデックスであり、「superclass（スーパークラス）」データ・フィールド１６４は、このクラスのスーパークラスの名前を含む項目の定数プールへのインデックスである。
【００７０】
「interfaces（インターフェース）」データ・フィールド１６７では、このクラスで実装されるインターフェースの名前を識別する定数プール・インデックス値のリストが定義され、そのサイズは、「interfaces count（インターフェース・カウント）」データ・フィールド１６６によって識別される。インターフェースは、Javaでは、他のオブジェクト指向言語で提供される「多重軽傷」と同一の機能の一部を達成するために使用される。
【００７１】
「fields（フィールド）」データ・フィールド１６９では、このクラスのフィールドを記述した可変長の項目のリストが定義され、そのサイズは、「fields count」データ・フィールド１６８によって識別される。フィールドの名前と、存在する場合にはそのインスタンス化値は、定数プールへのインデックスとして表される。
【００７２】
「methods（メソッド）」データ・フィールド１７１では、このクラスのメソッドを記述する可変長の項目のリストが定義され、そのサイズは、「methods count（メソッド・カウント）」データ・フィールド１７０によって識別される。フィールドの名前は、定数プールへのインデックスとして表される。各メソッドの実際の解釈可能コード（すなわち、バイトコードの組）は、そのメソッド項目の末尾に付加される。
【００７３】
「attributes（属性）」データ・フィールド１７３では、クラスの他の特性のためのリポジトリが定義され、そのサイズは、「attributes count（属性カウント）」データ・フィールド１７２によって識別される。
【００７４】
クラスによって参照されるオブジェクトへの参照は、fieldsデータ・フィールド１６９に格納され、図５のブロック１４４に関して上で説明した形で参照が編成されるのは、このデータ・フィールド内である。クラスのプロファイリングされたアクセス情報は、通常は、図８のテーブル７５及びアクセス順序木８５の配置によって表されるように、クラス・ファイルのattributesデータ・フィールド１７３に格納される。
【００７５】
図９は、ガーベジ・コレクション論理７０（図３）によって実行されるコレクタ・スレッド２００を示す図である。一般に、コレクタ・スレッドは、ブロック２０２で初期設定されるが、これには、通常、メモリ内のオブジェクト・ヒープの割振りが含まれる。次に、ブロック２０４で、コレクタ・スレッドは、ガーベジ・コレクションの技術で周知の通り、トリガをかけるイベント、たとえば、タイマの満了、所定の閾値未満への使用可能メモリの減少などを待つ。
【００７６】
トリガをかけるイベントが発生した後に、ブロック２０６でコレクション・サイクルを初期設定する。次に、ルート・コピー・ルーチン２０８を実行して、オブジェクト・ヒープのFrom区画からTo区画へ、到達可能なすべてのオブジェクトをコピーする。次に、区画スワップ・ルーチン２１０を実行して、To区画とFrom区画をスワップし、その結果、To区画にコピーされたオブジェクトが、本質的にFrom区画に「返される」ようにする。その結果、ルート・コピー・ルーチン２０８でTo区画にコピーされなかったすべてのオブジェクトは、次のガーベジ・コレクション・サイクルで、新しいオブジェクトが前のFrom区画にコピーされる際に、効果的に破棄される。
【００７７】
図１０及び１１は、本発明との一貫性を有する形で関係ベースのオブジェクト順序付けを実施する際のルート・コピー・ルーチン２０８の動作を示す図である。図１０からわかるように、ルート・コピー・ルーチン２０８は、プロファイリングされたアクセス情報が、オブジェクト・ヒープを使用するコンピュータ・プログラム内の各クラスについて使用可能になるようにするループを開始することによって、ブロック２１２で開始される。そのようなクラスのそれぞれについて、制御をブロック２１２からブロック２１４に移して、上でルーチン１００によって生成されたプロファイリングされたアクセス情報がクラス・ファイルに含まれるかどうかを判定する。そうである場合には、このクラスのそれ以上の処理を行う必要はなく、制御をブロック２１２に返して、追加のクラスを処理する。
【００７８】
しかし、そのようなアクセス情報が使用可能でない場合には、そのクラスについてオブジェクト・アクセス・プロファイリングを行うルーチン１００を呼び出し、その後、ブロック２１６で、相対アクセス頻度に基づいて、クラス・オブジェクト参照フィールドを再順序付けする。その後、制御をブロック２１２に返して、追加のクラスを処理する。
【００７９】
すべてのクラスを処理した後に、各クラスのプロファイリングされたアクセス情報が、ガーベジ・コレクタから使用可能になる。その後、制御をブロック２１８に移して、現在呼出しスタック上に配置されているオブジェクト参照を処理するループを開始する。上で述べたように、呼出しスタックには、通常は、コンピュータ・プログラム内の１つまたは複数のメソッドの実行中に使用されるオブジェクトへの参照が含まれる。コンピュータ・プログラムによってメソッドが呼び出される時には、必ず、そのメソッドによって使用されるパラメータが、そのようなパラメータを含む項目を呼出しスタック上にプッシュすることによって、そのメソッドに渡される。さらに、呼出し元メソッドに関する戻り情報が、その項目に追加され、その結果、プログラムは、呼び出されたメソッドが終了した後に再開できるようになる。呼び出されたメソッドが中止または完了した時には、必ず、それのための項目が、呼出しスタックからポップされ、情報が呼出し元メソッドに返される。呼出しスタックの使用及び動作は、当技術分野で周知である。
【００８０】
ブロック２１８では、特にFORループを開始して、現在呼出しスタック上にあるオブジェクト参照のそれぞれを、２つのリストすなわち、呼出し連鎖またはアクセス連鎖に見つかるすべてのオブジェクトを含む「順序」リストと、他のすべてのオブジェクトの「孤児（orphaned）」リストにソートする。したがって、そのような参照のそれぞれについて、制御をブロック２２０に渡して、そのオブジェクト参照に関する参照されるオブジェクトが、そのクラスのアクセス順序木内にあるかどうかを判定する。
【００８１】
そうである場合には、制御をブロック２２２に移して、参照されるオブジェクトを「順序」リストに追加する。そうでない場合には、ブロック２２４で、参照されるオブジェクトを「孤児」リストに追加する。すべてのオブジェクトをこの形で処理した後に、ブロック２１８からブロック２２６及び２２８に制御を移して、各リストのオブジェクトを別々に処理する。
【００８２】
ブロック２２６では、「順序」リスト内のオブジェクトを処理し、基本的に、「順序」リスト内の各オブジェクトによって参照されるオブジェクトを、アクセス順序木によって定義されるアクセス順序でTo区画にコピーする。さらに、この時点で、From区画内の元のオブジェクトのそれぞれに、To区画内のそのオブジェクトの新しいコピーを指す転送ポインタを追加する。その結果、From区画内のオブジェクトの古いコピーへの参照のすべてが、単にそのための転送ポインタに従うことによって、そのオブジェクトの新しいコピーを突きとめることができる。
【００８３】
「孤児」リストに含まれるオブジェクトについて、ブロック２２８で、各オブジェクトをTo区画にコピーし、やはりFrom区画内のオブジェクトの元のコピーに転送ポインタを追加する。「孤児」リスト内のオブジェクトは、アクセス順序木上に存在しないので、そのようなオブジェクトの特定の編成は使用されない。
【００８４】
ブロック２２６及び２２８の完了時に、呼出しスタック上のオブジェクト参照の処理が完了し、制御を図１１のブロック２３０に移して、オブジェクト・ヒープ内のすべての静的オブジェクトを処理するループを開始する。当技術分野で既知の通り、静的オブジェクトは、通常は、大域的にアクセス可能なオブジェクトである。
【００８５】
ブロック２３０で、静的オブジェクトのそれぞれを処理するループが開始される。そのようなオブジェクトのそれぞれについて、制御をブロック２３２に移して、その静的オブジェクトに含まれる参照のそれぞれを処理する。そのような参照のそれぞれについて、制御をブロック２３４に移して、その参照によって参照されるオブジェクトが、すでにTo区画にコピーされているかどうかを判定する。そうである場合には、制御をブロック２３２に戻して、静的オブジェクト内の追加の参照を処理する。しかし、参照されるオブジェクトがTo区画内にない場合には、制御をブロック２３６に移して、参照されるオブジェクトをTo区画にコピーし、To区画内の新しいコピーを指す転送ポインタを、From区画内の元のコピーに追加する。その後、制御をブロック２３２に戻して、追加の参照を処理する。
【００８６】
現在の静的オブジェクト内のすべての参照を処理した後に、ブロック２３２は、制御をブロック２３０に戻して、上で説明した形で追加の静的オブジェクトを処理する。その後、すべての静的オブジェクトを処理した後に、ブロック２３０は、制御をブロック２３８に移して、To区画内の到達可能なオブジェクトによって参照されるすべてのオブジェクトも、To区画にコピーされるようにする。
【００８７】
具体的に言うと、ブロック２３８では、制御をブロック２４０に渡してオブジェクト内の参照のそれぞれを処理することによって、To区画内のオブジェクトのそれぞれを処理する。そのような参照のそれぞれについて、制御をブロック２４２に移して、参照されるオブジェクトがFrom区画内にあるかどうかを判定する。そうでない場合には、制御をブロック２４０に戻して、現在処理されているオブジェクト内の追加の参照を処理する。しかし、参照されるオブジェクトがまだFrom区画内にある場合には、制御をブロック２４４に移して、参照されるオブジェクトが現在転送ポインタを有するかどうかを判定する。
【００８８】
そうでない場合には、参照されるオブジェクトは、まだTo区画にコピーされておらず、したがって、ブロック２４６を実行して、参照されるオブジェクトをTo区画にコピーし、From区画内の元のコピーに転送ポインタを追加する。その後、制御をブロック２４０に戻して、オブジェクト内の追加の参照を処理する。
【００８９】
しかし、参照されるオブジェクトが転送ポインタを有する場合には、参照されるオブジェクトは、すでにTo区画にコピーされており、したがって、ブロック２４８を実行して、現在処理されているオブジェクト内の参照を、転送ポインタに格納された値と置換する。本質的に、この動作によって、To区画内のオブジェクトの新しいコピーを指すように参照が更新される。その後、制御をブロック２４０に戻して、オブジェクト内の追加の参照を処理する。
【００９０】
現在処理されているオブジェクト内のすべての参照を処理した後に、ブロック２４０からブロック２３８に制御を移して、To区画内の追加のオブジェクトを処理する。さらに、To区画内のそのようなオブジェクトのすべてをコピーした後に、ガーベジ・コレクション・サイクルのコピー相が完了し、コレクタ・スレッド２００が終了する。
【００９１】
図１２は、区画スワップ・ルーチン２１０を詳細に示す図である。上で述べたように、ルート・コピー・ルーチンの完了時に、オブジェクト・ヒープ内の到達可能なオブジェクトのすべてが、To区画にコピーされている。したがって、区画スワップ・ルーチン２１０では、まずブロック２５０を実行して、From区画とTo区画へのポインタをスワップし、本質的に、コレクタ・スレッドの次のサイクル中に使用するために、到達可能なオブジェクトのすべてを新たに形成されたFrom区画に戻す。到達可能でないオブジェクトのすべてならびに、到達可能なオブジェクトの元のコピー（まだその新しいコピーへの転送ポインタを含む）は、新しいTo区画に割り振られた空間に残っている。新しいTo区画は、望むならばクリアすることができるが、コレクタ・スレッドの次のサイクルで、その区画にまだ残っている情報のすべてが単純に上書きされるので、通常はこのステップは省略される。
【００９２】
ブロック２５０でポインタをスワップした後に、制御をブロック２５２に移して、転送ポインタを組み込むようにすべての参照を更新する。具体的に言うと、転送ポインタを有するオブジェクトを指す参照のすべてが、これらの転送ポインタに関連する値を格納するように更新され、本質的に、現在はFrom区画に割り振られている空間内の新しいコピーを指すように参照を更新する。ブロック２５２の完了時に、オブジェクト・ヒープが収集され、コレクタ・スレッドの現在のサイクルが完了する。したがって、図９からわかるように、制御をブロック２０４に戻して、コレクタ・スレッドの次のサイクルのトリガになるイベントを待つ。
【００９３】
例
上で説明した特定の実施例の動作を例示するために、下の表１に、「Hashtable」と称するクラスのコンポーネントとして提供され、複数の「HashtableElement」オブジェクトを有する、代表的なJava言語メソッド「containsKey」を示す。
【表１】
0003659317.tif 000002
【００９４】
下の表２に、表１に示されたメソッドのコンパイル中に生成される代表的なバイトコードを示す。
【表２】
0003659317.tif 000003
【００９５】
上のオブジェクト・コードに基づくと、図４及び５のルーチン１００の実行によって、「table[]」オブジェクトが３回参照され（バイトコード・オフセット１、１４及び１９）、「tempObject」オブジェクトが２回参照され（バイトコード・オフセット２８及び５１）、「this」、「value」、「next」及び「key」オブジェクトがそれぞれ１回参照される（それぞれバイトコード・オフセット０、５、５３及び３９）ことを示す図示のデータを含む、図６のテーブル７５などのロード・ストア・テーブルが作成される。同様に、ルーチン１００によって、そのメソッドで参照されるさまざまなオブジェクトの相対アクセス順序を示す、図７のアクセス順序木８５などのアクセス順序木が作成される。
【００９６】
図１４ないし１６に移ると、From区画３０２とTo区画３０４を含む、例のオブジェクト・ヒープ３００に対して実行される代表的なガーベジ・コレクション動作が図示されている。図１４は、具体的には、ガーベジ・コレクションの前の、ガーベジ・コレクション・サイクル中のJava仮想マシン内のスレッドのうちの１つの呼出しスタックが、停止しているか、たとえば図１３の呼出しスタック２８０の項目２８２によって表されるようにスタック上にcontainsKeyメソッドを有する時の、From区画３０２の状態を示す図である。この例では、「Hashtable」オブジェクトと「table[]」オブジェクトが、ガーベジ・コレクション動作の開始時点からスタック上にある。
【００９７】
図１４からわかるように、オブジェクトが割り振られる順序に基づいて、From区画は、「Hashtable」オブジェクト３０６、「table[]」オブジェクト３０８、「HashtableElement」オブジェクト３１０及び３１２の対、「HashtableElement」オブジェクトによって参照されるオブジェクト３１４及び３１６の対を有する。図１４には、さらに、これらのオブジェクトが、その間に点在する追加のオブジェクト３１８と共に、From区画３０２内で広く分散することも示されている。
【００９８】
次に図１５に移ると、From区画３０２からTo区画３０４へのオブジェクトのコピー（図１０のブロック２１８から始まる）の結果が示されており、これによって、コピー（アクセント符号によって示される）が、「Hashtable」オブジェクト３０６と、「table[]」オブジェクト３０８と、「HashtableElement」オブジェクト３１０及び３１２と、オブジェクト３１４及び３１６から作られる。オブジェクトのコピーは、To区画内で互いにパックされ、コピーの順序は、幅優先の順序付け（深さ優先の順序付けも使用することができる）に基づく。転送ポインタがFrom区画のオブジェクトに追加されて、To区画内のコピーへの参照が維持されていることに留意されたい。また、オブジェクト３１８によって表される孤児オブジェクトは、To区画にコピーされず、したがって、区画がスワップされる時に破棄される。
【００９９】
次に、図１６に示されているように、オブジェクト内に含まれる参照は、図１１、具体的にはルート・コピー・ルーチン２０８のブロック２３８から始まる処理に関連して説明したように、クリーン・アップされる。区画のスワップの際には、To区画３０４が、次のガーベジ・コレクション・サイクルのFrom区画になる。
【０１００】
まとめとして、本発明の構成に関して以下の事項を開示する。
【０１０１】
（１）（ａ）オブジェクト・ヒープに複数のデータ・オブジェクトを格納するステップと、
（ｂ）前記オブジェクト・ヒープ内で、少なくとも第１及び第２のデータ・オブジェクトを、それらの間のアクセス関係に基づいて配置するステップと
を含む、コンピュータ・メモリ内のデータを管理する方法。
（２）前記アクセス関係が、前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップをさらに含む、上記（１）に記載の方法。
（３）前記アクセス関係が前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップが、前記第１及び第２のデータ・オブジェクトへのアクセスの間の有望な時間的近接性を判定するステップを含む、上記（２）に記載の方法。
（４）前記アクセス関係が前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップが、前記第１及び第２のデータ・オブジェクトが、次々にアクセスされる可能性が高いことを判定するステップを含む、上記（３）に記載の方法。
（５）前記アクセス関係が前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップが、前記第１及び第２のデータ・オブジェクトに関するアクセスの相対頻度を判定するステップを含む、上記（２）に記載の方法。
（６）前記データ・オブジェクトが、コンピュータ・プログラムに応答してアクセスされ、前記アクセス関係が前記第１及び第２のデータ・オブジェクトの間に存在することを判定するステップが、前記コンピュータ・プログラムのコンパイル及びローディングのうちの少なくとも１つの間に実行される、上記（２）に記載の方法。
（７）前記第１及び第２のデータ・オブジェクトの間の前記アクセス関係を判定するステップが、前記コンピュータ・プログラムのためのプロファイリングされたアクセス情報を生成するために、前記コンピュータ・プログラムの少なくとも一部の実行をシミュレートするステップを含む、上記（６）に記載の方法。
（８）前記プロファイリングされたアクセス情報が、前記第１及び第２のデータ・オブジェクトのアクセス順序を表すアクセス順序木を含む、上記（７）に記載の方法。
（９）前記プロファイリングされたアクセス情報が、さらに、前記第１及び第２のデータ・オブジェクトのそれぞれのアクセス・カウントを含む、上記（８）に記載の方法。
（１０）前記プロファイリングされたアクセス情報を前記コンピュータ・プログラムと関連付けるステップをさらに含む、上記（７）に記載の方法。
（１１）前記プロファイリングされたアクセス情報を前記コンピュータ・プログラムと関連付けるステップが、前記プロファイリングされたアクセス情報を、前記コンピュータ・プログラムの実行可能コードと同一のファイルに格納するステップを含む、上記（１０）に記載の方法。
（１２）前記第１及び第２のデータ・オブジェクトが、複数のデータ・オブジェクトの中にあり、前記オブジェクト・ヒープ内で少なくとも前記第１及び第２のデータ・オブジェクトをそれらの間のアクセス関係に基づいて配置するステップが、データ・オブジェクトのサブセットを、データ・オブジェクトの前記サブセット内の各データ・オブジェクト間のアクセス関係に基づいて、前記オブジェクト・ヒープ内で一緒にオブジェクト・グループにグループ化するステップを含む、上記（１）に記載の方法。
（１３）データ・オブジェクトの前記サブセットを一緒にグループ化するステップが、データ・オブジェクトの前記サブセット内の前記データ・オブジェクトをメモリの連続するセグメントに格納するステップを含む、上記（１２）に記載の方法。
（１４）前記オブジェクト・グループ内の前記データ・オブジェクトを、それらのアクセスの相対頻度に少なくとも部分的に基づいて配置するステップをさらに含む、上記（１３）に記載の方法。
（１５）前記オブジェクト・グループ内の前記データ・オブジェクトを、前記データ・オブジェクトがアクセスされる可能性が高い順序に少なくとも部分的に基づいて配置するステップをさらに含む、上記（１３）に記載の方法。
（１６）前記複数のデータ・オブジェクトを前記オブジェクト・ヒープに格納するステップが、各データ・オブジェクトについて前記オブジェクト・ヒープ内の空間を割り振るステップを含む、上記（１）に記載の方法。
（１７）前記オブジェクト・ヒープが、From区画とTo区画とに区分され、前記複数のデータ・オブジェクトを前記オブジェクト・ヒープに格納するステップが、コンピュータ・プログラムの実行中に前記第１及び第２のデータ・オブジェクトを前記From区画に動的に格納するステップを含み、前記オブジェクト・ヒープ内で前記第１及び第２のデータ・オブジェクトを配置するステップが、前記第１及び第２のデータ・オブジェクトを、それらの間の前記アクセス関係に基づく所定の順序で、前記From区画から前記To区画にコピーするステップを含む、上記（１６）に記載の方法。
（１８）前記オブジェクト・ヒープ内で前記第１及び第２のデータ・オブジェクトを配置するステップが、ガーベジ・コレクタによって時々実行され、前記方法がさらに、前記オブジェクト・ヒープ内で前記第１及び第２のデータ・オブジェクトを配置した後に、前記From及びTo区画をスワップするステップを含む、上記（１７）に記載の方法。
（１９）前記データ・オブジェクトが、Java仮想マシンによるJavaクラス・ファイルの実行に応答してアクセスされる、上記（１）に記載の方法。
（２０）前記第１及び第２のデータ・オブジェクトが、前記Java仮想マシン内の呼出しスタック上のアクセス連鎖内で次々に参照され、前記オブジェクト・ヒープ内で前記第１及び第２のデータ・オブジェクトを配置するステップが、前記第１及び第２のデータ・オブジェクトが次々に参照されることの判定に応答して、前記第１及び第２のデータ・オブジェクトをメモリの連続するセグメント内でお互いの次に配置するステップを含む、上記（１９）に記載の方法。
（２１）前記第１及び第２のデータ・オブジェクトが、クラス・ファイル内で定義される第３のデータ・オブジェクトによって参照され、前記方法がさらに、前記クラス・ファイル内で、前記第１及び第２のデータ・オブジェクト間のアクセス関係に基づいて、前記第１データ・オブジェクトへの第１参照と前記第２データ・オブジェクトへの第２参照とを配置するステップを含む、上記（１９）に記載の方法。
（２２）（ａ）参照するデータ・オブジェクトによって参照される、複数の参照されるデータ・オブジェクトのそれぞれのアクセスの相対頻度を判定するステップと、
（ｂ）前記複数の参照されるデータ・オブジェクトを、それらのアクセスの前記相対頻度に基づいて、オブジェクト・ヒープ内で配置するステップと
を含む、コンピュータ・メモリ内のデータを管理する方法。
（２３）（ａ）メモリと、
（ｂ）前記メモリ内に存在する、複数のデータ・オブジェクトを記憶するように構成されたオブジェクト・ヒープと、
（ｃ）前記メモリ内に存在する、前記オブジェクト・ヒープ内で少なくとも第１及び第２のデータ・オブジェクトをそれらの間のアクセス関係に基づいて配置するように構成されたプログラムと
を含む装置。
（２４）前記プログラムがさらに、前記第１及び第２のデータ・オブジェクトへのアクセスの間の有望な時間的近接性を判定することによって、前記第１及び第２のデータ・オブジェクトの間に前記アクセス関係が存在することを判定するように構成される、上記（２３）に記載の装置。
（２５）前記プログラムがさらに、前記第１及び第２のデータ・オブジェクトのアクセスの相対頻度を判定することによって、前記第１及び第２のデータ・オブジェクトの間に前記アクセス関係が存在することを判定するように構成される、上記（２３）に記載の装置。
（２６）前記プログラムが、第２プログラムのプロファイリングされたアクセス情報を生成するために前記第２プログラムの少なくとも一部の実行をシミュレートするように構成された第１プログラムを含む、上記（２３）に記載の装置。
（２７）前記第１プログラムがさらに、前記第２プログラムの実行可能コードと同一のファイルに前記プロファイリングされたアクセス情報を格納するように構成される、上記（２６）に記載の装置。
（２８）前記第１及び第２のデータ・オブジェクトが、複数のデータ・オブジェクトの中にあり、前記プログラムがさらに、データ・オブジェクトのサブセットを、データ・オブジェクトの前記サブセット内の各データ・オブジェクトの間のアクセス関係に基づいて、前記オブジェクト・ヒープ内のメモリの連続するセグメント内に一緒にグループ化するように構成される、上記（２３）に記載の装置。
（２９）前記プログラムがさらに、前記オブジェクト・グループ内の前記データ・オブジェクトのアクセスの相対頻度と、前記オブジェクト・グループ内の前記データ・オブジェクトがアクセスされる可能性が高い順序とのうちの少なくとも１つに少なくとも部分的に基づいて、前記オブジェクト・グループ内の前記データ・オブジェクトを配置するように構成される、上記（２８）に記載の装置。
（３０）前記オブジェクト・ヒープが、From区画とTo区画とに区分され、前記プログラムが、データ・オブジェクト間の前記アクセス関係に基づく所定の順序で、前記From区画から前記To区画へデータ・オブジェクトをコピーするように構成される、上記（２３）に記載の装置。
（３１）前記データ・オブジェクトが、Java仮想マシンによるJavaクラス・ファイルの実行に応答してアクセスされる、上記（２３）に記載の装置。
（３２）（ａ）オブジェクト・ヒープに格納された複数のオブジェクトからの少なくとも第１及び第２のデータ・オブジェクトを、それらの間のアクセス関係に基づいて配置するように構成されたプログラムと、
（ｂ）前記プログラムを担持する信号担持媒体と
を含むプログラム製品。
（３３）前記信号担持媒体が、記録可能媒体と伝送型媒体とのうちの少なくとも１つを含む、上記（３２）に記載のプログラム製品。
【図面の簡単な説明】
【図１】本発明との一貫性を有するネットワーク化されたコンピュータ・システムのブロック図である。
【図２】図１のネットワーク化されたコンピュータ・システムからのコンピュータのハードウェア環境及びソフトウェア環境の例のブロック図である。
【図３】図２の環境のソフトウェア・コンポーネントのブロック図である。
【図４】図３のオブジェクト・アクセス・プロファイリング・ルーチンのプログラムの流れを示す流れ図である。
【図５】図３のオブジェクト・アクセス・プロファイリング・ルーチンのプログラムの流れを示す流れ図である。
【図６】図４及び図５のオブジェクト・アクセス・プロファイリング・ルーチンによって生成されるロード／ストア・カウント・テーブルの例のブロック図である。
【図７】図４及び図５のオブジェクト・アクセス・プロファイリング・ルーチンによって生成されるアクセス木の例のブロック図である。
【図８】  Javaクラス・ファイルの例のブロック図である。
【図９】図３のガーベジ・コレクション論理によって実行されるコレクタ・スレッドのプログラムの流れを示す流れ図である。
【図１０】図９で参照されているルート・コピー・ルーチンのプログラムの流れを示す流れ図である。
【図１１】図９で参照されているルート・コピー・ルーチンのプログラムの流れを示す流れ図である。
【図１２】図９で参照されている区画スワップ・ルーチンのプログラムの流れを示す流れ図である。
【図１３】図９のコレクタ・スレッドの実行中に発生する呼出しスタックの例を示すブロック図である。
【図１４】図９のコレクタ・スレッドによって操作されるオブジェクト・ヒープの例を示すブロック図である。
【図１５】図９のコレクタ・スレッドによって操作されるオブジェクト・ヒープの例を示すブロック図である。
【図１６】図９のコレクタ・スレッドによって操作されるオブジェクト・ヒープの例を示すブロック図である。
【符号の説明】
４２  コンパイラ
４４  仮想マシン
４６  ソース・コード
４８  クラス・ファイル
５０  バイトコード生成ブロック
５１  クラス検証ブロック
５２  オブジェクト・アクセス・プロファイリング・ブロック
５４  クラス・ローダ・コンポーネント
５６  オブジェクト・アクセス・プロファイリング・ブロック
５８  オブジェクト・ヒープ
６０  From区画
６２  To区画
６３  インタープリタ
６４  スレッド
６６  呼出しスタック
６８  オブジェクト・アクセス・プロファイリング・ブロック
７０  ガーベジ・コレクション論理
【図１】
0003659317.tif 000004
【図２】
0003659317.tif 000005
【図３】
0003659317.tif 000006
【図４】
0003659317.tif 000007
【図５】
0003659317.tif 000008
【図６】
0003659317.tif 000009
【図７】
0003659317.tif 000010
【図８】
0003659317.tif 000011
【図９】
0003659317.tif 000012
【図１０】
0003659317.tif 000013
【図１１】
0003659317.tif 000014
【図１２】
0003659317.tif 000015
【図１３】
0003659317.tif 000016
【図１４】
0003659317.tif 000017
【図１５】
0003659317.tif 000018
【図１６】
0003659317.tif 000019