JP4852621B2 - プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム - Google Patents

プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム Download PDF

Info

Publication number
JP4852621B2
JP4852621B2 JP2009049727A JP2009049727A JP4852621B2 JP 4852621 B2 JP4852621 B2 JP 4852621B2 JP 2009049727 A JP2009049727 A JP 2009049727A JP 2009049727 A JP2009049727 A JP 2009049727A JP 4852621 B2 JP4852621 B2 JP 4852621B2
Authority
JP
Japan
Prior art keywords
value
program
hash value
allocation location
runtime
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2009049727A
Other languages
English (en)
Other versions
JP2010204955A (ja
Inventor
怜 大平
一則 緒方
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2009049727A priority Critical patent/JP4852621B2/ja
Priority to US12/715,703 priority patent/US8555255B2/en
Publication of JP2010204955A publication Critical patent/JP2010204955A/ja
Application granted granted Critical
Publication of JP4852621B2 publication Critical patent/JP4852621B2/ja
Priority to US13/969,004 priority patent/US8782610B2/en
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • G06F8/24Object-oriented
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラムに関する。
多くのプログラムでは、メモリのヒープ領域に多数のオブジェクトが動的に割り付けられる。該プログラム中、すなわちソースコード又はバイトコード等の中間コード中のオブジェクトの割り付け場所は、該プログラム中に複数存在しうる。該プログラム中のオブジェクトの割り付け場所は、例えばJava(商標)言語では、オブジェクトを生成するnew演算子を記述する場所である。該プログラム中に記述されるオブジェクトは、プログラムの実行時にメモリのヒープ領域内に割り付けられる。そこで、プログラムのソースコード中又はバイトコード等の中間コード中のオブジェクトの割り付け場所を、ヒープ領域内に割り付けられたオブジェクトから検出することができれば、効率的なデバッグ又は様々なプログラムの最適化が可能である。
例えば、プログラム実行時のある時点において、メモリリークが疑われているとする。ヒープ領域中で生きている全てのオブジェクトから上記割り付け場所を検出することができれば、プログラム中のオブジェクトを多く割り付ける場所の特定ができる。該特定により、プログラマーはメモリリークを回避するための対策をとることができる。ここで、「メモリリーク」とは、使用可能なメモリ容量が徐々に減っていく現象をいう。メモリリークは、例えば、不要になったオブジェクトがメモリに残存し、蓄積されることによって発生する。「生きているオブジェクト」とは、何らかの処理で使用されるために、該処理が実行されるプログラムからポインタによって参照されている状態のオブジェクトをいう。
また、例えば、あるオブジェクトに複数のスレッドが頻繁にロックをかけているような場合、プログラム中のどの場所で該オブジェクトが割り付けられているかを知ることができれば、例えばある特定のスレッドのために、該オブジェクトのロック予約を止めることもできる(非特許文献1を参照)。
また、プログラム上でのオブジェクトの割り付け場所を特定可能にするために、オブジェクト・ヘッダを拡張し、該拡張された領域に1ワード分の割り付け場所番号を埋め込む方法もある(非特許文献2を参照)。しかし、該方法では、ヘッダを拡張しているので、ヒープ領域がより多く消費される。さらに、拡張ヘッダを用いるとヒープ領域の使われ方そのものが変わってしまうために、ヒープ領域の使われ方についてデバッグすることが困難となる。
プログラム上でのオブジェクトの割り付け場所を特定可能にするために、オブジェクトとプログラムにおける前記オブジェクトの割り付け場所とを1対1で対応付ける対応表を、ヒープ領域の外に用意する方法も考えられる。しかし、上記方法では、対応表がオブジェクトの数に比例して増大する。従って、対応表を記憶するためにメモリが多く消費されてしまう。さらに、上記方法では、どこからも参照されなくなった状態である死んだオブジェクトに関する情報を上記対応表から削除する処理が必要である。従って、上記削除する処理が、プログラムの速度オーバーヘッドを大きくするという不都合がある。
K. Russell and D. Detlefs, Eliminating Synchronization-Related Atomic Operations with Biased Locking and Bulk Rebiasing, In Proceedings of the ACM SIGPLAN 2006 Conference on Object-Oriented Programming, Systems, Languages, and Applications, pp. 263-272, 2006.
R. Shaham, E. K. Kolodner, and M. Sagiv, Heap Profiling for Space-Efficient Java, In Proceedings of the ACM SIGPLAN 2001 Conference on Programming Language Design and Implementation, pp. 104-113, 2001.
小さなサイズのオブジェクトを大量に割り付けるプログラム、例えばJava(商標)言語で作成されたプログラムでは、ヒープ領域中の実行時オブジェクトは、プログラム中のオブジェクトの割り付け位置を示す情報を有していない。
プログラム中のオブジェクトの位置を示す情報が、上記ヒープ領域中の実行時オブジェクトに付加される例はある(上記非特許文献2を参照)。しかし、該例では、ヒープ領域内の余分な領域が消費される。従って、オブジェクトのプログラム中の割り付け場所をメモリ内のヒープ領域の実行時オブジェクトからメモリを多く消費することなく効率的に追跡することは、既存の方法では困難である。従って、プログラム中のオブジェクトの割り付け場所を効率的に追跡する方法が求められている。
本発明は、ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡することを可能にするための該実行時オブジェクトのデータ構造を提供する。該データ構造は、上記実行時オブジェクトのハッシュ値フィールドがハッシュ値として上記割り付け場所に対応した値とオブジェクト識別子とを含む。プログラム中に記述されるオブジェクトの割り付け場所の上記追跡は、該値に対応する上記オブジェクトの割り付け場所を特定することによって行われる。
本発明はまた、ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡するための方法を提供する。該方法は、コンピュータ・システムに下記ステップを実行させることを含む。該ステップは、
上記データ構造から上記割り付け場所に対応した値を取得するステップと、
上記取得した値に対応する上記オブジェクトの割り付け場所を特定するステップと
を含む。
本発明の1つの実施態様では、上記特定が、ハッシュ値が参照されたことのある実行時オブジェクトのハッシュ値フィールドに含まれる上記割り付け場所に対応した値(以下、第1の値)と該第1の値に対応する割り付け場所との対応付けを記録する対応表(以下、第1の対応表)から、上記第1の値に対応する割り付け場所を特定することによって行われる。
本発明の1つの実施態様では、上記第1の値が、該第1の値を含む上記実行時オブジェクトのハッシュ値が参照されることに応じて求められる値である。
本発明の1つの実施態様では、上記第1の値が、二分木構造によって求められる値である。
本発明の1つの実施態様では、上記二分木構造が上記第1の値と該第1の値に対応する割り付け場所との対応関係を示し、並びに上記二分木構造の枝が上記第1の値のビット表示の各ビットを示し、及び上記二分木構造のノードが上記オブジェクトの割り付け場所を示す。
本発明の1つの実施態様では、上記特定が、ハッシュ値が参照されたことのない実行時オブジェクトのハッシュ値フィールドに含まれる上記割り付け場所に対応した値(以下、第2の値)と該第2の値に対応する割り付け場所との対応付けを記録する対応表(以下、第2の対応表)から、上記第2の値に対応する割り付け場所を特定することによって行われる。
本発明はまた、ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡することを可能にするための方法を提供する。該方法は、コンピュータ・システムに下記ステップを実行させることを含む。該ステップは、
上記実行時オブジェクトのメモリへの割り付けに応じて、
上記データ構造の上記ハッシュ値フィールド内に、上記プログラム中のオブジェクトの上記割り付け場所に対応した値を埋め込むステップを含み、上記ハッシュ値フィールドがハッシュ値として上記埋め込まれた値とオブジェクト識別子とを含み、上記追跡が該埋め込まれた値に対応する上記オブジェクトの割り付け場所を特定することによって行われる。
本発明の1つの実施態様では、上記方法は、コンピュータ・システムに下記ステップをさらに実行させることを含む。該ステップは、
実行時オブジェクトのハッシュ値の参照命令が実行されることに応じて、
上記埋め込まれた値を、計算された値に置き換えるステップと、
上記計算された値と上記埋め込まれた値との対応表をメモリ内に作成するステップと
を含む。
本発明の1つの実施態様では、上記方法は、コンピュータ・システムに下記ステップをさらに実行させることを含む。該ステップは、
上記プログラム中のオブジェクトの割り付け場所が同一である実行時オブジェクトが多くメモリに割り付けられる場合、上記ハッシュ値フィールド中の値に割り当てられるビット長を短くし、一方上記オブジェクト識別子に割り当てられるビット長を長くするステップを含む。
本発明の1つの実施態様では、上記短くし且つ長くするステップが、ランダムに与えられる上記オブジェクト識別子の一部又は全部が予め決めておいたビットパターンに一致する場合に実行される。
本発明の1つの実施態様では、上記ハッシュ値フィールドは、上記参照命令が実行されたかどうかを示すフラグを含む。また、上記方法は、コンピュータ・システムに下記ステップをさらに実行させることを含む。該ステップは、上記参照命令の発行に応じて、該フラグを立てるステップを含む。
本発明の1つの実施態様では、上記フラグの立っているハッシュ値フィールドを含む実行時オブジェクトのハッシュ値の参照命令が実行された場合、上記計算された値に置き換えるステップが実行されない。
本発明の1つの実施態様では、上記メモリが、該メモリのヒープ領域である。また、上記方法は、コンピュータ・システムに下記ステップをさらに実行させることを含む。該ステップは、該ヒープ領域をスキャンし、使われていない実行時オブジェクトのハッシュ値フィールドの上記値を見つけて、新たな実行時オブジェクトに上記見つけた値を使用するステップを含む。
本発明の1つの実施態様では、上記スキャンが、ガーベジコレクションにおいて実行される。
本発明の1つの実施態様では、上記値に割り当てられるビット長が、可変長である。
本発明の1つの実施態様では、上記ハッシュ値フィールドが、上記オブジェクトのオブジェクト・ヘッダ内にある。
本発明はまた、コンピュータ・システムに上記方法のいずれか1つに記載の各ステップを実行させるコンピュータ・プログラムを提供する。
本発明はまた、ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡するためのコンピュータ・システムを提供する。該コンピュータ・システムは、
上記実行時オブジェクトを格納するメモリと、
上記データ構造から上記値を取得する取得部と、
上記取得した値に対応する上記オブジェクトの割り付け場所を特定する特定部と
を含む。
本発明はまた、ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡することを可能にするためのコンピュータ・システムを提供する。該コンピュータ・システムは、
上記実行時オブジェクトのメモリへの割り付けに応じて、
上記データ構造の上記ハッシュ値フィールド内に、上記プログラム中のオブジェクトの上記割り付け場所に対応した値を埋め込む埋込部を含む。ここで、上記ハッシュ値フィールドがハッシュ値として上記埋め込まれた値とオブジェクト識別子とを含み、上記追跡が該埋め込まれた値に対応する上記オブジェクトの割り付け場所を特定することによって行われる。
本発明の1つの実施態様では、上記コンピュータ・システムはさらに、
上記実行時オブジェクトのハッシュ値の参照命令が実行されることに応じて、
上記埋め込まれた値を、計算された値に置き換える置換部と、
上記計算された値と上記埋め込まれた値との対応表をメモリ内に作成する作成部と
を含む。
本発明の1つの実施態様では、上記コンピュータ・システムはさらに、上記プログラム中のオブジェクトの割り付け場所が同一である実行時オブジェクトが多くメモリに割り付けられる場合、上記ハッシュ値フィールド中の値に割り当てられるビット長を短くし、一方上記オブジェクト識別子に割り当てられるビット長を長くする調整部をさらに含む。
本発明の1つの実施態様では、上記コンピュータ・システムはさらに、メモリのヒープ領域をスキャンし、且つ使われていない実行時オブジェクトのハッシュ値フィールドから値を取得する再利用部を含む。
本発明の実施態様によれば、オブジェクトを割り付けた場所を探索するための情報が、ヒープ領域上のオブジェクトのハッシュ値フィールドに保持される。よって、上記情報が保持されることによって、ヒープ領域の消費量が増加しない。従って、デバッグ時と実行時とのヒープ領域についての環境が同一に保たれる。
また、本発明の実施態様によれば、ヒープ領域外のメモリ消費量が、オブジェクト数に比例して増加しない。すなわち、オブジェクトの数の増加に対して、メモリ消費量の増加の程度は、緩やかである。従って、メモリ消費量の増大を抑えたオブジェクト割り付け場所の探索が可能である。
従来技術における実行時オブジェクトのデータ構造の例を示す。 本発明の実施態様における、割り付け場所に対応した値を、図1のデータ構造(101)に含まれるハッシュ値フィールドに埋め込んだオブジェクトのデータ構造を示す。 本発明の実施態様における、図2Aに含まれるハッシュ値フィールドの詳細を示す。 本発明の実施態様における、図2Bで示すハッシュ値フィールド中のビットの振り分け方を可変にする概念図を示す。 本発明の実施態様における、図2Aで示すオブジェクトにおいて、値(静的番号)と値(動的番号)とを併用する例を示す。 本発明の実施態様における、図4Aの併用する例の処理フローチャートを示す。 本発明の実施態様における、プログラム中のオブジェクト割り付けによってハッシュ値フィールドに値が埋め込まれた実行時オブジェクトのデータ構造の例を示す。 本発明の実施態様における、プログラム中のハッシュ値参照命令によってハッシュ値フィールドの値が置き換えられる実行時オブジェクトのデータ構造の例を示す。 本発明の実施態様における、割り付け値フィールドのビット長を動的に縮めていく様子を示す。 本発明の実施態様における、図5に示すハッシュ値フィールドにおいて、2つの割り付け場所x及びyに二分木を用いて値(動的番号)を割り振る例を示す。 本発明の実施態様における、図5に示すハッシュ値フィールドにおいて、2つの割り付け場所x及びyに値(動的番号)を割り振るための二分木を示す。 本発明の実施態様における、指定された割り付け場所に指定されたビット長の新たな動的番号を割り振る処理のフローチャートを示す。 本発明の実施態様における、図2Bのハッシュ値フィールドのための定数定義を実装するプログラム例を示す。 本発明の実施態様における、図2Aのデータ構造を実装するためのプログラム例を示す。 本発明の実施態様における、図6Bの二分木に関するデータ構造を実装するためのプログラム例を示す。 本発明の実施態様における、ハッシュ値を参照する関数に、ハッシュ値フィールドの値(静的番号)を動的番号へと書き換えるアルゴリズムの組み込みを実装するためのプログラム例を示す。 本発明の実施態様における、ハッシュ値を参照する関数に、ハッシュ値フィールドの値(静的番号)を動的番号へと書き換えるアルゴリズムの組み込みを実装するためのプログラム例を示す。 本発明の実施態様における、ハッシュ値を参照する関数に、ハッシュ値フィールドの値(静的番号)を動的番号へと書き換えるアルゴリズムの組み込みを実装するためのプログラム例を示す。 本発明の実施態様における、値(静的番号)を埋め込んだ実行時オブジェクトのデータ構造を作成する方法、及び該データ構造を利用して、プログラム中のオブジェクトの割り付け場所を追跡するための方法のフロー図を示す。 本発明の実施態様における、値(動的番号)を埋め込んだ実行時オブジェクトのデータ構造を作成する方法、及び該データ構造を利用して、プログラム中のオブジェクトの割り付け場所を追跡するための方法のフロー図を示す。 本発明の実施態様における、値(静的番号)及び値(動的番号)をとも使用した実行時オブジェクトのデータ構造を作成する方法、及びそのデータ構造を利用してオブジェクトの割り付け場所を追跡するための方法のフロー図を示す。 本発明の実施態様における、図9A〜図9Cで示す、オブジェクトの割り付け場所の追跡結果の出力例を示す。 本発明の実施態様における、2つのアプリケーション(Trade 6及びSPECjbb2005)における、クラスごとの割り付け場所の静的な数を示す。 本発明の実施態様における、図11で使用した2つのアプリケーション(Trade 6,SPECjbb2005)における、ハッシュ値の平均衝突数と最大衝突数を示す。 本発明の実施態様における、図9A〜図9Cで示す、プログラムを追跡する処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。 本発明の実施態様における、図4B、図7及び図9で示す、ハッシュ値フィールドに保持されている値(静的番号)を値(動的番号)に置き換える処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。 本発明の実施態様における、図9A〜図9Cで示す、ハッシュ値フィールドに値(静的番号)を埋め込む処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。 本発明の実施態様における、使われていない実行時オブジェクトのハッシュ値フィールドの値を別の実行時オブジェクトの値とする処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。 本発明の実施態様における、図13に示すコンピュータ・ハードウェアのブロック図を示す。
本発明の実施態様において、「オブジェクト」とは、プログラム上の抽象化された手続きの対象を具体化したものである。
本発明の実施態様において、「実行時オブジェクト」は、プログラム中に記述されるオブジェクトの割り付け場所から生成されるオブジェクトである。「実行時オブジェクト」は、上記プログラムの実行時に、メモリ内、例えばヒープ領域内に割り付けられたオブジェクトである。実行時オブジェクトは、例えばクラスから生成される。実行時オブジェクトは、上記プログラムの実行が、例えば中断又は完了した場合であっても、ヒープ領域に存在しうる。実行時オブジェクトは、ハッシュ値フィールドを有する。また、実行時オブジェクトは、オブジェクトに関する情報を保持するためのオブジェクト・ヘッダを有しうる。該オブジェクト・ヘッダは、例えば、クラスポインタ、フラグ及びモニタを含みうる。また、上記ハッシュ値フィールドは、オブジェクト・ヘッダに含まれていてもよい。
なお、本発明の実施態様における「ヒープ領域」は、プログラムに使用されるヒープ領域全体ではなく、上記ヒープ領域全体の一部であって、実行時オブジェクトが割り付けられるヒープ領域のことをいう。上記ヒープ領域は、例えば、ガーベジコレクションの対象となるヒープ領域である。
本発明の実施態様において、「ハッシュ値フィールド」とは、上記実行時オブジェクトが有するフィールドである。ハッシュ値フィールドには、実行時オブジェクトのハッシュ値が保持される。ハッシュ値とは、実行時オブジェクトの同一性を識別するための識別子である。但し、異なる2つの実行時オブジェクトにおいて、同一のハッシュ値が保持されることは、既存のハッシュ値の仕様で許容されている。
ハッシュ値フィールドは、割り付け値フィールド及び識別子フィールドを含む。ハッシュ値フィールドは、参照フラグを含んでもよい。ハッシュ値フィールドについては、後述の図2Bの説明で詳しく述べる。
本発明の実施態様において、「割り付け場所に対応した値」とは、プログラム上のオブジェクト割り付け場所を一意に識別する値である。割り付け場所に対応した値は、上記割り付け値フィールドに保持される。上記値には、値(静的番号)及び値(動的番号)がある。
上記値(静的番号)は、例えば、プログラムの行番号及びプログラム・コードにおける相対的な位置を表す値である。上記値(静的番号)は、上記行番号又は上記相対的な位置を表す値に対応付けられた識別子であってもよい。コンピュータ・システムは、例えば、該識別子と行番号との対応が保存される対応表を参照することで、識別子から行番号を求めることができる。
上記値(動的番号)は、上記値(静的番号)に対応付けられた値である。コンピュータ・システムは、上記値(動的番号)と上記値(静的番号)との対応付けが保存される対応表を参照することで、上記値(動的番号)から上記値(動的番号)を求めることができる。
本発明の実施態様において、「オブジェクト識別子」とは、ランダムな値である。「オブジェクト識別子」は、上記識別子フィールドに保持される。
上記割り付け場所に対応した値とオブジェクト識別子とを組み合わせた値が、上記ハッシュ値になる。上記組み合わせには、上記参照フラグが含まれてもよい。
本発明の実施態様において、「ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム」とは、プログラムの実行環境において、ハッシュ値フィールドを有する実行時オブジェクトをメモリに割り付ける命令を有するプログラムをいう。「ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム」は、例えばソースコード又はバイトコード等の中間コードを含む。また、「ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム」は、例えば、オブジェクト指向型言語で記述されたプログラム又は上記プログラムがコンパイルされた中間コードである。オブジェクト指向型言語は、例えばJava(商標)、C++であるがこれらに限定されない。プログラムの実行環境は、例えば、JavaVM(商標)(Java Virtual Machine)であるが、これに限定されない。
本発明の実施態様において、「オブジェクトの割り付け場所」とは、ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム中において、例えば生成命令又はコピー命令により、オブジェクトがオブジェクト変数に割り付けられる、プログラム中の場所をいう。プログラム中の場所は、例えば、プログラムの行番号又はプログラム・コードにおける相対的な位置である。
本発明の実施態様において、「追跡する」とは、実行時オブジェクトから、該実行時オブジェクトを実装するためのプログラム中のオブジェクトの割り付け場所を特定することをいう。
本発明の実施態様において、「第1の対応表」とは、ハッシュ値が参照されたことのある実行時オブジェクトのハッシュ値フィールドに含まれる、割り付け場所に対応した値(以下、第1の値)と該第1の値に対応する割り付け場所を特定するための情報との対応付けを記録する。「第1の値に対応する割り付け場所を特定するための情報」とは、上記値(静的番号)を特定するための情報である。
本発明の実施態様において、「第2の対応表」とは、ハッシュ値が参照されたことのない実行時オブジェクトのハッシュ値フィールドに含まれる、割り付け場所に対応した値(以下、第2の値)と該第2の値に対応する割り付け場所との対応付けを記録する。
以下、図面に従って、本発明の実施態様を説明する。本実施態様は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。
以下では、最初に、図1において従来技術における実行時オブジェクトのデータ構造の例を説明する。次に、図2A及びBにおいて本発明の実施態様における実行時オブジェクトのデータ構造の例を説明する。
図1は、従来技術における実行時オブジェクトのデータ構造の例を示す。
図1は、Java(商標)言語で作成されたプログラムによって割り付けられた実行時オブジェクトの例である。
実行時オブジェクト(101)は、メモリ内のヒープ領域内に実装される。実行時オブジェクトは(101)、オブジェクト・ヘッダと、インスタンス変数を保持するオブジェクト・フィールドとを備える。
オブジェクト・ヘッダは、例えば、3ワード構成である。なお、1ワードは32ビットである。1ワード目には、クラスポインタが保持される。2ワード目には、ハッシュ値及びフラグが保持される。3ワード目には、モニタが保持される。
クラスポインタは、オブジェクトが属しているクラスを指すポインタである。ハッシュ値は、上記クラスに属するオブジェクトの同一性を識別するために付けられる値である。フラグは、例えばオブジェクトの各種状態を示す。該状態は、例えばロック状態である。モニタは、ガーベジコレクションのために使用される。
オブジェクト・ヘッダは、2ワード又は1ワードで構成される場合もある。
オブジェクトのフィールドは、オブジェクトの本体であるインスタンス変数が格納されるフィールドである。
実行時オブジェクト(102)は、実行時オブジェクト(101)が従来技術によって拡張された例を示す。従来技術では、実行時オブジェクト(101)に割り付け場所を特定するための情報を付加する場合、上記オブジェクト・ヘッダを拡張する。そして、該拡張された領域に1ワード分の割り付け場所番号が埋め込まれる。従って、実行時オブジェクト(101)は、実行時オブジェクト(102)のようなデータ構造になる。実行時オブジェクト(102)は、ヘッダが拡張されているため、実行時オブジェクト(101)に比べ、ヒープ領域がより多く消費される。
図2Aは、本発明の実施態様における、割り付け場所に対応した値を、図1のデータ構造(101)に含まれるハッシュ値に埋め込んだオブジェクトのデータ構造を示す。
実行時オブジェクト(201)では、ハッシュ値が格納されるハッシュ値フィールドの一部に、割り付け場所に対応した値が埋め込まれる。実行時オブジェクト(図1、102)のような拡張はされない。従って、ヒープ領域の消費量は、割り付け場所に対応した値が埋め込まれる前後で変化しない。また、上記ハッシュ値フィールドの残りの部分は、オブジェクト識別子と名付けられる。
図2Bは、本発明の実施態様における、図2Aに含まれるハッシュ値フィールドの詳細を示す。
ハッシュ値フィールド(202)は、割り付け値フィールド及び識別子フィールドで構成される。ハッシュ値フィールド(202)は、ハッシュ値フィールド(203)のように、さらに参照フラグで構成されていてもよい。
割り付け値フィールドには、割り付け場所に対応した値が保持される。該値は、値(静的番号)又は値(動的番号)である。
識別子フィールドにはオブジェクト識別子が保持される。オブジェクト識別子はランダムな値である。
参照フラグは、ハッシュ値フィールドがプログラムによって参照されたか否かを表すフラグである。参照フラグは、例えば1ビットの値であり、ハッシュ値フィールドが参照される前は0、参照された後は1が設定される。
ハッシュ値フィールド(202)は、少なくとも2ビット長で表される。該ビットは、上記割り付け値フィールド及び識別子フィールドに、例えば、上位ビットから順に割り当てられる。ハッシュ値フィールド(202)が、例えば8ビットで表されるとする。割り付け値フィールドに5ビット、識別子フィールドに3ビット割り当てられるとするならば、割り付け値フィールドには、2^5=32通りの割り付け場所に対応した値が格納できる。識別子フィールドには、2^3=8通りのオブジェクト識別子が格納できる。また、ハッシュ値フィールド(202)に格納されたハッシュ値が(01010001)ならば、割り付け場所に対応した値は(01010)であり、オブジェクト識別子は(001)である。
また、ハッシュ値フィールド(203)のように、ハッシュ値フィールドが、参照フラグを構成に含むならば、ハッシュ値フィールドは少なくとも3ビット長で表される。参照フラグは、参照の有無を表せるだけのビット長があればよく、例えば、1を参照されたとし、0を参照されていないとするならば、1ビットが割り当てられる。ハッシュ値フィールド(203)が、例えば16ビットで表されるとする。割り付け値フィールドに10ビット、識別子フィールドに5ビット、参照フラグに1ビット割り当てられるとするならば、割り付け値フィールド(203)には、2^10=1024通りの割り付け場所に対応した値が格納できる。識別子フィールドには、2^5=32通りのオブジェクト識別子が格納できる。また、ハッシュ値フィールド(203)に格納されたハッシュ値が(1011101110111011)ならば、割り付け場所に対応した値は(1011101110)、オブジェクト識別子は(11101)、参照フラグは1である。
上記割り付け場所に対応した値には、1ワードより短いビット長しか割り当てられていない。上記ビット長は、プログラム中の割り付け場所を指定するには不十分な長さに思えるかもしれない。しかし、実行時オブジェクト中には、該オブジェクトのクラスを一意に識別できるクラスポインタがある。よって、割り付け場所に対応した値は、プログラム全体で一意である必要はない。割り付け場所に対応した値は、同一のクラスのオブジェクトの割り付け場所を一意に識別できればよい。従って、ほとんどの場合、上記割り付け場所に対応した値を表すビットのビット長は、1ワードよりも短いビット長で十分である。
なお、上記ビット長が不足する場合の対応は、下記図3の説明において述べる。
ここで、ハッシュ値フィールドに格納されているハッシュ値は、オブジェクト同士を識別するために使用される値である。例えば、Java(商標)言語で作られたプログラムでは、オブジェクトが割り付けられるタイミングで、ハッシュ値にランダムな値が設定される。本発明の実施態様では、上記ハッシュ値に、割り付け場所に対応した値、オブジェクト識別子及び参照フラグが埋め込まれうる。そして、上記埋め込みが行われたハッシュ値は、依然として、オブジェクト同士を識別するために使用される。
図3は、本発明の実施態様における、図2Bで示すハッシュ値フィールド中のビットの振り分け方を可変にする概念図を示す。
本発明の実施態様では、同じ場所で割り付けられた実行時オブジェクトの割り付け場所に対応する値(静的番号)は同じである。従って、値(静的番号)のみを用いた場合、ハッシュ値を表すビットに含まれる上記値(静的番号)を表すビットが、同じ場所で割り付けられた実行時オブジェクト同士で同じ値となる。
ここで、上記ハッシュ値フィールド中のビットの振り分け方が固定の場合、割り付け場所に対応する値に割り当てられたビット長の分だけ、オブジェクト識別子に割り当てうるビット長は短くなる。つまり、オブジェクト識別子によって識別されるオブジェクトの数は、上記割り当てうるビット長が短いほど少なくなる。従って、プログラム・コード上の同じ場所で大量の実行時オブジェクトが割り付けられると、ハッシュ値の衝突が生じやすくなる。
ハッシュ値の衝突とは、異なるオブジェクトが同一ハッシュ値を有することをいう。異なるクラスのオブジェクト同士は、ハッシュ値が同じだとしても、ハッシュ値を比較されることは普通のプログラムでは稀である。しかし、同一クラスのオブジェクト同士は、異なるクラスのオブジェクト同士に比べてハッシュ値を比較されることが多い。従って、上記ハッシュ値は、少なくとも同一クラスのオブジェクトについては、異なった値をとることが望ましい。
上記ハッシュ値の衝突を避けるために、本発明の実施態様では、ソースコードの構造から予想される同じ場所で割り付けられるオブジェクトの量に応じて、割り付け値フィールドのビット長を可変にする。以下では、図3に示すシナリオ(301)及びシナリオ(302)を例として上記可変にする方法を説明する。
シナリオ(301)は、同一場所でオブジェクトが大量に割り付けられている例を示す。シナリオ(301)で示すコードでは、ループによって同一オブジェクトが大量に割り付けられる。シナリオ(301)で示すようなコードがプログラム中にある場合、該コードによって割り付けられるオブジェクトの有する識別子フィールドのビット長を長くし、割り付け値フィールドのビット長を短くすることが有効である。通常のプログラムでは、あるクラスのオブジェクトを大量に割り付ける場所はクラス毎に少数であると考えられる。従って、割り付け値フィールドのビット長は短くても構わない。
シナリオ(302)は、同一場所でオブジェクトが大量に割り付けられにくい例を示す。シナリオ(302)で示すコードでは、エラーの種類に応じて異なるオブジェクトが割り付けられる。シナリオ(302)に示すコードでは、発生したエラーに応じて、オブジェクトが1つ割り付けられるのみであり、各オブジェクトが同じ場所で大量に割り付けられることは少ない。また、発生していないエラーに対応するオブジェクトは割り付けられない。
通常のプログラムでは、シナリオ(302)で示すコードのように、オブジェクトをほとんど割り付けない場所は多数あると考えられる。シナリオ(301)で示すようなコードがプログラム中にある場合、割り付け値フィールドのビット長を長くし、識別子フィールドのビット長を短くすることが有効である。割り付けられるオブジェクトはほとんど無いため、識別子フィールドのビット長は短くても構わない。
ある割り付け場所で、どれだけの数のオブジェクトが割り付けられるかは、一般にはプログラムが実行されるまでわからない。そこで、本発明の実施態様では、割り付け値フィールドのビット長を、同一の割り付け場所でオブジェクトが多く割り付けられることに応じて動的に縮小させる。上記縮小させるために、各割り付け場所に複数の値(動的番号)が割り振られる。割り付け場所に最初に割り振られる値(動的番号)は、長いビット長を持つ。該値は、値(静的番号)であってもよい。上記割り付け場所で多数のオブジェクトが割り付けられると、よりビット長が短い新たな値(動的番号)が割り付け場所に割り振られる。上記ビット長が短い新たな値(動的番号)が割り振られると、上記オブジェクトの割り付け値フィールドのビット長は、新たな値(動的番号)のビット長に縮小され、上記短い新たな値(動的番号)が埋め込まれる。上記割り付け場所でさらに多数のオブジェクトが割り付けられると、さらに短い新たな値(動的番号)が割り付け場所に割り振られる。上記複数の値(動的番号)と割り付け場所との対応表は、ヒープ領域以外の記憶域に持つ。
上記割り付け値フィールドのビット長を動的に縮める方法では、対応表を参照するという専用の処理が、オブジェクト割り付け時に必要になる。従って、単にオブジェクトを割り付ける場合に比べ、プログラムの速度オーバーヘッドが大きくなる。しかし、実際のプログラムでは、ほとんどのオブジェクトのハッシュ値は、実行中に一度も参照されることはない。また、例えばJava(商標)言語では、ハッシュ値を参照するメソッドであるhashCode()メソッドを含むオブジェクトのクラスの多くは、hashCode()メソッドをオーバーライドしている。そして、該オーバーライドしたメソッドにおいて、ハッシュ値は独自に定義される。従って、上記ハッシュ値フィールドに埋め込まれているハッシュ値が参照されることはない。
値(動的番号)を用いる場合、上記専用の処理が必要になる。一方、値(静的番号)を用いる場合、上記専用の処理は必要ではない。よって、値(静的番号)を用いる場合、値(動的番号)を用いる場合に比べ、プログラムは速く動作する。しかし、上記値(静的番号)を用いる場合、同じ場所で割り付けられるオブジェクトの数に応じて、割り付け値フィールドのビット長を変更させることはできない。
そこで、以下では、値(静的番号)と値(動的番号)とを併用する方法を述べる。
図4Aは、本発明の実施態様における、図2Aで示すオブジェクトにおいて、値(静的番号)と値(動的番号)とを併用する例を示す。
実行時オブジェクト(401)は、値(静的番号)をプログラム中のオブジェクトの割り付け場所に対応した値として用いた場合の実行時オブジェクトを示す。実行時オブジェクト(402)は、値(動的番号)をプログラム中のオブジェクトの割り付け場所に対応した値として用いた場合の実行時オブジェクトを示す。
値(静的番号)と値(動的番号)とを併用する場合、コンピュータ・システムは、実行時オブジェクトがヒープ領域に割り付けられることに応じて、値(静的番号)を実行時オブジェクト(401)のハッシュ値フィールドに埋め込む。また、コンピュータ・システムは、実行時オブジェクトのハッシュ値を参照する命令が初めて実行されるタイミングで、値(静的番号)を値(動的番号)に置き換える。
以下に、値(静的番号)のハッシュ値フィールドへの埋め込みを詳しく説明する。
実行時オブジェクトがヒープ領域に割り付けられることに応じて、コンピュータ・システムは、値(静的番号)を上記実行時オブジェクトのハッシュ値フィールドに埋め込む。コンピュータ・システムは、値(静的番号)が固定長ならば高速にハッシュ値フィールドに、値(静的番号)埋め込むことができる。ここで、コンピュータ・システムは、上記値(静的番号)に対応する識別子をハッシュ値フィールドに埋め込んでもよい。併せてコンピュータ・システムは、ハッシュ値が一度も参照されていないことを示す参照フラグをハッシュ値フィールドに埋め込む。参照フラグには、例えば、上記オブジェクトが参照されていない場合を0とするならば、コンピュータ・システムは、「0」を設定する。なお、コンピュータ・システムは、オブジェクト識別子を設定する必要はない。
以下に、値(静的番号)の値(動的番号)への置き換えを詳しく説明する。
実行時オブジェクトのハッシュ値を参照する命令が初めて実行されることに応じて、コンピュータ・システムは、ハッシュ値フィールドを置き換える。該書き換えでは、値(動的番号)がハッシュ値フィールドに埋め込まれる。また、コンピュータ・システムは、乱数を生成し、そして該生成した乱数をオブジェクト識別子として、ハッシュ値フィールドに埋め込む。さらにコンピュータ・システムは、上記参照フラグにオブジェクトが参照されたことを示す値を設定する。該値は、例えば「1」である。コンピュータ・システムは、上記置き換えられたハッシュ値フィールドの値を、ハッシュ値として参照元に返す。なお、一度置き換えられたハッシュ値フィールドは、該ハッシュ値フィールドを有するオブジェクトの生存期間中にさらに置き換えられることはない。
上記「実行時オブジェクトがヒープ領域に割り付けられること」及び「実行時オブジェクトのハッシュ値を参照する命令が初めて実行されること」は、例えば、プログラムが、just-in-time(JIT)コンパイルされる時に、コンピュータ・システムによって検出されてもよい。また、プログラムがインタプリタによって実行される場合、上記「実行時オブジェクトがヒープ領域に割り付けられること」及び「実行時オブジェクトのハッシュ値を参照する命令が初めて実行されること」は、プログラムがメモリ上にロードされること又は実行されることに応じて、コンピュータ・システムによって検出されてもよい。
上記検出は、ソースコード又は中間コードに含まれる割り付ける命令及び参照する命令がスキャンされることで行われうる。
また、上記ハッシュ値フィールドの置き換えを行う処理が、クラスライブラリに含まれる割り付ける命令及び参照する命令自身に追加されてもよい。
なお、値(静的番号)と値(動的番号)とを併用する場合、オブジェクトのハッシュ値が参照されたか否かを示す参照フラグに1ビットが必要になる。従って、割り付け値フィールド又は識別子フィールドに用いることのできるビットのビット長が1ビット短くなる。
値(静的番号)と値(動的番号)とを併用することにより、値(動的番号)のみを使用する場合に比べて、速度オーバーヘッドが減らされうる。また、値(静的番号)に値(動的番号)よりも長いビット長を用いることで、値(動的番号)のみを使用する場合に比べて、割り付け場所に対応する値を保持するビット長が不足する可能性が減らされうる。
図4Bは、本発明の実施態様における、図4Aの併用する例の処理フローチャートを示す。
ステップ410は、処理の開始である。
ステップ410では、コンピュータ・システムは、プログラム中のオブジェクトの割り付け場所を追跡されるプログラム(以下、「追跡されるプログラム」という場合がある)を実行する。該実行により、追跡されるプログラムに含まれる少なくとも1の命令が実行される。
ステップ411では、コンピュータ・システムは、実行される命令が全て終了したかどうかを判定する。コンピュータ・システムは、上記命令が全て終了するまで、ステップ412〜420を繰り返す。命令が全て終了していない場合、コンピュータ・システムは、次に実行される命令を上記プログラムから取得し、該処理はステップ412に進む。命令が全て終了している場合、ステップ422に進み、該処理は終了する。
ステップ412では、コンピュータ・システムは、上記取得した命令が、オブジェクトを割り付ける命令かどうかを判定する。取得した命令がオブジェクトを割り付ける命令の場合、該処理は、ステップ413に進む。取得した命令がオブジェクトを割り付ける命令ではない場合、該処理は、ステップ414に進む。
ステップ413では、コンピュータ・システムは、オブジェクトを割り付ける命令を実行し、実行時オブジェクトを生成する。実行時オブジェクトは、メモリ内、特にメモリのヒープ領域内に生成される。コンピュータ・システムは、上記実行時オブジェクトのハッシュ値フィールドに、プログラム中の割り付け場所に対応した値(静的番号)及び参照フラグを埋め込む。コンピュータ・システムは、例えば、第2の対応表から上記値(静的番号)に対応する識別子を取得し、該対応する識別子を上記値(静的番号)として、ハッシュ値フィールドに埋め込んでもよい。コンピュータ・システムが、上記第2の対応表を使用する場合、ユーザは、あらかじめ上記第2の対応表に上記値(静的番号)と上記対応する識別子との対応を保存しておく。また、コンピュータ・システムは、上記参照フラグを設定する場合、実行時オブジェクトが参照されていないことを表す値、例えば0を設定する。上記埋め込みが終了することに応じて、該処理は、ステップ421に進む。
ステップ414では、コンピュータ・システムは、上記取得した命令が、オブジェクトのハッシュ値を参照する、参照元からの命令かどうかを判定する。上記取得した命令がオブジェクトのハッシュ値を参照する命令の場合、該処理は、ステップ415に進む。上記取得した命令がオブジェクトのハッシュ値を参照する命令ではない場合、該処理は、ステップ421に進む。
ステップ415では、コンピュータ・システムは、参照されるオブジェクトの参照フラグが立っているかどうかを判定する。コンピュータ・システムは、まずハッシュ値が参照される実行時オブジェクトの参照フラグを該実行時オブジェクトのハッシュ値フィールドから取得する。該取得した参照フラグに上記実行時オブジェクトが参照されていないことを表す値が設定されている場合、コンピュータ・システムは、ハッシュ値フィールドに値(静的番号)が埋め込まれていると判断し、処理はステップ416に進む。上記取得した参照フラグに上記実行時オブジェクトが参照されていることを表す値が設定されている場合、コンピュータ・システムは、ハッシュ値フィールドに値(動的番号)が埋め込まれていると判断し、処理はステップ420に進む。
ステップ416では、コンピュータ・システムは値(動的番号)を求める。コンピュータ・システムは、上記値(動的番号)を、例えば後述する二分木によって求める。また、コンピュータ・システムは、上記二分木より、実行時オブジェクトのハッシュ値フィールド中の割り付け場所に対応した値(静的番号)に対応する所定のビット長を有する現在の値(動的番号)を得る。
ステップ417では、コンピュータ・システムは、オブジェクト識別子を求める。コンピュータ・システムは、例えばC++言語であれば、thisポインタのアドレスのビットの一部をオブジェクト識別子とする。コンピュータ・システムは、例えばJava(商標)言語であれば、random関数を用いて取得されるランダムな値をオブジェクト識別子とする。
ステップ418では、コンピュータ・システムは、実行時オブジェクトのハッシュ値フィールドに上記値(動的番号)及び上記オブジェクト識別子を書き込む。上記書き込みにおいて、コンピュータ・システムは、オブジェクト割り付け時に実行時オブジェクトのハッシュ値フィールドに書き込まれた値(静的番号)を該ハッシュ値フィールドから取得する。コンピュータ・システムは、上記取得した値(静的番号)と上記求めた値(動的番号)との対応を第1の対応表に保存する。該保存が終了することにともない、コンピュータ・システムは、上記求めた値(動的番号)及び上記オブジェクト識別子を実行時オブジェクトのハッシュ値フィールドに書き込む。
ステップ419では、コンピュータ・システムはハッシュ値が参照されたことを示す参照フラグを実行時オブジェクトのハッシュ値フィールドに書き込む。該書き込まれる参照フラグの値は、ステップ413で設定された値が0ならば、例えば1である。
ステップ420では、コンピュータ・システムは、上記ハッシュ値フィールドの値を該オブジェクトのハッシュ値として参照元に返す。
ステップ421では、該処理はステップ411に戻る。
ステップ422は、該処理の終了である。
図4Cは、本発明の実施態様における、プログラム中のオブジェクト割り付けによってハッシュ値フィールドに値が埋め込まれた実行時オブジェクトのデータ構造の例を示す。
プログラム・コード(430)では、プログラム中の2つの割り付け場所(00001)及び(00010)において、それぞれ3つのオブジェクトを割り付ける記述がなされている。上記割り付けに対応して、6つの実行時オブジェクト(431〜436)がメモリ中のヒープ領域に割り付けられる。割り付け場所(00001)で割り付けられるオブジェクト(431〜433)のデータ構造は、図4Aのオブジェクト401で示した構造と同じである。すなわち、割り付け場所(00001)に対応する値(00001)及び参照フラグがハッシュ値フィールドに埋め込まれている。値(00001)は、値(静的番号)である。参照フラグは、0である。ここで、0は、ハッシュ値が参照されていないことを表す。また、割り付け場所(00010)でのオブジェクト(434〜436)のデータ構造は、図4Aの401で示したデータ構造と同じである。すなわち、割り付け場所(00010)に対応する値(00010)及び参照フラグがハッシュ値フィールドに埋め込まれている。値(00010)は、値(静的番号)である。参照フラグは、0である。
図4Dは、本発明の実施態様における、プログラム中のハッシュ値参照命令によってハッシュ値フィールドの値が置き換えられる実行時オブジェクトのデータ構造の例を示す。
プログラム・コード(440)では、プログラム内にオブジェクトのハッシュ値を参照する3つの命令が記述されている。該命令が実行された後の実行時オブジェクトの構造はオブジェクト(441〜446)に示される。実行時オブジェクト(441〜446)それぞれは、図4Cの実行時オブジェクト(431〜436)に対応する。
割り付け場所00001でのオブジェクトobj1[0]及びobj1[1]のハッシュ値参照によって変化した後の実行時オブジェクトobj1[0]及びobj1[1]のデータ構造が441及び442に示される。実行時オブジェクト(441)のハッシュ値フィールドには、割り付け場所に対応する値(動的番号)000、オブジェクト識別子10及び参照フラグ1が埋め込まれている。ここで、参照フラグ1は、ハッシュ値が参照されていることを表す。実行時オブジェクト(442)のハッシュ値フィールドには、割り付け場所に対応する値(動的番号)000、オブジェクト識別子01及び参照フラグ1が埋め込まれている。
同様に、割り付け場所00010でのオブジェクトobj2[0]のハッシュ値参照によって変化した後の実行時オブジェクトobj2[0] のデータ構造が444に示されている。実行時オブジェクト(444)のハッシュ値フィールドには、割り付け場所に対応する値(動的番号)001、オブジェクト識別子11及び参照フラグ1が埋め込まれている。他の実行時オブジェクトは、参照されていないので、参照前の図4Cのデータ構造のままであり何ら変更されていない。
ここで、プログラム・コード(440)が再度実行された場合、実行時オブジェクトobj1[0]のデータ構造(441)、実行時オブジェクトobj1[1]のデータ構造(442)及び実行時オブジェクトobj2[0]のデータ構造(444)は変更されない。すなわち、一度動的番号が割り振られた実行時オブジェクトは、該実行時オブジェクトが生きている間、ハッシュ値フィールドの値が置き換えられることはない。
図5は、本発明の実施態様における、割り付け値フィールドのビット長を動的に縮めていく態様を示す。
最初の値(動的番号)0は、該値(動的番号)の割り付け場所xで割り付けたいずれかのオブジェクトのハッシュ値が初めて参照されるごとに、ハッシュ値フィールドに割り振られる。
割り付け場所xに最初に割り振られる値(動的番号)0は、相対的に長いビット長を有し、オブジェクト識別子のビット長はL0である。該値(動的番号)の割り付け場所で多数のオブジェクトを割り付けられて、さらに上記割り付けられたオブジェクトのハッシュ値が参照されると、後述するタイミングで、よりビット長が短い新たな値(動的番号)が割り付け場所に対応した値(動的番号)として割り振られる。
本発明の実施態様では、新しい値(動的番号)を割り振るタイミングに、確率的なタイミングが用いられる。具体的には、上記参照時にオブジェクト識別子のビット又は該ビットの一部が全てゼロならば、新たなビット長の値(動的番号)1が割り付け場所に対応した値(動的番号)として割り振られる。以下同様に、よりビット長の短い値(動的番号)2,3、・・・nがP1(=1/2^L1)、P2(=1/2^L2)・・・Pn−1(1/2^Ln―1)の確率で割り振られていく。
また、図5の右側に示すように、新たに値(動的番号)1,2・・・nを割り振るたびに値(動的番号)1,2・・・nから割り付け場所xへの対応エントリが対応表に追加される。上記対応表は、ヒープ領域の外に割り付けられ、対応表の大きさは値(動的番号)の数に比例する。従って、対応表の大きさは、オブジェクトの数に比例することはない。値(動的番号)の数は、最大でもハッシュ値フィールドのビット長で表せる数である。該数は、ハッシュ値フィールドのビット長が14の場合、2^14を超えることはない。
なお、割り付け値フィールドのビット長を動的に縮めていく方法として、割り付け場所ごとに割り付け回数のカウンタを用意し、割り付け回数が閾値を越えたら新たな値(動的番号)を割り振るという方法がまたありうる。但し、上記カウンタを持つことは、プログラムの処理速度上好ましくない。
図6A及び図6Bは、本発明の実施態様における、図5に示すハッシュ値フィールドにおいて、2つの割り付け場所x及びyに二分木を用いて値(動的番号)を割り振る例を示す。
図6Aは、(a)〜(g)で示される段階ごとに、より短いビット長の値が割り振られる態様を示す。また、図6Aは、割り付け値フィールドのビット長を動的に縮めていく態様を示す。図6Bは、上記(a)〜(g)の各段階に対応した二分木上での割り振り動作を示す。ここでは、割り付け場所xには、(a)、(c)、(d)及び(g)の順番で値(動的番号)00000、0001、001及び10が割り振られる。また、割り付け場所yには、(b)、(e)及び(f)の順番で値(動的番号)00001、0100、及び010が割り振られる。説明の便宜のため、値(動的番号)に用いるビット長の最大を5とする。該値(動的番号)の割り振りは、具体的には、図6Bに示すような二分木構造で実現する。ここで、二分木構造とは、ノード(節点)が2つのブランチ(枝)を持つ木構造をいう。該木構造は、例えば右側のノードは同じ高さの左側のノードより必ず大きい(小さい)値を持つ。
二分木は、値(動的番号)の符号(エンコーディング)と割り付け場所x又はyの対応を表す。
以下に、(a)〜(g)で示される段階ごとに説明する。
(a)割り付け場所xに割り付けられたいずれかのオブジェクトのハッシュ値が、最初に参照されることに応じて、値(動的番号)00000がxに割り振られる(図6A(a)を見よ)。該割り振りに応じて、図6B(a)に示すように、値(動的番号)00000を枝にもつ対応するクラスの二分木が作成される。ここで、(x)というラベルが付いているノードは、現時点で割り付け場所xに割り振ることができるノードを説明のために示しており、上記(x)というラベルが付いているノードに(x)が実際に書き込まれるわけではない。
(b)yで割り付けられたいずれかのオブジェクトのハッシュ値が最初に参照されることに応じて、空いている次の5ビット長の値(動的番号)を二分木(図6B(b)を見よ)から探索して00001が割り振られる(図6A(b)を見よ)。その結果、0、00、000及び0000を表すノードはどの割り付け場所にも割り振れなくなる。なぜならば、xとyの区別がつかなくなるからである。なお、二分木(図6B(b)を見よ)の(--)というラベルは、現時点でどの割り付け場所にも割り振ることができない値(動的番号)を説明のために示しており、上記(--)というラベルが付いているノードに(--)が実際に書き込まれるわけではない。
(c)xで多くのオブジェクトが割り付けられ、且つ該割り付けられたオブジェクトの少なくとも1つのハッシュ値が参照されているうちに、確率P0でxの値(動的番号)のビット長が4に縮められる。xのために空いている4ビット長の値(動的番号)が二分木(図6B(c)を見よ)から探索されて、xの値(動的番号)0001が割り振られる(図6A(c)を見よ)。
(d)次に、xで多くのオブジェクトが割り付けられ、且つ該割り付けられたオブジェクトの少なくとも1つのハッシュ値が参照されているうちに、確率P1でxの値(動的番号)のビット長が3に縮められる。xのために空いている3ビット長の値(動的番号)が二分木(図6B(d)を見よ)から探索されて、xの値(動的番号)001が求められる(図6A(d)を見よ)。
(e)yで多くのオブジェクトが割り付けられ、且つ該割り付けられたオブジェクトのハッシュ値が参照されているうちに、確率P0でyの値(動的番号)のビット長が4に縮められる。yのために空いている4ビット長の値(動的番号)が二分木(図6B(e)を見よ)から探索されて、yの値(動的番号)0100が求められる(図6A(e)を見よ)。
(f)次に、yで多くのオブジェクトを割り付け、且つ該割り付けられたオブジェクトのハッシュ値が参照されているうちに、確率P1でyの値(動的番号)のビット長が3に縮められる。yのためにて空いている3ビット長の値(動的番号)が二分木(図6B(f)を見よ)から探索されて、値(動的番号)010が求められる(図6A(f)を見よ)。現在のノードより下にはyしかないので、xとyの区別がつかなくなることはない。
(g)同様に、xで多くのオブジェクトが割り付けられ、且つ該割り付けられたオブジェクトのが参照されているうちに、確率P2でxの値(動的番号)のビット長が2に縮められる。xのために空いている2ビット長の値(動的番号)が二分木(図6B(g)を見よ)から探索される。該探索の結果、値(動的番号)は10である(図6A(g)を見よ)。
上記二分木は、値(動的番号)から割り付け場所への対応表も兼ねることもできる。以下に、上記二分木からオブジェクトの割り付け場所を求める方法を示す。
コンピュータ・システムは、上記オブジェクトのハッシュ値を表すビットを左から順に取得する。コンピュータ・システムは、上記取得したビットに対応する二分木の枝を、ルートノードから取得した順に下降する。上記下降する過程で、割り付け場所が設定されているノードが見つかったならば、コンピュータ・システムは、上記割り付け場所を上記求める割り付け場所とする。
上記オブジェクトのハッシュ値が、例えば(1011)ならば、コンピュータ・システムは、ルートノードから1に対応する枝、0に対応する枝、1に対応する枝、そして1に対応する枝の順に、二分木を下降する。ここで、例えば、左から1桁目の1に対応する枝を下った先にあるノードには、何も設定されていないとする。また、左から2桁目の0に対応する枝を下った先にあるノードには、割り付け場所が設定されているとする。上記例の場合、コンピュータ・システムは、左から2桁目の0に対応する枝を下った先にあるノードに設定されている割り付け場所を、求める割り付け場所とする。
コンピュータ・システムは、上記二分木からオブジェクトの割り付け場所を求めるために、戻された値(動的番号)のビットを使用してもよい。以下、戻された値(動的番号)のビットを説明する。
値(動的番号)はクラスごとにランダムな値にされるので、値(動的番号)とクラス固有の定数CLASS_HASHとの排他的論理和を取った値を値(動的番号)とする。上記割り付け場所を求める場合、上記オブジェクトのハッシュ値の入っているワードとCLASS_HASHとの排他的論理和が求められる。値(動的番号)は、排他的論理和が取られる前の値(動的番号)に戻される必要がある。なお、CLASS_HASHは、例えば、クラスオブジェクトのアドレスの一部であって、クラス固有のランダム値であるとする。該戻された値(動的番号)のビットを使用して、上記二分木からオブジェクトの割り付け場所が求められうる。
なお、上記図6A及び図6Bの例では、割り付け場所ごとに直前に割り振ったノードから探索が開始される。ここで、高速化のために、ビット長ごとに直前に割り振られたノードを覚えておいて、次回は該割り振られたノードから探索が開始されてもよい。
図7は、本発明の実施態様における、指定された割り付け場所に指定されたビット長の新たな値(動的番号)を割り振る処理のフローチャートを示す。
上記フローチャートが実装される関数は、新たな値(動的番号)の割り振りが成功した場合はtrueを返し、失敗した場合はfalseを返す。
ステップ701では、コンピュータ・システムは、呼び出し元からの要求に応じて、上記関数を呼び出して処理を開始する。該処理が実行される関数の名前は、「Search_for_next_dynamic_ID」とする。また、該関数の入力は、割り付け場所及び該割り付け場所のビット長である。
ステップ702では、コンピュータ・システムは、入力で指定された割り付け場所の現在の値(動的番号)と入力で指定されたビット長とから二分木の対応するノードを得る。該ノードは、現在の値(動的番号)のビット列に左から入力で指定されたビット長だけマスクして取り出した番号に対応するノードである。該ノードを得ることに応じて、該処理はステップ703に進む。
ステップ703では、コンピュータ・システムは、上記得た現在のノードにいずれかの割り付け場所が設定されているかどうかを判定する。割り付け場所が設定されている場合、処理はステップ709に進む。割り付け場所が設定されていない場合、該処理はステップ704に進む。
ステップ704では、コンピュータ・システムは、現在のノードに子ノードがあるかを判定する。子ノードがある場合、処理はステップ705に進む。子ノードがない場合、該処理はステップ707に進む。
ステップ705では、コンピュータ・システムは、現在のノードに子ノードが2つあるかどうかを判定する。現在のノードに子ノードが2つある場合、該処理は、ステップ706に進む。現在のノードに子ノードが2つない場合、該処理は、706に進む。
ステップ706では、コンピュータ・システムは、現在のノードの子ノードには入力で指定された割り付け場所とは違う割り付け場所が設定されているかどうかを判定する。割り付け場所とは違う割り付け場所が設定されている場合、処理はステップ709に進む。割り付け場所と同じ割り付け場所が設定されている場合、該処理はステップ707に進む。
ステップ707では、コンピュータ・システムは、現在のノードに、入力で指定された割り付け場所を設定する。また、コンピュータ・システムは、入力で指定された割り付け場所の現在の値(動的番号)を更新する。該更新が終了すると、該処理はステップ708に進む。
ステップ708は、関数の終了である。ステップ708では、コンピュータ・システムは、関数が成功したことを示すtrueを関数の呼び出し元に返し、該処理は終了する。
ステップ709では、コンピュータ・システムは、現在のノードが、親ノードの“1”側の子ノードである限り、親ノードを現在のノードとしつつ木を上昇する。本発明の実施態様で使用される二分木では、枝は1又は0のビットで表す。親ノードの“1”側の子ノードであるとは、親ノードから見て1のビットで表される枝で繋がれた子ノードであることを示す。コンピュータ・システムは、現在のノードが親ノードの“1”側の子ノードである場合、親ノードを現在のノードとし、再帰的に“1”の枝を上昇する。該上昇は、現在のノードが、親ノードから見て1のビットで表される枝で繋がれた子ノードではなくなるまで繰り返され、該繰り返しが終了すると、該処理はステップ710に進む。
ステップ710では、コンピュータ・システムは、上記上昇によって求められた現在のノードの親のノードを現在のノードとする。該現在のノードが決定されたら、該処理はステップ711に進む。なお、親のノードが存在しない場合の処理は、次のステップ711で行われる。
ステップ711では、コンピュータ・システムは、ステップ710で親のノードを求める場合に、木のルートノードの上へさらにたどらなければならないかどうかを判定する。該判定により、木のルートノードの上へさらにたどらなければならない場合、該処理は、ステップ712に進む。木のルートノードの上へさらにたどらなくてもよい場合、該処理は、ステップ713に進む。
ステップ712では、コンピュータ・システムは、上記関数が失敗したことを示すfalseを関数の呼び出し元に返し、該処理は終了する。
ステップ713では、コンピュータ・システムは、ステップ710で決定された現在のノードから“1”側の子ノードへ一段階木を下降してから、“0”側の子ノードへ下降していく。該下降は、いずれかの割り付け場所が設定されているノードに到達するか、又は木の探索開始時点のノードと同じ高さのノードに到達するまで続けられる。ここで、木の探索開始時点のノードとは、ステップ702で得たノードである。また、上記下降において“0”側の子ノードがなく新たなノードが必要ならば、コンピュータ・システムは、二分木に新たなノードを生成する。該下降が終了したら、該処理は、ステップ703に戻る。
図8A〜Fは、本発明の実施態様を実装する場合のプログラム・コードの例を示す。なお、上記プログラム・コードは一例に過ぎずこれに限定されるものではない。
図8Aは、本発明の実施態様における、図2Bのハッシュ値フィールドのための定数定義を実装するプログラム例を示す。
プログラム・コード(801)は、1ワード=32ビットで、上位14ビットがハッシュ値フィールドに用いられる実装例を示す。
プログラム・コード(801)では、ハッシュ値フィールドのビット長は14に定義される。オブジェクト識別子が保存されるビットのビット長は、4〜14ビットとなるように定義される。割り付け場所に対応した値が保存されるビットの最大ビット長は、ハッシュ値フィールドのビット長(14ビット)から、オブジェクト識別子が保存されるビットのビット長のうち最小のビット(4ビット)を引いた長さのビット(10ビット)に定義される。参照フラグが保存されるビットは、18ビット目に設定される。なお、プログラム・コード(801)は、参照フラグをハッシュ値フィールドに含めない例を示す。
図8Bは、本発明の実施態様における、図2Aのデータ構造を実装するためのプログラム例を示す。
プログラム・コード(802)は、図2Aで示すオブジェクトを構造体で表した例を示す。
プログラム・コード(803)は、割り付け場所ごとの情報を保存するための構造体の例を示す。該構造体には、値(動的番号)及びオブジェクト識別子のビット長などの割り付け場所ごとに必要な情報が保存される。
図8Cは、本発明の実施態様における、図6Bの二分木に関するデータ構造を実装するためのプログラム例を示す。
プログラム・コード(804)は、図6Bで示す二分木のノードを構造体で表した例を示す。該構造体には、値(静的番号)、値(動的番号)及び他のノードとの関係などのノードごとに必要な情報が保存される。
プログラム・コード(805)は、図6Bで示す二分木を管理するための構造体の例を示す。該構造体は、クラスごとに用意され、二分木の排他制御及びルートノードについての情報が保存される。
図8D〜図8Fは、本発明の実施態様における、図4Bに示す、ハッシュ値を参照する関数に、ハッシュ値フィールドの値(静的番号)を値(動的番号)へと書き換えるアルゴリズムの組み込みを実装するためのプログラム例を示す。
上記関数では、呼び出し元にハッシュ値が返されるとともに、ハッシュ値が初めて参照されたならば、ハッシュ値フィールドの値(静的番号)が値(動的番号)へと書き換えられる。ここで、該書き換えは、原子的に実行される必要がある。
図9Aは、本発明の実施態様における、値(静的番号)を埋め込んだ実行時オブジェクトのデータ構造を作成する方法、及び該データ構造を利用して、プログラム中のオブジェクトの割り付け場所を追跡するための方法のフロー図を示す。
ステップ901では、コンピュータ・システムは、オブジェクト割り付け場所に対応する値(静的番号)を実行時オブジェクトのハッシュ値フィールドに埋め込む方法を開始する。該開始は、上記プログラムにおけるオブジェクト割り付けに対応して、実行環境、例えばJVMで実行時オブジェクトの生成を開始することに応じて行われる。
ステップ904では、コンピュータ・システムは、上記プログラム中のオブジェクト割り付け場所を例えばコンパイラを通じて取得する。
ステップ905では、コンピュータ・システムは、割り付け場所に対応する値(静的番号)がまだ生成されていない場合、割り付け場所に対応する値(静的番号)を生成する。該値(静的番号)は、ハッシュ値フィールドのビット長より短い固定のビット長を有する。
ステップ906では、コンピュータ・システムは、値(静的番号)と該値(静的番号)に対応する割り付け場所との対応付けを記録する対応表をメモリ内に格納する。なお、割り付け場所としてプログラムの行番号それ自体が用いられる場合、該対応表は不要である。
ステップ907では、コンピュータ・システムは、オブジェクト識別子を生成する。該オブジェクト識別子は、任意の方法で生成されうる。例えば、実行時オブジェクトを割り付けようとするアドレスを利用してもよい。
ステップ908では、コンピュータ・システムは、該値(静的番号)及びオブジェクト識別子を実行時オブジェクトのハッシュ値フィールドに埋め込む。
ステップ909では、コンピュータ・システムは、埋め込みを終了する。その後、所望のデータ構造を備えた実行時オブジェクトが、実行環境、例えばJVMで生成され、メモリ内に割り当てられる。
ステップ910では、コンピュータ・システムは、プログラム中のオブジェクトの割り付け場所の追跡を開始する。該追跡は、上記プログラムを実行して、上記プログラムの実行途中又は実行終了後に、追跡開始の指示がコンピュータ・システムに与えられることによって開始される。
ステップ911では、コンピュータ・システムは、ヒープ領域に残存している実行時オブジェクトのハッシュ値フィールドから、埋め込まれた値(静的番号)を取得する。
ステップ912では、コンピュータ・システムは、対応表を参照して、上記取得した値(静的番号)に対応するオブジェクトの割り付け場所を特定する。
ステップ912及びステップ911は、残存している全ての実行時オブジェクトに対して行われる。ステップ912及びステップ911は、ユーザによって指定された実行時オブジェクトに対して行われてもよい。コンピュータ・システムは、各オブジェクトと上記特定された割り付け場所との対応を、画面上に表示し、又はファイルとして出力する。
ステップ913では、コンピュータ・システムは、上記追跡を終了する。
なお、ステップ905で、値(静的番号)が行番号それ自体である場合は、ステップ906の対応表は不要である。また、ステップ907において、オブジェクト識別子を生成せず、実行環境で生成されるハッシュ値を表すビットのうち、値(静的番号)で置き換えられなかったビットで表される値をオブジェクト識別子として使ってもよい。
図9Bは、本発明の実施態様における、値(動的番号)を埋め込んだ実行時オブジェクトのデータ構造を作成する方法、及び該データ構造を利用して、プログラム中のオブジェクトの割り付け場所を追跡するための方法のフロー図を示す。
ステップ921では、コンピュータ・システムは、オブジェクト割り付け場所に対応する値(動的番号)を実行時オブジェクトのハッシュ値フィールドに埋め込む方法を開始する。該開始は、上記プログラムにおけるオブジェクト割り付けに対応して、実行環境、例えばJVMで実行時オブジェクトの生成を開始することに応じて行われる。
ステップ924では、コンピュータ・システムは、上記プログラム中のオブジェクト割り付け場所を例えばコンパイラを通じて取得する。
ステップ925では、コンピュータ・システムは、割り付け場所に対応する値(動的番号)が対応表に記録されていない場合又は同一の割り付け場所について値(動的番号)のビット長を変更する場合、割り付け場所に対応する値(動的番号)を生成する。該値(動的番号)は、ハッシュ値フィールドのビット長より短いビット長を有する。値(動的番号)では、最初は該値のビット長は比較的長く設定される。そして、同じオブジェクトで同じ割り付け場所に割り付けられ数が増えることに応じて、該値(動的番号)のビット長は次第に短く設定される。
ステップ926では、コンピュータ・システムは、値(動的番号)と該値(動的番号)に対応する割り付け場所との対応付けを記録する対応表をメモリ内に格納する。なお、値(動的番号)のビット長が次第に短く設定される場合、それに応じて同じ割り付け場所に複数の値(動的番号)が対応する対応表が作成される。
ステップ927では、コンピュータ・システムは、オブジェクト識別子を生成する。該オブジェクト識別子は、任意の方法で生成されうる。例えば、実行時オブジェクトを割り付けようとするアドレスを利用してもよい。
ステップ928では、コンピュータ・システムは、値(動的番号)及びオブジェクト識別子を実行時オブジェクトのハッシュ値フィールドに埋め込む。
ステップ929では、コンピュータ・システムは、埋め込みを終了する。その後、所望のデータ構造を備えた実行時オブジェクトが、実行環境、例えばJVMで生成され、メモリ内に割り当てられる。
ステップ930では、コンピュータ・システムは、プログラム中のオブジェクト割り付け場所の追跡を開始する。該追跡は、上記プログラムを実行して、上記プログラムの実行途中又は実行終了後に、追跡開始の指示がコンピュータ・システムに与えられることによって開始される。
ステップ931では、コンピュータ・システムは、ヒープ領域に残存している実行時オブジェクトのハッシュ値フィールドから、埋め込まれた値(動的番号)を取得する。
ステップ932では、コンピュータ・システムは、対応表を参照して、上記取得した値(動的番号)に対応するオブジェクトの割り付け場所を特定する。
ステップ932及びステップ931は、残存している全ての実行時オブジェクトに対して行われる。ステップ932及びステップ931は、ユーザによって指定された実行時オブジェクトに対して行われてもよい。コンピュータ・システムは、各オブジェクトと上記特定された割り付け場所との対応を、画面上に表示し、又はファイルとして出力する。
ステップ933では、コンピュータ・システムは、上記追跡を終了する。
図9Cは、本発明の実施態様における、値(静的番号)及び値(動的番号)をとも使用した実行時オブジェクトのデータ構造を作成する方法、及びそのデータ構造を利用してオブジェクトの割り付け場所を追跡するための方法のフロー図を示す。
ステップ941では、コンピュータ・システムは、オブジェクト割り付け場所に対応する値(静的番号)を実行時オブジェクトのハッシュ値フィールドに埋め込む方法を開始する。該開始は、上記プログラムにおけるオブジェクト割り付けに対応して、実行環境、例えばJVMで実行時オブジェクトの生成を開始することに応じて行われる。
ステップ942では、コンピュータ・システムは、図9Aのステップ904〜906の処理を実行する。次に、コンピュータ・システムは、値(静的番号)及び参照フラグをハッシュ値フィールドに埋めこむ。その後、実行時オブジェクトが実行環境、例えばJava(商標)言語で生成され、メモリ内に割り当てられる。
ステップ943では、上記生成されたオブジェクトへの参照が初めて行われると、コンピュータ・システムは、該オブジェクトのハッシュ値フィールドを置き換える動作を開始する。
ステップ944では、コンピュータ・システムは、置き換え対象オブジェクトのハッシュ値フィールドに保持されている値(静的番号)を取得する。
ステップ945では、コンピュータ・システムは、割り付け場所に対応する値(動的番号)を生成する。該値(動的番号)は、ハッシュ値フィールドのビット長より短いビット長を有する。値(動的番号)では、最初は該値のビット長は比較的長く設定される。そして、同じオブジェクトで同じ割り付け場所に割り付けられ数が増えることに応じて、該値(動的番号)のビット長は次第に短く設定される。
ステップ946では、コンピュータ・システムは、該値(動的番号)と該値(動的番号)に対応する割り付け場所との対応付けを記録する対応表をメモリ内に格納する。なお、値(動的番号)のビット長が次第に短く設定される場合、それに応じて同じ割り付け場所に複数の値(動的番号)が対応する対応表が作成される。
ステップ947では、コンピュータ・システムは、オブジェクト識別子を生成する。該オブジェクト識別子は、任意の方法で生成されうる。例えば、実行時オブジェクトを割り付けようとするアドレスを利用してもよい。
ステップ948では、コンピュータ・システムは、値(動的番号)及びオブジェクト識別子を実行時オブジェクトのハッシュ値フィールドに埋め込む。またコンピュータ・システムは、実行時オブジェクトのハッシュ値フィールドの参照フラグを立てる。
ステップ949では、コンピュータ・システムは、埋め込みを終了する。その後、所望のデータ構造を備えた実行時オブジェクトが、実行環境、例えばJVMで生成され、メモリ内に割り当てられる。
ステップ950では、コンピュータ・システムは、プログラム中のオブジェクト割り付け場所の追跡を開始する。該追跡は、上記プログラムを実行して、上記プログラムの実行途中又は実行終了後に、追跡開始の指示がコンピュータ・システムに与えられることによって開始される。
ステップ951では、コンピュータ・システムは、ヒープ領域に残存している実行時オブジェクトのハッシュ値フィールドから、埋め込まれた値(動的番号)を取得する。
ステップ952では、コンピュータ・システムは、対応表を参照して、上記取得した値(動的番号)に対応するオブジェクトの割り付け場所を特定する。
ステップ952及びステップ951は、残存している全ての実行時オブジェクトに対して行われる。ステップ952及びステップ951は、ユーザによって指定された実行時オブジェクトに対して行われてもよい。コンピュータ・システムは、各オブジェクトと上記特定された割り付け場所との対応を、画面上に表示し、又はファイルとして出力する。
ステップ953では、コンピュータ・システムは、上記追跡を終了する。
本発明の実施態様では、コンピュータ・システムは、上記値(静的番号)又は値(動的番号)を回収して再使用しうる。該再使用の手順を以下に述べる。
コンピュータ・システムは、定期的にヒープ領域をスキャンする。該スキャンは、例えば、ガーベジコレクションが実行されることに応じて実行されてもよい。ガーベジコレクションが実行されることに応じて該スキャンが実行されることにより、コンピュータ・システムは、システムにかかる負荷を低く抑えることができる。また、上記スキャンは、プログラム・コード上の実行頻度の低い割り付け場所で割り付けられるオブジェクトに対してのみ行われてもよい。
上記スキャンでは、コンピュータ・システムは、割り付けられた全てのオブジェクトが生きていない割り付け場所に対応する値(静的番号)及び値(動的番号)を取得する。また、コンピュータ・システムは、割り付けられた全てのオブジェクトに値(動的番号)が埋め込まれている割り付け場所に対応する値(静的番号)を取得してもよい。
コンピュータ・システムは、上記取得した値(静的番号)及び値(動的番号)を、例えば対応表に記録する。
コンピュータ・システムは、新たな割り付け場所で実行時オブジェクトが割り付けられた場合、上記記録された値(静的番号)を新たな割り付け場所に対応する値(静的番号)として使用しうる。
また、コンピュータ・システムは、上記新たな割り付け場所で実行時オブジェクトのハッシュ値が参照された場合、上記記録された値(動的番号)を上記新たな割り付け場所に対応する値(動的番号)として使用しうる。
コンピュータ・システムは、上記取得された値(静的番号)又はそれに対応する割り付け場所で新たにオブジェクトが割り付けられた場合、新たな値(静的番号)又は「その他」を表す特別な値を上記取得された値(静的番号)に対応する割り付け場所に割り振る。コンピュータ・システムは、上記割り振られた値を、例えば対応表に記録する。
また、コンピュータ・システムは、上記取得された値(動的番号)に対応する割り付け場所で新たに割り付けられたオブジェクトのハッシュ値が参照された場合、新たな値(動的番号)又は「その他」を表す特別な値を上記取得された値に対応する割り付け場所に割り振る。コンピュータ・システムは、上記割り振られた値を、例えば対応表に記録する。
値(静的番号)が足りなくなった場合、コンピュータ・システムは、同じメソッド中の割り付け場所を同じ値(静的番号)になるように割り振り直し、そしてオブジェクト・ヘッダに埋め込まれている値(静的番号)を上記割り振り直された同じ値(静的番号)に書き換えてもよい。
図10は、本発明の実施態様における、図9A〜図9Cで示す、オブジェクトの割り付け場所の追跡結果の出力例を示す。
あるプログラムを実行するとヒープ領域の使用量が無制限に増えていくバグが発見されたとする。該出力例は、該あるプログラムを実行中のある時点において、ヒープ領域にある実行時オブジェクトのメモリ内アドレスと、該プログラム中の割り付け場所の一覧を表示させたものである。該出力から、例えば、最も多くのオブジェクトを割り付けている場所を知ることができる。本出力例では、メソッドmeth2の行番号128に割り付けられたオブジェクトの数が非常に多いことが分かる。これによって、例えばヒープ領域の使用量が無制限に増加していくバグの原因が、メソッドmeth2の行番号128にある可能性が高いことが推定される。このように、オブジェクトの割り付け場所を追跡可能にすることで上記バグの原因が見つけることができ、結果としてプログラムの信頼性が上がる。
図11は、本発明の実施態様における、2つのアプリケーション(Trade 6及びSPECjbb2005)における、クラスごとの割り付け場所の静的な数を示す。
図9A〜図9Cに示す方法を実装したシミュレータを使用して、下記の実験を行った。
実験では、まずJava(商標)仮想マシン(Java VM)に対してJVMTI(商標)(Java Virtual Machine Tool Interface)を用い、実行時オブジェクトの割り付け及びjava.lang.Object.hashCode()の呼び出しのトレースを取った。なお、java.lang.System.identityHashCode()の呼び出しのトレースは取っていない。また、hashCode()をオーバーライドしているクラス、例えば、java.lang.String、 java.lang.Integerのオブジェクトに対する呼び出しは、上記トレースの対象から除外している。次にトレースをシミュレータに入力して、割り付け場所の数及び本発明の実施態様によるハッシュ値の衝突の数を調べた。実験で用いられた実装は、オブジェクト識別子を表すビットの下半分のビットが0になったタイミングで新たな値(動的番号)を割り振ること以外は、上で示した擬似コードと同等の実装である。また、15ビット長のランダムな値をハッシュ値として用いた場合と値(静的番号)をそのままハッシュ値として用いた場合との衝突の数も調べた。アプリケーションとしてSPECjbb2005を1 warehouseで2分間動かした場合とWebSphere Application Server 6.1を起動開始からTrade6を動かして2分間負荷をかけた場合とを調べた。
図11に示す数はバイトコード中の割り付け場所の数であり、JVM中でStringリテラルなどを割り付けている場所の数は含まれない。最も多い割り付け場所の数はTrade6においてObjectクラスの配列の14933箇所であった。これは14ビットで表せる数であり、本実験で値(静的番号)があふれることは無かった。
図12は、本発明の実施態様における、図11で使用した2つのアプリケーション(Trade 6,SPECjbb2005)における、ハッシュ値の平均衝突数と最大衝突数を示す。
衝突数とは、あるハッシュ値を持つオブジェクトの数であり、全てのオブジェクトが異なるハッシュ値を持つならば衝突数は1である。現実のプログラムでは異なるクラスのオブジェクトのハッシュ値が比較されることは少ないことから、本実験では同じクラスのオブジェクトの間のみで衝突を調べた。また、オブジェクトの生存期間は考慮していないので、同時に生きていないオブジェクトの間で起きた衝突もカウントしている。図12に示す実験結果より、本発明の実施態様による衝突は十分に少なく実用的である。
本実験では、新たな動的番号を割り振れないケースがTrade 6で15回起きた。上記ケースのいずれにおいても、何らかの値(動的番号)が既に割り振られている割り付け場所に新たな動的番号を割り振ろうとして失敗したケースであった。図8A〜図8Fのプログラムに示したように、このように失敗したケースでは既に割り振られた値(動的番号)を使い続けるので、割り付け場所情報の曖昧さは生じない。
図13A〜図13Dは、本発明の実施態様における、図4B、図7及び図9に示す処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。
図13Aは、本発明の実施態様における、図9A〜図9Cで示す、プログラムを追跡する処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。
コンピュータ・システム(1300)は、記憶部(1301)、CPU(1304)、メモリ(1305)、取得部(1320)及び特定部(1321)を含む。記憶部(1301)は、コンピュータ・システム(1300)の内部にあっても外部にあってもよい。記憶部(1301)はまた、コンピュータ・システム(1300)に接続されているネットワーク上の記憶装置又は他のコンピュータ・システム内にある記憶装置であってもよい。記憶部(1301)は、追跡されるプログラム(1302)を格納する。記憶部(1301)は、第2の対応表(1303)を格納してもよい。
CPU(1303)は、図9A〜図9Cで示す追跡する処理を実行する。CPU(1303)は、第2の対応表(1303)が記憶部(1301)に格納されているならば、該実行に応じて、第2の対応表(1303)をメモリ(1305)内に読み込む。
メモリ(1305)は、ヒープ領域(1306)を含む。メモリ(1305)には、記憶部(1301)から読み込まれた追跡されるプログラム(1302)、及び任意的に第1の対応表(1310)及び第2の対応表(1310)が保持されている。また、ヒープ領域(1306)には、メモリ(1305)に読み込まれた追跡されるプログラム(1302)によって、実行時オブジェクト(1307〜1309)が割り付けられている。
取得部(1320)は、実行時オブジェクト(1307〜1309)のハッシュ値フィールドから、プログラム中のオブジェクトの割り付け場所に対応した値を取得する。
特定部(1321)は、上記取得した値から割り付け場所を特定する。該特定には、第1の対応表(1310)、第2の対応表(1303)又はそれらの組み合わせが使用されてもよい。
図13Bは、本発明の実施態様における、図4B、図7及び図9で示す、ハッシュ値フィールドに保持されている値(静的番号)を値(動的番号)に置き換える処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。
置換部(1322)、作成部(1323)及び調整部(1324)以外の機能ブロックは、図13Aのそれらと同じである。
CPU(1304)は、図9B及び図9Cで示す処理を実行する。CPU(1304)は、追跡されるプログラム(1301)を記憶部(1301)からメモリ(1302)に読み出す。CPU(1304)は、追跡されるプログラム(1301)を実行する。該実行により、ヒープ領域(1306)には、実行時オブジェクト(1307〜1309)が割り付けられる。
置換部(1322)は、実行時オブジェクト(1307〜1309)のハッシュ値を参照する命令が初めて実行されることに応じて、実行時オブジェクト(1307〜1309)が有する値及びオブジェクト識別子を、新たな値及び新たなオブジェクト識別子に置換する。さらに、上記実行時オブジェクト1307〜1309が参照フラグを有する場合、置換部(1322)は、参照フラグを立てる。
作成部(1323)は、上記値と上記新たな値との対応を第1の対応表(1310)に保存する。
調整部(1324)は、プログラム中のオブジェクトの割り付け場所が同一である実行時オブジェクト(1307〜1309)が多く初めて参照されることに応じて、上記割り付け場所が同一である実行時オブジェクト(1307〜1309)の値に割り当てられるビット長を短くし、一方オブジェクト識別子に割り当てられるビット長を長くする。
図13Cは、本発明の実施態様における、図9A〜図9Cで示す、ハッシュ値フィールドに値(静的番号)を埋め込む処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。
埋込部(1325)以外の機能ブロックは、図13A及び図13Bのそれと同じである。
CPU(1304)は、図9Aで示す処理を実行する。CPU(1304)は、追跡されるプログラム(1301)を記憶部(1301)からメモリ(1302)に読み出す。CPU(1304)は、追跡されるプログラム(1301)を実行する。該実行により、ヒープ領域(1306)には、実行時オブジェクト(1307〜1309)が割り付けられる。
埋込部(1325)は、実行時オブジェクト(1307〜1309)のメモリへの割り付けに応じて、実行時オブジェクト(1307〜1309)のハッシュ値フィールドに、追跡されるプログラム(1302)中のオブジェクトの割り付け場所に対応した値及びオブジェクト識別子を埋め込む。埋込部(1325)は、実行時オブジェクト(1307〜1309)のハッシュ値フィールドに、さらに参照フラグを埋め込んでもよい。
調整部(1324)は、プログラム中のオブジェクトの割り付け場所が同一である実行時オブジェクト(1307〜1309)が多く割り付けられることに応じて、上記割り付け場所が同一である実行時オブジェクト(1307〜1309)の値に割り当てられるビット長を短くし、一方オブジェクト識別子に割り当てられるビット長を長くする。
図13Dは、本発明の実施態様における、使われていない実行時オブジェクトのハッシュ値フィールドの値を別の実行時オブジェクトの値とする処理を実行するコンピュータ・システムの有する機能を図示する機能ブロック図を示す。
埋込部(1325)以外の機能ブロックは、図13A〜図13Cのそれと同じである。
CPU(1304)は、追跡されるプログラム(1301)を記憶部(1301)からメモリ(1302)に読み出す。CPU(1304)は、追跡されるプログラム(1301)を実行する。該実行により、ヒープ領域(1306)には、実行時オブジェクト(1307〜1309)が割り付けられる。ここで、実行時オブジェクト1(1307)は、使われていない実行時オブジェクトとする。また。実行時オブジェクト2(1308)は、値が不足しているため、ハッシュ値フィールドに値が保持されなかった実行時オブジェクトとする。
再利用部(1326)は、ヒープ領域(1306)をスキャンし、使われていない実行時オブジェクト2(1308)のハッシュ値フィールドから値を取得する。再利用部(1326)は、実行時オブジェクト2(1308)のハッシュ値フィールドに上記取得した値を埋め込む。
実行が進むにつれて新たに割り付け場所に対応した値を割り振っていくと、値(静的番号)又は値(動的番号)のビット長が足りなくなる可能性がある。そこで、再利用部(1326)は、実行頻度が低い割り付け場所の番号又はヒープ領域をスキャンし、生きているオブジェクトがない値(静的番号)又は値(動的番号)を回収して使いまわしてもよい。
同じ場所で割り付けられ且つ生きている実行時オブジェクトには全て値(動的番号)が埋め込まれている。そこで、再利用部(1326)はまた、上記実行時オブジェクトに埋め込まれていた値(静的番号)を回収してもよい。ヒープ領域のスキャンがガーベジコレクションとともに行われれば、追跡されるプログラムのオーバーヘッドは少なくて済む。
図14は、本発明の実施態様における、図13に示すコンピュータ・ハードウェアのブロック図を示す。
コンピュータ・システム(1401)は、CPU(1402)とメイン・メモリ(1403)と含み、これらはバス(1404)に接続されている。CPU(1402)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のXeon(商標)シリーズ、Core(商標)シリーズ、Atom(商標)シリーズ、Pentium(商標)シリーズ、Celeron(商標)シリーズ、AMD社のPhenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(商標)シリーズ及びSempron(商標)などを使用することができる。バス(1404)には、ディスプレイ・コントローラ(1405)を介して、LCDモニタなどのディスプレイ(1406)が接続される。ディスプレイ(1406)は、コンピュータ・システムの管理のために、通信回線を介してネットワークに接続されたコンピュータ・システムについての情報と、そのコンピュータ・システム上で動作中のソフトウェアについての情報を、適当なグラフィック・インターフェースで表示するために使用される。バス(1404)にはまた、IDE又はSATAコントローラ(1407)を介して、ハードディスク又はシリコン・ディスク(1408)と、CD−ROM、DVDドライブ又はBDドライブ(1409)が接続される。
ハードディスク(1408)には、オペレーティング・システム、J2EEなどのJava(商標)処理環境を提供するプログラム、その他のプログラム及びデータが、メイン・メモリにロード可能に記憶されている。
CD−ROM、DVD又はBDドライブ(1409)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラムをハードディスクに追加導入するために使用される。バス(1404)には更に、キーボード・マウスコントローラ(1410)を介して、キーボード(1411)及びマウス(1412)が接続されている。
通信インタフェース(1414)は、例えばイーサネット(商標)・プロトコルに従う。通信インタフェース(1414)は、通信コントローラ(1413)を介してバス(1404)に接続され、コンピュータ・システム及び通信回線(1415)を物理的に接続する役割を担い、コンピュータ・システムのオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インターフェース層を提供する。なお、通信回線は、有線LAN環境、或いは例えばIEEE802.11a/b/g/nなどの無線LAN接続規格に基づく無線LAN環境であってもよい。

Claims (19)

  1. ログラム中のオブジェクトの割り付け場所を、実行時オブジェクトから追跡することを可能にするための該実行時オブジェクトのデータ構造であって、
    前記実行時オブジェクトは前記プログラム中に記述されるオブジェクトの割り付け場所から上記プログラムの実行時に生成されるオブジェクトであり、前記割り付け場所は前記プログラムの行番号又はプログラム・コードにおける相対的な位置であり、
    前記実行時オブジェクトが有するハッシュ値フィールドが、前記実行時オブジェクトの同一性を識別するための識別子であるハッシュ値として前記割り付け場所に対応した値とオブジェクト識別子とを含み、前記割り付け場所に対応した値は前記プログラム上のオブジェクト割り付け場所を一意に識別する値であり、前記オブジェクト識別子はランダムな値であり、前記追跡が該値に対応する前記オブジェクトの割り付け場所を特定することによって行われ
    前記プログラムは、オブジェクト指向言語で記述されたプログラム又は当該オブジェクト指向言語で記述されたプログラムがコンパイルされた中間コードであり、且つ、前記実行時オブジェクトをメモリに割り付ける命令を有する、前記データ構造。
  2. ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡するための方法であって、
    請求項1に記載のデータ構造から前記割り付け場所に対応した値を取得するステップと、
    前記取得した値に対応する前記オブジェクトの割り付け場所を特定するステップと
    を含む、前記方法。
  3. 前記特定が、
    ハッシュ値が参照されたことのある実行時オブジェクトのハッシュ値フィールドに含まれる前記値(以下、第1の値)と該第1の値に対応する割り付け場所を特定するための情報との対応付けを記録する対応表(以下、第1の対応表)から、前記第1の値に対応する割り付け場所を特定することによって行われる、請求項2に記載の方法。
  4. 前記第1の値が、該第1の値を含む前記実行時オブジェクトのハッシュ値が参照されることに応じて求められる値である、請求項3に記載の方法。
  5. 前記第1の値が、二分木構造によって求められる値である、請求項4に記載の方法。
  6. 前記二分木構造が前記第1の値と該第1の値に対応する割り付け場所との対応関係を示し、並びに前記二分木構造の枝が前記第1の値のビット表示の各ビットを示し、及び前記二分木構造のノードが前記オブジェクトの割り付け場所を示す、請求項5に記載の方法。
  7. 前記特定が、
    ハッシュ値が参照されたことのない実行時オブジェクトのハッシュ値フィールドに含まれる前記値(以下、第2の値)と該第2の値に対応する割り付け場所との対応付けを記録する対応表(以下、第2の対応表)から、前記第2の値に対応する割り付け場所を特定することによって行われる、請求項2に記載の方法。
  8. ログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡することを可能にする方法であって、前記実行時オブジェクトは前記プログラム中に記述されるオブジェクトの割り付け場所から上記プログラムの実行時に生成されるオブジェクトであり、前記割り付け場所は前記プログラムの行番号又はプログラム・コードにおける相対的な位置であり、前記プログラムは、オブジェクト指向言語で記述されたプログラム又は当該オブジェクト指向言語で記述されたプログラムがコンパイルされた中間コードであり、且つ、前記実行時オブジェクトをメモリに割り付ける命令を有し、
    前記方法が、
    前記実行時オブジェクトのメモリへの割り付けに応じて、
    請求項1に記載のデータ構造の前記ハッシュ値フィールド内に、前記プログラム中のオブジェクトの前記割り付け場所に対応した値を埋め込むステップを含み、前記ハッシュ値フィールドがハッシュ値として前記埋め込まれた値とオブジェクト識別子とを含み、前記追跡が該埋め込まれた値に対応する前記オブジェクトの割り付け場所を特定することによって行われる、
    前記方法。
  9. 前記実行時オブジェクトのハッシュ値の参照命令が実行されることに応じて、
    前記埋め込まれた値を、計算された値に置き換えるステップと、
    前記計算された値と前記埋め込まれた値との対応表をメモリ内に作成するステップと
    をさらに含む、請求項8に記載の方法。
  10. 前記プログラム中のオブジェクトの割り付け場所が同一である実行時オブジェクトが多くメモリに割り付けられる場合、前記ハッシュ値フィールド中の値に割り当てられるビット長を短くし、一方前記オブジェクト識別子に割り当てられるビット長を長くするステップをさらに含む、請求項8に記載の方法。
  11. 前記短くし且つ長くするステップが、ランダムに与えられる前記オブジェクト識別子の一部又は全部が予め決めておいたビットパターンに一致する場合に実行される、請求項10に記載の方法。
  12. 前記ハッシュ値フィールドは、前記参照命令が実行されたかどうかを示すフラグを含み、
    前記参照命令の発行に応じて、該フラグを立てるステップをさらに含む、請求項9に記載の方法。
  13. 前記フラグの立っているハッシュ値フィールドを含む実行時オブジェクトのハッシュ値の参照命令が実行された場合、前記計算された値に置き換えるステップが実行されない、請求項12に記載の方法。
  14. 前記メモリが、該メモリのヒープ領域であり、
    該ヒープ領域をスキャンし、使われていない実行時オブジェクトのハッシュ値フィールドの前記値を見つけて、新たな実行時オブジェクトに前記見つけた値を使用するステップをさらに含む、請求項8に記載の方法。
  15. 前記スキャンが、ガーベジコレクションにおいて実行される、請求項14に記載の方法。
  16. 前記値に割り当てられるビット長が、可変長である、請求項8に記載の方法。
  17. 前記ハッシュ値フィールドが、前記オブジェクトのオブジェクト・ヘッダ内にある、請求項8に記載の方法。
  18. ログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡するためのコンピュータ・システムであって、前記実行時オブジェクトは前記プログラム中に記述されるオブジェクトの割り付け場所から上記プログラムの実行時に生成されるオブジェクトであり、前記割り付け場所は前記プログラムの行番号又はプログラム・コードにおける相対的な位置であり、前記プログラムは、オブジェクト指向言語で記述されたプログラム又は当該オブジェクト指向言語で記述されたプログラムがコンパイルされた中間コードであり、且つ、前記実行時オブジェクトをメモリに割り付ける命令を有し、
    前記システムが、
    前記実行時オブジェクトを格納するメモリと、
    請求項1に記載のデータ構造から前記値を取得する取得部と、
    前記取得した値に対応する前記オブジェクトの割り付け場所を特定する特定部と
    を含む、前記コンピュータ・システム。
  19. コンピュータ・システムに、請求項2〜17のいずれか一項に記載の方法の各ステップを実行させることを含む、コンピュータ・プログラム。
JP2009049727A 2009-03-03 2009-03-03 プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム Expired - Fee Related JP4852621B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2009049727A JP4852621B2 (ja) 2009-03-03 2009-03-03 プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム
US12/715,703 US8555255B2 (en) 2009-03-03 2010-03-02 Method of tracing object allocation site in program, as well as computer system and computer program therefor
US13/969,004 US8782610B2 (en) 2009-03-03 2013-08-16 Method of tracing object allocation site in program, as well as computer system and computer program therefor

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009049727A JP4852621B2 (ja) 2009-03-03 2009-03-03 プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム

Publications (2)

Publication Number Publication Date
JP2010204955A JP2010204955A (ja) 2010-09-16
JP4852621B2 true JP4852621B2 (ja) 2012-01-11

Family

ID=42679374

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009049727A Expired - Fee Related JP4852621B2 (ja) 2009-03-03 2009-03-03 プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム

Country Status (2)

Country Link
US (2) US8555255B2 (ja)
JP (1) JP4852621B2 (ja)

Families Citing this family (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8016816B2 (en) 2003-09-09 2011-09-13 Convatec Technologies Inc. Fecal management appliance and method and apparatus for introducing same
US8527958B2 (en) * 2005-05-16 2013-09-03 Texas Instruments Incorporated Profiling operating context and tracing program on a target processor
JP4959781B2 (ja) * 2009-12-22 2012-06-27 インターナショナル・ビジネス・マシーンズ・コーポレーション オブジェクト生成地点記録方法およびプログラム
US8522216B2 (en) 2010-05-04 2013-08-27 Oracle International Corporation Memory leak detection
US8504878B2 (en) * 2010-05-04 2013-08-06 Oracle International Corporation Statistical analysis of heap dynamics for memory leak investigations
JP2012079130A (ja) * 2010-10-01 2012-04-19 Fujitsu Ltd デバッグ支援プログラム、デバッグ支援装置、及びデバッグ支援方法
US8522213B2 (en) 2011-05-12 2013-08-27 International Business Machines Corporation Debugger and debugging methods using breakpoints conditioned on the static identity of data
JP5883300B2 (ja) 2012-02-02 2016-03-09 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation オブジェクトを特定するためのハッシュコードを生成するための方法、プログラム及びシステム
JP2014063285A (ja) * 2012-09-20 2014-04-10 International Business Maschines Corporation ガベージ・コレクションのためのコード変換方法、プログラム及びシステム
US9411715B2 (en) * 2012-12-12 2016-08-09 Nvidia Corporation System, method, and computer program product for optimizing the management of thread stack memory
US20150242312A1 (en) * 2013-04-19 2015-08-27 Hitachi, Ltd. Method of managing memory, computer, and recording medium
WO2015114826A1 (ja) * 2014-02-03 2015-08-06 株式会社日立製作所 ダンプ解析方法、装置及びプログラム
US9507713B1 (en) * 2014-09-22 2016-11-29 Google Inc. Memory object pretenuring
US9514025B2 (en) * 2015-04-15 2016-12-06 International Business Machines Corporation Modeling memory use of applications
US10346310B2 (en) * 2016-02-26 2019-07-09 Red Hat, Inc. Cache block apparatus and methods
US10860715B2 (en) * 2016-05-26 2020-12-08 Barracuda Networks, Inc. Method and apparatus for proactively identifying and mitigating malware attacks via hosted web assets
US10635570B2 (en) * 2017-09-29 2020-04-28 Oracle International Corporation Memory leak profiling events
US11061703B2 (en) * 2019-01-10 2021-07-13 International Business Machines Corporation Managed runtime data marshaling for native code access using a thread local native buffer

Family Cites Families (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH08314752A (ja) * 1995-05-17 1996-11-29 Ricoh Co Ltd オブジェクト指向システムの開発支援装置
US6047283A (en) * 1998-02-26 2000-04-04 Sap Aktiengesellschaft Fast string searching and indexing using a search tree having a plurality of linked nodes
US6839725B2 (en) * 2000-05-16 2005-01-04 Sun Microsystems, Inc. Dynamic adaptive tenuring of objects
US6799191B2 (en) * 2000-05-16 2004-09-28 Sun Microsystems, Inc. Object sampling technique for runtime observations of representative instances thereof
US7003107B2 (en) * 2000-05-23 2006-02-21 Mainstream Encryption Hybrid stream cipher
JP2002055852A (ja) * 2000-08-07 2002-02-20 Nec Corp オブジェクトの生成・消滅情報管理方式
US20060291650A1 (en) * 2001-05-22 2006-12-28 Viswanath Ananth State-varying hybrid stream cipher
US7577943B2 (en) * 2003-10-24 2009-08-18 Microsoft Corporation Statistical memory leak detection
US7100003B2 (en) * 2003-11-24 2006-08-29 International Business Machines Corporation Method and apparatus for generating data for use in memory leak detection
US7325106B1 (en) * 2004-07-16 2008-01-29 Sun Microsystems, Inc. Method for monitoring heap for memory leaks
US7313661B1 (en) * 2005-03-18 2007-12-25 Sun Microsystems, Inc. Tool for identifying causes of memory leaks
JP4515319B2 (ja) * 2005-04-27 2010-07-28 株式会社日立製作所 コンピュータシステム
JP2006350876A (ja) * 2005-06-20 2006-12-28 Hitachi Ltd ヒープダンプ取得方法
GB0515405D0 (en) * 2005-07-27 2005-08-31 Ibm Memory leak detection
US7606989B1 (en) * 2005-09-01 2009-10-20 Sun Microsystems, Inc. Method and apparatus for dynamically pre-tenuring objects in a generational garbage collection system
US7596667B1 (en) * 2005-09-01 2009-09-29 Sun Microsystems, Inc. Method and apparatus for byte allocation accounting in a system having a multi-threaded application and a generational garbage collector that dynamically pre-tenures objects
US7676511B2 (en) * 2006-01-27 2010-03-09 Sun Microsystems, Inc. Method and apparatus for reducing object pre-tenuring overhead in a generational garbage collector
US7926043B2 (en) * 2006-06-20 2011-04-12 Microsoft Corporation Data structure path profiling
JP4847300B2 (ja) * 2006-11-27 2011-12-28 株式会社日立製作所 メモリリーク検出方法、メモリリーク検出装置及びメモリリーク検出プログラム
US8037477B2 (en) * 2007-01-23 2011-10-11 Hewlett-Packard Development Company, L.P. Efficient detection of sources of increasing memory consumption
JP2008191907A (ja) * 2007-02-05 2008-08-21 Fujitsu Ltd 仮想マシン監視プログラム、および仮想マシンデバッグ装置
US7904493B2 (en) * 2007-03-30 2011-03-08 Sap Ag Method and system for object age detection in garbage collection heaps

Also Published As

Publication number Publication date
US8555255B2 (en) 2013-10-08
US20100229159A1 (en) 2010-09-09
US8782610B2 (en) 2014-07-15
US20130332909A1 (en) 2013-12-12
JP2010204955A (ja) 2010-09-16

Similar Documents

Publication Publication Date Title
JP4852621B2 (ja) プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム
US11086680B2 (en) Object optimal allocation device, method and program
US6898611B1 (en) Declarative pinning
KR100732869B1 (ko) 메모리 재이용 방법
US7912877B2 (en) Leveraging garbage collection to dynamically infer heap invariants
US6842759B2 (en) Single-instance class objects across multiple JVM processes in a real-time system
GB2405506A (en) Benchmarking Garbage Collection in Java Virtual Machines
JP5896952B2 (ja) メモリを管理する方法、装置およびコンピュータ・プログラム
US20100011357A1 (en) System and method for garbage collection in a virtual machine
US7472144B2 (en) Method and system for resolving memory leaks and releasing obsolete resources from user session data
US7454448B1 (en) Synchronizing object promotion in a multi-tasking virtual machine with generational garbage collection
US8255436B2 (en) Per thread garbage collection
US20090150465A1 (en) Object Deallocation System and Method
US8296742B2 (en) Automatic native generation
CN114051610A (zh) 基于arena的存储器管理
US7676801B1 (en) Scanning of evacuated objects in a generation managed by the train algorithm
US7565497B1 (en) Coarse write barrier control mechanism
US20080307174A1 (en) Dual Use Memory Management Library
US6275985B1 (en) Method and apparatus for developing an application that implements garbage collection efficiently by combining proxy objects with compiler support
Odaira et al. Efficient runtime tracking of allocation sites in java
Lang et al. Design and implementation of an escape analysis in the context of safety-critical embedded systems
JP2011085985A (ja) メモリ管理方法、メモリ管理プログラム、及び、情報処理装置
Kim et al. Efficient reuse of local regions in memory-limited mobile devices
Halpern et al. Unleashing the Power of Allocator-Aware Software Infrastructure
Xu et al. Metis: a smart memory allocator using historical reclamation information

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20101125

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110214

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20111005

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20111005

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20111005

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20111024

R150 Certificate of patent or registration of utility model

Ref document number: 4852621

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20141028

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees