(57)【特許請求の範囲】
【請求項１】
コンピュータの処理により、ヒープ領域に割り付けられたオブジェクトを識別するためのハッシュコードを生成する方法であって、
前記コンピュータの処理により、前記ヒープ領域毎に、シード値を生成するステップと、
前記コンピュータの処理により、前記オブジェクトのアドレスと、前記オブジェクトが割り付けられているヒープ領域の前記シード値に基づき、前記ハッシュコードを生成するステップとを有する、
方法。
【請求項２】
前記ハッシュコードを生成するステップが、前記オブジェクトのアドレスと、前記シード値のみならず、前記オブジェクトのクラスのＩＤの値にも基づく、請求項１に記載の方法。
【請求項３】
前記シード値が擬似乱数によって生成される、請求項１に記載の方法。
【請求項４】
前記ヒープ領域が、相対的に新しいオブジェクトを割り付けるための第１のヒープ領域と、相対的に古いオブジェクトを割り付けるための第２のヒープ領域を有し、
前記第１のヒープ領域から前記第２のヒープ領域にオブジェクトが移動されることに応答して、前記オブジェクトにハッシュコードを付加することが可能かどうか判断するステップと、
前記オブジェクトにハッシュコードを付加することが可能であると判断されると、ハッシュコードを生成して、前記オブジェクトに追加するステップをさらに有する、請求項１に記載の方法。
【請求項５】
前記オブジェクトにハッシュコードを付加することが可能でないなら、ハッシュコードを生成してヒープ外に配置し、前記オブジェクトに関連付けるステップをさらに有する、請求項４に記載の方法。
【請求項６】
コンピュータの処理により、ヒープ領域に割り付けられたオブジェクトを識別するためのハッシュコードを生成するプログラムであって、
前記コンピュータに、
前記ヒープ領域毎に、シード値を生成するステップと、
前記オブジェクトのアドレスと、前記オブジェクトが割り付けられているヒープ領域の前記シード値に基づき、前記ハッシュコードを生成するステップを実行させる、
プログラム。
【請求項７】
前記ハッシュコードを生成するステップが、前記オブジェクトのアドレスと、前記シード値のみならず、前記オブジェクトのクラスのＩＤの値にも基づく、請求項６に記載のプログラム。
【請求項８】
前記シード値が擬似乱数によって生成される、請求項６に記載のプログラム。
【請求項９】
前記ヒープ領域が、相対的に新しいオブジェクトを割り付けるための第１のヒープ領域と、相対的に古いオブジェクトを割り付けるための第２のヒープ領域を有し、
前記第１のヒープ領域から前記第２のヒープ領域にオブジェクトが移動されることに応答して、前記オブジェクトにハッシュコードを付加することが可能かどうか判断するステップと、
前記オブジェクトにハッシュコードを付加することが可能であると判断されると、ハッシュコードを生成して、前記オブジェクトに追加するステップをさらに前記コンピュータに実行させる、請求項６に記載のプログラム。
【請求項１０】
前記オブジェクトにハッシュコードを付加することが可能でないなら、ハッシュコードを生成してヒープ外に配置し、前記オブジェクトに関連付けるステップをさらに前記コンピュータに実行させる、請求項９に記載のプログラム。
【請求項１１】
コンピュータの処理により、ヒープ領域に割り付けられたオブジェクトを識別するためのハッシュコードを生成するシステムであって、
前記ヒープ領域毎に、シード値を生成する手段と、
前記オブジェクトのアドレスと、前記オブジェクトが割り付けられているヒープ領域の前記シード値に基づき、前記ハッシュコードを生成する手段を有する、
システム。
【請求項１２】
前記ハッシュコードを生成する手段が、前記オブジェクトのアドレスと、前記シード値のみならず、前記オブジェクトのクラスのＩＤの値にも基づく、請求項１１に記載のシステム。
【請求項１３】
前記シード値が擬似乱数によって生成される、請求項１１に記載のシステム。
【請求項１４】
前記ヒープ領域が、相対的に新しいオブジェクトを割り付けるための第１のヒープ領域と、相対的に古いオブジェクトを割り付けるための第２のヒープ領域を有し、
前記第１のヒープ領域から前記第２のヒープ領域にオブジェクトが移動されることに応答して、前記オブジェクトにハッシュコードを付加することが可能かどうか判断する手段と、
前記オブジェクトにハッシュコードを付加することが可能であると判断されると、ハッシュコードを生成して、前記オブジェクトに追加する手段をさらに有する、請求項１１に記載のシステム。
【請求項１５】
前記オブジェクトにハッシュコードを付加することが可能でないなら、ハッシュコードを生成してヒープ外に配置し、前記オブジェクトに関連付ける手段をさらに有する、請求項１４に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータ・システムにおいて、生成されたオブジェクトを特定する技法に関し、より詳しくは、オブジェクトを特定するためのハッシュコードを生成するための技法に関するものである。
【背景技術】
【０００２】
従来より、例えば、特開２０１０−２０４９５５号公報に記述されているように、Java(R)などで生成され、ヒープ領域に割り付けられたオブジェクトを追跡し、あるいは突き止めるために、ハッシュ値を生成して、オブジェクトに割り当てることが行われている。
【０００３】
具体的には例えば、コンピュータ・システムが、生成したハッシュ値と、オブジェクトの識別子を含むテーブルを作成して、このテーブルを引くことによってハッシュ値からオブジェクトを突き止める。
【０００４】
このようなハッシュ値は、従来技術では、典型的にはオブジェクトのアドレスにオブジェクトの識別子を付加した値に基づき計算され、オブジェクト・ヘッダにおける、例えば１５ビットの領域に格納される。
【０００５】
また、典型的には、オブジェクト・ヘッダには２ビットの領域があり、次のような意味をもつ：
・"00" = ハッシュされていない。すなわち、オブジェクト・ハッシュコードはまだ存在しない。
・"01" = ハッシュされている。オブジェクト・ハッシュコードは、オブジェクト・アドレスから計算することができる。
・"10" = ハッシュされ、移動された。オブジェクト・ハッシュコードが、オブジェクトに付加されている。
【０００６】
しかし、従来技術では、オブジェクトのアドレスに従いオブジェクト・ハッシュコードを生成すると、オブジェクトのアドレスの値の限界から、オブジェクト・ハッシュコードの衝突を引き起こし、パフォーマンスが低下するという問題があった。
【０００７】
そこで、O Agesen, "Space and time-efficient hashing of garbage-collected objects",- Theory and Practice of Object Systems, 1999は、オブジェクト・ハッシュコードのバリエーションを増やすために、ヒープに、オブジェクト・ハッシュコード生成のために追加のシードを付加することを開示する。このシードは、世代別（generational）ヒープ領域での、ガベージ・コレクションにおける古い(tenured)オブジェクトのためのものである。
【０００８】
しかし、この文献の技法は、非世代別（non-generational）ヒープ領域のためのＧＣなどの、他のタイプのＧＣにおける問題には使えない。また、オブジェクトピン止め(object pinning)にも対処できない。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０１０−２０４９５５号公報
【非特許文献】
【００１０】
【非特許文献１】O. Agesen, "Space and time-efficient hashing of garbage-collected objects",- Theory and Practice of Object Systems, 1999
【発明の概要】
【発明が解決しようとする課題】
【００１１】
従って、この発明の目的は、オブジェクト・ハッシュコードの衝突を減らすために、オブジェクト・ハッシュコードのバリエーションを増やすことにある。
【００１２】
この発明の他の目的は、ピン止めオブジェクトに対するオブジェクト・ハッシュコードの付加を可能ならしめることにある。
【課題を解決するための手段】
【００１３】
本発明は、上記課題を解決するためになされたものであり、オブジェクト・ハッシュコードを生成するために、オブジェクトが配置されるヒープ領域毎に、ヒープ毎シードを設けることによって、上記課題を解決する。
【００１４】
すなわち、本発明に従うシステムは、少なくとも、オブジェクト・アドレスと、ヒープ毎シードを組み合わせて、オブジェクト・ハッシュコードを生成する。
【００１５】
本発明に従うシステムは、好適な一側面によれば、オブジェクト・アドレスと、ヒープ毎シードと、オブジェクト・クラスのＩＤを組み合わせて、オブジェクト・ハッシュコードを生成する。
【００１６】
本発明に従うシステムは、更なる一側面によれば、ＧＣの間に"01"すなわちハッシュされた状態のオブジェクトにオブジェクト・ハッシュコードを付加可能かどうか判断し、もしそうなら、オブジェクト・ハッシュコードを計算してオブジェクトに付加し、状態を"10"に変更する。オブジェクトにオブジェクト・ハッシュコードを付加可能でないなら、オブジェクト・ハッシュコードを計算してヒープ外に配置し、オブジェクトに関連付け、状態を、ピン止めされた(pinned)オブジェクトを示す"11"に変更する。
【００１７】
一方、ＧＣの間にオブジェクトの状態が"11"であるなら、オブジェクトにオブジェクト・ハッシュコードを付加可能かどうか判断し、もしそうなら、オブジェクト・ハッシュコードをヒープ外のテーブルから読み取ってオブジェクトに付加し、状態を"10"に変更し、ヒープ外のオブジェクト・ハッシュコードを削除する。そうでないなら、何もしない。
【発明の効果】
【００１８】
この発明によれば、ヒープ毎にオブジェクト・ハッシュコードを生成するためのシードを設けることにより、生成されるオブジェクト・ハッシュコードのバリエーションを増やすことができるので、ハッシュの衝突を減らして、オブジェクトを突き止める時間を短縮することができる。
【００１９】
また、場合により、ヒープ外にオブジェクト・ハッシュコードを配置できるようにしたので、ピン止めされたオブジェクトに対しても適宜オブジェクト・ハッシュコードを付加することが可能となる。
【図面の簡単な説明】
【００２０】
【図１】本発明を実施するためのハードウェアの一例のブロック図である。
【図２】本発明を実施するためのソフトウェアの階層を示す図である。
【図３】オブジェクトのヘッダのフォーマットを示す図である。
【図４】オブジェクトのヘッダのフォーマットを示す図である。
【図５】本発明の動作を説明するための模式図である。
【図６】状態ビットの遷移を示す図である。
【図７】ハッシュコードを生成するための処理のフローチャートを示す図である。
【図８】オブジェクトが別のヒープ領域に移動される際の処理のフローチャートを示す図である。
【図９】オブジェクトにハッシュコードを追加することが可能かどうか判断する処理のフローチャートを示す図である。
【発明を実施するための形態】
【００２１】
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
【００２２】
図１を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図１において、システム・バス１０２には、ＣＰＵ１０４と、主記憶（ＲＡＭ）１０６と、ハードディスク・ドライブ（ＨＤＤ）１０８と、キーボード１１０と、マウス１１２と、ディスプレイ１１４が接続されている。ＣＰＵ１０４は、好適には、３２ビットまたは６４ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標)4、インテル社のCore(商標) 2 DUO、AMD社のAthlon(商標)などを使用することができる。主記憶１０６は、好適には、２ＧＢ以上の容量、より好ましくは、４ＧＢ以上の容量をもつものである。
【００２３】
ハードディスク・ドライブ１０８には、オペレーティング・システム（ＯＳ）２０２（図２）が、格納されている。オペレーティング・システムは、Linux（商標）、マイクロソフト社のWindows(商標) 7、Windows XP(商標)、Windows(商標)2003サーバ、アップルコンピュータのMac OS(商標)などの、ＣＰＵ１０４に適合する任意のものでよい。
【００２４】
ハードディスク・ドライブ１０８にはまた、Apacheなどの、Ｗｅｂサーバとしてシステムを動作させるためのプログラムが保存され、システムの起動時に、主記憶１０６にロードされる。
【００２５】
ハードディスク・ドライブ１０８にはさらに、Java(R)仮想マシン（ＪＶＭ）２０４（図２）を実現するためのJava(R) Runtime Environmentプログラムが保存され、システムの起動時に、主記憶１０６にロードされる。ＪＶＭ２０４には、本発明の機能が実装されている。
【００２６】
ハードディスク・ドライブ１０８にはさらに、アプリケーション・プログラムのバイトコード２０６（図２）が保存されている。
【００２７】
キーボード１１０及びマウス１１２は、オペレーティング・システムが提供するグラフィック・ユーザ・インターフェースに従い、ディスプレイ１１４に表示されたアイコン、タスクバー、テキストボックスなどのグラフィック・オブジェクトを操作するために使用される。
【００２８】
ディスプレイ１１４は、これには限定されないが、好適には、１０２４×７６８以上の解像度をもち、３２ビットtrue colorのＬＣＤモニタである。ディスプレイ１１４は例えば、ＪＶＭ上で実行されるアプリケーション・プログラムによる動作の結果を表示するために使用される。
【００２９】
通信インターフェース１１６は、好適には、イーサネット(R)プロトコルにより、ネットワークと接続されている。通信インターフェース１１６は、クライアント・コンピュータ（図示しない）からApacheが提供する機能により、ＴＣＰ／ＩＰなどの通信プロトコルに従い、処理リクエストを受け取り、あるいは処理結果を、クライアント・コンピュータ（図示しない）に返す。
【００３０】
図２は、プログラムまたはプロセスの階層を示す図である。図１に示すハードウェアの上で、オペレーティング・システム（ＯＳ）２０２が動作し、オペレーティング・システム２０２上ではJava(R)仮想マシン（ＪＶＭ）２０６が動作する。
【００３１】
アプリケーション・プログラム２０８は、Java(R)バイトコードから構成され、ＪＶＭ２０６上で動作する。ＪＶＭ２０６は、アプリケーション・プログラム２０８のために、主記憶１０８上にヒープ領域を用意する。アプリケーション・プログラム２０８は、動作中にヒープ領域上にメモリ領域を獲得して、そこに、生成したオブジェクトを割り付ける。ヒープ領域は、世代別(generational)ヒープ領域である場合、新しいオブジェクトを割り付けるための、少なくとも１つの第１世代の(nursery)ヒープ領域と、少なくとも１つの第２世代の(tenure)ヒープ領域からなり、ＪＶＭ２０６は、第１世代のヒープ領域が一杯になったとき、第１世代のヒープ領域でガベージ・コレクション（ＧＣ）を行い、生き残ったオブジェクトを第１世代のヒープ領域から、第２世代のヒープ領域に移動する。結果的に、第２世代のヒープ領域には、しばらく生き残っているオブジェクトが集まる。また、第２世代のヒープ領域が一杯になると、ＪＶＭ２０６はヒープ領域全体のＧＣを行う。
【００３２】
一方、非世代別(non-generational)ヒープ領域である場合、ヒープ領域は全て、第１世代のヒープ領域として扱われる。本発明は、世代別ヒープ領域と非世代別ヒープ領域の両方に適用可能である。
【００３３】
図３は、ヒープ領域に割り付けられるオブジェクトのフォーマットの一例を示す図である。図３に示すように、オブジェクト３０２は、ヘッダ３０４と、それに続くオブジェクト本体であるデータ３０８からなる。
【００３４】
ヘッダ３０４は、ＴＩＢ(type information block)ポインタと、２ビットの領域３０６と、ロック・ワードからなる。ＴＩＢポインタは、タイプをあらわすオブェクトへのポインタであり、ロック・ワードには、オブジェクトのロックやＧＣフラグとして使用される値が格納される。
【００３５】
２ビットの領域３０６は、下記のことを示すために使用される：
・"00" = ハッシュされていない。すなわち、オブジェクト・ハッシュコードはまだ存在しない。
・"01" = ハッシュされている。オブジェクト・ハッシュコードは、オブジェクト・アドレスから計算することができる。
・"10" = ハッシュされ、移動された。オブジェクト・ハッシュコードが、オブジェクトに付加されている。
・"11" = ハッシュされ、ハッシュコードはヒープ外のテーブルに保存されている。たとえば、ピン止めされた（pinned)オブジェクトの移動が失敗したときにこうなる。
２ビットの領域３０６は、図５〜図９のフローチャートで示す実施例では、状態ビット(state bits)とも称する。
【００３６】
なお、図３のオブジェクトのフォーマットでは、ＴＩＢポインタの隣に２ビットの領域３０６が配置されるが、図４に示すように、２ビットの領域４０６が、ロック・ワードの隣に配置される、別のオブジェクトのフォーマットを使用してもよい。
【００３７】
図５は、本発明の処理を模式的に示す図である。図５において、第１の(nursery)ヒープ領域５０２と、第２の(tenure)ヒープ領域５０４が示されている。第１のヒープ領域５０２には、オブジェクト５０６、５０８及び５１０が示されている。各々のオブジェクトは、図３あるいは図４に示した２ビット領域の値が示されている。
【００３８】
第１のヒープ領域５０２と第２のヒープ領域５０４にはそれぞれ、シードの値が関連付けられている。シードの値はヒープ外のメモリの所定の管理領域に配置される。このようなシードは、ヒープ毎に与えられるので、ヒープ毎シード(per-heap-area seed)と呼ぶことにする。ヒープ毎シードの値は、第１のヒープ領域５０２のＧＣ時、あるいは第２のヒープ領域５０４のコンパクション(compaction)時などに、好適には疑似乱数を生成することで更新される。
【００３９】
２ビットの値"01"をもつオブジェクト５１０は、ハッシュコードを付与されているが、図５では図示を省略している。
【００４０】
オブジェクト５１０が第２のヒープ領域５０４に移動されると、２ビットの値"10"をもつオブジェクト５１２となり、本発明に従い、オブジェクト５１０のクラスのＩＤ５１８と、オブジェクト５１０のオブジェクト・アドレス５２０と、第１のヒープ領域５０２のシード５１４という３つの値から、ハッシュコード計算処理５２２によってハッシュコードが計算され、それは、ハッシュコード５２４としてオブジェクト５１２の末尾に付加される。
【００４１】
なお、この場合、ハッシュコード計算処理５２２は、オブジェクト５１０のクラスのＩＤ５１８と、オブジェクト５１０のオブジェクト・アドレス５２０と、第１のヒープ領域５０２のシード５１４という３つの値からハッシュコードを計算するのではなく、オブジェクト５１０のオブジェクト・アドレス５２０と、第１のヒープ領域５０２のシード５１４という２つの値から計算するようにしてもよい。
【００４２】
一方、オブジェクト５０６の末尾にハッシュコードを付加しようとしたとき、別のオブジェクト５０８が隣接していて、ハッシュコードが付加できない場合がある。このような場合、本発明によれば、ハッシュコード計算処理５２２によって計算されたハッシュコード５２６を、ヒープ外の領域５２８に配置して、オブジェクト５０６に関連付けることになる。より具体的には、ハッシュコード５２６が配置された領域に、オブジェクト５０６へのポインタを配置するようにする。
【００４３】
図６は、オブジェクトの２ビット・コードに関する状態遷移図である。最初はオブジェクトの２ビット・コードは"00"であり、ハッシュコードが要求されると、２ビット・コードは"01"となる。"01"の状態から、オブジェクトが移動されると、オブジェクトの２ビット・コードは"10"となる。
【００４４】
一方、"01"の状態から、オブジェクトの移動に失敗すると、ピン止めされたオブジェクトの移動に失敗したとして、そのせいでハッシュコードを付加できなくなり、オブジェクトの２ビット・コードは"11"となる。
【００４５】
"11"の状態から、ピン止め解除後、オブジェクトが移動されると、オブジェクトの２ビット・コードは"10"となる。
【００４６】
次に、図７のフローチャートを参照して、ＪＶＭ２０４による、ハッシュコード生成処理について説明する。図７のステップ７０２では、ＪＶＭ２０４は、ハッシュコードを生成しようとするオブジェクトの状態ビット、すなわち、２ビット・コードを調べる。
【００４７】
状態ビットが"00"なら、ＪＶＭ２０４は、ステップ７０４で状態ビットを"01"に変更して、ステップ７０６に進む。一方、状態ビットが"01"なら、ＪＶＭ２０４は、直接ステップ７０６に進む。
【００４８】
ステップ７０６では、ＪＶＭ２０４は、オブジェクトのアドレスを使用して、そのオブジェクトが存在するヒープのシードをロードする。そして、ステップ７０８で、ハッシュコード = f(オブジェクトのアドレス,オブジェクト・クラスのＩＤ,シード値)によりハッシュコードを計算する。ハッシュコード計算の具体的な式の例は、これには限定しないが、下記のとおりである。ハッシュコード = (オブジェクトのアドレス >> 3) XOR シード値 XOR オブジェクト・クラスのＩＤ
【００４９】
これは、図５では、ハッシュコード計算処理５２２に対応する。
【００５０】
この式は、下記のように、オブジェクト・クラスのＩＤを使わないものであってもよい。
ハッシュコード = (オブジェクトのアドレス >> 3) XOR シード値
また、ここに示すハッシュコードの計算式はほんの一例であって、ビットシフト演算、XORなどの既知の演算を組み合わせて、さまざまな式を使用することができる。
【００５１】
ステップ７０２に戻って、状態ビットが"10"なら、ＪＶＭ２０４は、ステップ７１０で、オブジェクト・フィールドからハッシュコードを読み取る。そのハッシュコードは、図５では例えば、ハッシュコード５２４として示されている。
【００５２】
ステップ７０２に戻って、状態ビットが"11"なら、ＪＶＭ２０４は、ステップ７１２で、オブジェクト・アドレスをキーとして使用して外部テーブル中でハッシュコードをルックアップする。これは、図５では例えば、ハッシュコード５２６として示されている。
【００５３】
次に、図８のフローチャートを参照して、ＪＶＭ２０４による、オブジェクトの移動処理について説明する。
【００５４】
図８において、ステップ８０２からステップ８１８は、ヒープ領域におけるオブジェクト移動の際のオブジェクト毎の処理である。
【００５５】
ステップ８０４では、ＪＶＭ２０４は、ステップ８０４で、オブジェクトの状態ビット、すなわち、２ビット・コードを調べる。
【００５６】
状態ビットが"01"なら、ＪＶＭ２０４は、ステップ８０６で、オブジェクトにハッシュコードを追加することが可能かどうか判断する。この判断処理の詳細は、図９のフローチャートを参照して、後で説明する。
【００５７】
オブジェクトにハッシュコードを追加することが可能というのは例えば、図５のオブジェクト５１２に、ハッシュコード５２４を追加する場合に対応する。オブジェクトにハッシュコードを追加することが可能であるなら、ＪＶＭ２０４は、ステップ８０８で、図７のフローチャートで示した処理によりハッシュコードを計算し、オブジェクトに追加し、状態ビットを"10"に変更する。
【００５８】
オブジェクトにハッシュコードを追加することが可能でないというのは例えば、図５のオブジェクト５０６に、ハッシュコード５２６を関連付ける場合に対応する。オブジェクトにハッシュコードを追加することが可能でないなら、ＪＶＭ２０４は、ステップ８１０で、図７のフローチャートで示した処理によりハッシュコードを計算し、それをヒープ外に保存し、状態ビットを"11"に変更する。
【００５９】
ステップ８０４に戻って、状態ビットが"00"または"10"なら、ハッシュされていない、またはハッシュされ移動されているのどちらかなので、ステップ８１２で、ハッシュコードについては、オブジェクトに何もしない。
【００６０】
ステップ８０４に戻って、状態ビットが"11"なら、ステップ８１４で、ＪＶＭ２０４は、オブジェクトにハッシュコードを追加することが可能かどうか判断する。この判断処理はやはり、図９のフローチャートで説明されるものである。
【００６１】
そして、オブジェクトにハッシュコードを追加することが可能でないなら、単にステップ８１２に進む。
【００６２】
オブジェクトにハッシュコードを追加することが可能であるなら、ＪＶＭ２０４は、ステップ８１６で図７のフローチャートで示した処理によりハッシュコードを取得し、オブジェクトに追加し、ヒープ外のテーブルから、オブジェクトに関連付けられていたハッシュコードを削除し、状態ビットを"10"に変更する。
【００６３】
こうして、ステップ８０２からステップ８１８までで、ヒープ領域におけるオブジェクト毎の処理を終了すると、ＪＶＭ２０４はステップ８２０で、疑似乱数により、当該ヒープの新しいシードを選ぶ。
【００６４】
図９は、図８のフローチャートで使用される、オブジェクトにハッシュコードを追加することが可能かどうか判断する処理のフローチャートを示す図である。
【００６５】
ステップ９０２でＪＶＭ２０４は、オブジェクトが移動されつつあるかどうか判断し、もしそうなら、ステップ９０４で、あて先に追加の４バイトが利用可能かどうか判断し、もしそうならステップ９０６で追加可能と判断し、そのことを所定のリターンコードにセットして戻る。そうでないなら、ステップ９０８で追加不可能と判断し、そのことを所定のリターンコードにセットして戻る。
【００６６】
オブジェクトが移動されつつあるのでないなら、ＪＶＭ２０４は、ステップ９１０でオブジェクトの後ろに４バイトの空きスペースがあるかどうか判断し、もしそうならステップ９０６に進む。
【００６７】
オブジェクトの後ろに４バイトの空きスペースがないなら、ＪＶＭ２０４は、ステップ９１２で、このオブジェクトの後ろにオブジェクトがあり、そのオブジェクトが移動されつつあるかどうか判断する。そして、もしそうならステップ９０６に進み、そうでないなら、ステップ９０８で追加不可能と判断し、そのことを所定のリターンコードにセットして戻る。
【００６８】
以上、Java(R)仮想マシン上での実装として、本発明の実施例を説明したが、この発明は、特定のハードウェア及びオペレーティング・システムあるいはアプリケーション・プログラムに限定されないことに留意されたい。すなわち、ヒープ領域に割り付けられたオブジェクトにハッシュコードを追加する機能をもつ任意のオペレーティング・システムあるいは仮想マシンに適用可能である。また、クラウド環境で使用される大規模環境のシステム上でも適用可能である。あるいは、スタンドアロンの環境で動作する場合にも適用可能である。
【符号の説明】
【００６９】
１０４  ＣＰＵ
１０６  主記憶
１０８  ハードディスク・ドライブ
２０２  オペレーティング・システム
２０４  ＪＶＭ
５０２  第１のヒープ領域
５０４  第２のヒープ領域
５０６〜５１２  オブジェクト
５２４、５２６  ハッシュコード
【図１】
0005883300.tif 000002
【図２】
0005883300.tif 000003
【図３】
0005883300.tif 000004
【図４】
0005883300.tif 000005
【図５】
0005883300.tif 000006
【図６】
0005883300.tif 000007
【図７】
0005883300.tif 000008
【図８】
0005883300.tif 000009
【図９】
0005883300.tif 000010