JP4852621B2 - プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム - Google Patents
プログラム中のオブジェクトの割り付け場所を追跡する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム Download PDFInfo
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-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
プログラム中のオブジェクトの位置を示す情報が、上記ヒープ領域中の実行時オブジェクトに付加される例はある(上記非特許文献2を参照)。しかし、該例では、ヒープ領域内の余分な領域が消費される。従って、オブジェクトのプログラム中の割り付け場所をメモリ内のヒープ領域の実行時オブジェクトからメモリを多く消費することなく効率的に追跡することは、既存の方法では困難である。従って、プログラム中のオブジェクトの割り付け場所を効率的に追跡する方法が求められている。
上記データ構造から上記割り付け場所に対応した値を取得するステップと、
上記取得した値に対応する上記オブジェクトの割り付け場所を特定するステップと
を含む。
上記実行時オブジェクトのメモリへの割り付けに応じて、
上記データ構造の上記ハッシュ値フィールド内に、上記プログラム中のオブジェクトの上記割り付け場所に対応した値を埋め込むステップを含み、上記ハッシュ値フィールドがハッシュ値として上記埋め込まれた値とオブジェクト識別子とを含み、上記追跡が該埋め込まれた値に対応する上記オブジェクトの割り付け場所を特定することによって行われる。
実行時オブジェクトのハッシュ値の参照命令が実行されることに応じて、
上記埋め込まれた値を、計算された値に置き換えるステップと、
上記計算された値と上記埋め込まれた値との対応表をメモリ内に作成するステップと
を含む。
上記プログラム中のオブジェクトの割り付け場所が同一である実行時オブジェクトが多くメモリに割り付けられる場合、上記ハッシュ値フィールド中の値に割り当てられるビット長を短くし、一方上記オブジェクト識別子に割り当てられるビット長を長くするステップを含む。
上記実行時オブジェクトを格納するメモリと、
上記データ構造から上記値を取得する取得部と、
上記取得した値に対応する上記オブジェクトの割り付け場所を特定する特定部と
を含む。
上記実行時オブジェクトのメモリへの割り付けに応じて、
上記データ構造の上記ハッシュ値フィールド内に、上記プログラム中のオブジェクトの上記割り付け場所に対応した値を埋め込む埋込部を含む。ここで、上記ハッシュ値フィールドがハッシュ値として上記埋め込まれた値とオブジェクト識別子とを含み、上記追跡が該埋め込まれた値に対応する上記オブジェクトの割り付け場所を特定することによって行われる。
上記実行時オブジェクトのハッシュ値の参照命令が実行されることに応じて、
上記埋め込まれた値を、計算された値に置き換える置換部と、
上記計算された値と上記埋め込まれた値との対応表をメモリ内に作成する作成部と
を含む。
また、本発明の実施態様によれば、ヒープ領域外のメモリ消費量が、オブジェクト数に比例して増加しない。すなわち、オブジェクトの数の増加に対して、メモリ消費量の増加の程度は、緩やかである。従って、メモリ消費量の増大を抑えたオブジェクト割り付け場所の探索が可能である。
本発明の実施態様において、「実行時オブジェクト」は、プログラム中に記述されるオブジェクトの割り付け場所から生成されるオブジェクトである。「実行時オブジェクト」は、上記プログラムの実行時に、メモリ内、例えばヒープ領域内に割り付けられたオブジェクトである。実行時オブジェクトは、例えばクラスから生成される。実行時オブジェクトは、上記プログラムの実行が、例えば中断又は完了した場合であっても、ヒープ領域に存在しうる。実行時オブジェクトは、ハッシュ値フィールドを有する。また、実行時オブジェクトは、オブジェクトに関する情報を保持するためのオブジェクト・ヘッダを有しうる。該オブジェクト・ヘッダは、例えば、クラスポインタ、フラグ及びモニタを含みうる。また、上記ハッシュ値フィールドは、オブジェクト・ヘッダに含まれていてもよい。
なお、本発明の実施態様における「ヒープ領域」は、プログラムに使用されるヒープ領域全体ではなく、上記ヒープ領域全体の一部であって、実行時オブジェクトが割り付けられるヒープ領域のことをいう。上記ヒープ領域は、例えば、ガーベジコレクションの対象となるヒープ領域である。
ハッシュ値フィールドは、割り付け値フィールド及び識別子フィールドを含む。ハッシュ値フィールドは、参照フラグを含んでもよい。ハッシュ値フィールドについては、後述の図2Bの説明で詳しく述べる。
上記値(静的番号)は、例えば、プログラムの行番号及びプログラム・コードにおける相対的な位置を表す値である。上記値(静的番号)は、上記行番号又は上記相対的な位置を表す値に対応付けられた識別子であってもよい。コンピュータ・システムは、例えば、該識別子と行番号との対応が保存される対応表を参照することで、識別子から行番号を求めることができる。
上記値(動的番号)は、上記値(静的番号)に対応付けられた値である。コンピュータ・システムは、上記値(動的番号)と上記値(静的番号)との対応付けが保存される対応表を参照することで、上記値(動的番号)から上記値(動的番号)を求めることができる。
上記割り付け場所に対応した値とオブジェクト識別子とを組み合わせた値が、上記ハッシュ値になる。上記組み合わせには、上記参照フラグが含まれてもよい。
図1は、Java(商標)言語で作成されたプログラムによって割り付けられた実行時オブジェクトの例である。
実行時オブジェクト(101)は、メモリ内のヒープ領域内に実装される。実行時オブジェクトは(101)、オブジェクト・ヘッダと、インスタンス変数を保持するオブジェクト・フィールドとを備える。
オブジェクト・ヘッダは、例えば、3ワード構成である。なお、1ワードは32ビットである。1ワード目には、クラスポインタが保持される。2ワード目には、ハッシュ値及びフラグが保持される。3ワード目には、モニタが保持される。
クラスポインタは、オブジェクトが属しているクラスを指すポインタである。ハッシュ値は、上記クラスに属するオブジェクトの同一性を識別するために付けられる値である。フラグは、例えばオブジェクトの各種状態を示す。該状態は、例えばロック状態である。モニタは、ガーベジコレクションのために使用される。
オブジェクト・ヘッダは、2ワード又は1ワードで構成される場合もある。
オブジェクトのフィールドは、オブジェクトの本体であるインスタンス変数が格納されるフィールドである。
実行時オブジェクト(102)は、実行時オブジェクト(101)が従来技術によって拡張された例を示す。従来技術では、実行時オブジェクト(101)に割り付け場所を特定するための情報を付加する場合、上記オブジェクト・ヘッダを拡張する。そして、該拡張された領域に1ワード分の割り付け場所番号が埋め込まれる。従って、実行時オブジェクト(101)は、実行時オブジェクト(102)のようなデータ構造になる。実行時オブジェクト(102)は、ヘッダが拡張されているため、実行時オブジェクト(101)に比べ、ヒープ領域がより多く消費される。
実行時オブジェクト(201)では、ハッシュ値が格納されるハッシュ値フィールドの一部に、割り付け場所に対応した値が埋め込まれる。実行時オブジェクト(図1、102)のような拡張はされない。従って、ヒープ領域の消費量は、割り付け場所に対応した値が埋め込まれる前後で変化しない。また、上記ハッシュ値フィールドの残りの部分は、オブジェクト識別子と名付けられる。
ハッシュ値フィールド(202)は、割り付け値フィールド及び識別子フィールドで構成される。ハッシュ値フィールド(202)は、ハッシュ値フィールド(203)のように、さらに参照フラグで構成されていてもよい。
割り付け値フィールドには、割り付け場所に対応した値が保持される。該値は、値(静的番号)又は値(動的番号)である。
識別子フィールドにはオブジェクト識別子が保持される。オブジェクト識別子はランダムな値である。
参照フラグは、ハッシュ値フィールドがプログラムによって参照されたか否かを表すフラグである。参照フラグは、例えば1ビットの値であり、ハッシュ値フィールドが参照される前は0、参照された後は1が設定される。
また、ハッシュ値フィールド(203)のように、ハッシュ値フィールドが、参照フラグを構成に含むならば、ハッシュ値フィールドは少なくとも3ビット長で表される。参照フラグは、参照の有無を表せるだけのビット長があればよく、例えば、1を参照されたとし、0を参照されていないとするならば、1ビットが割り当てられる。ハッシュ値フィールド(203)が、例えば16ビットで表されるとする。割り付け値フィールドに10ビット、識別子フィールドに5ビット、参照フラグに1ビット割り当てられるとするならば、割り付け値フィールド(203)には、2^10=1024通りの割り付け場所に対応した値が格納できる。識別子フィールドには、2^5=32通りのオブジェクト識別子が格納できる。また、ハッシュ値フィールド(203)に格納されたハッシュ値が(1011101110111011)2ならば、割り付け場所に対応した値は(1011101110)2、オブジェクト識別子は(11101)2、参照フラグは1である。
なお、上記ビット長が不足する場合の対応は、下記図3の説明において述べる。
本発明の実施態様では、同じ場所で割り付けられた実行時オブジェクトの割り付け場所に対応する値(静的番号)は同じである。従って、値(静的番号)のみを用いた場合、ハッシュ値を表すビットに含まれる上記値(静的番号)を表すビットが、同じ場所で割り付けられた実行時オブジェクト同士で同じ値となる。
ここで、上記ハッシュ値フィールド中のビットの振り分け方が固定の場合、割り付け場所に対応する値に割り当てられたビット長の分だけ、オブジェクト識別子に割り当てうるビット長は短くなる。つまり、オブジェクト識別子によって識別されるオブジェクトの数は、上記割り当てうるビット長が短いほど少なくなる。従って、プログラム・コード上の同じ場所で大量の実行時オブジェクトが割り付けられると、ハッシュ値の衝突が生じやすくなる。
通常のプログラムでは、シナリオ(302)で示すコードのように、オブジェクトをほとんど割り付けない場所は多数あると考えられる。シナリオ(301)で示すようなコードがプログラム中にある場合、割り付け値フィールドのビット長を長くし、識別子フィールドのビット長を短くすることが有効である。割り付けられるオブジェクトはほとんど無いため、識別子フィールドのビット長は短くても構わない。
そこで、以下では、値(静的番号)と値(動的番号)とを併用する方法を述べる。
実行時オブジェクト(401)は、値(静的番号)をプログラム中のオブジェクトの割り付け場所に対応した値として用いた場合の実行時オブジェクトを示す。実行時オブジェクト(402)は、値(動的番号)をプログラム中のオブジェクトの割り付け場所に対応した値として用いた場合の実行時オブジェクトを示す。
値(静的番号)と値(動的番号)とを併用する場合、コンピュータ・システムは、実行時オブジェクトがヒープ領域に割り付けられることに応じて、値(静的番号)を実行時オブジェクト(401)のハッシュ値フィールドに埋め込む。また、コンピュータ・システムは、実行時オブジェクトのハッシュ値を参照する命令が初めて実行されるタイミングで、値(静的番号)を値(動的番号)に置き換える。
実行時オブジェクトがヒープ領域に割り付けられることに応じて、コンピュータ・システムは、値(静的番号)を上記実行時オブジェクトのハッシュ値フィールドに埋め込む。コンピュータ・システムは、値(静的番号)が固定長ならば高速にハッシュ値フィールドに、値(静的番号)埋め込むことができる。ここで、コンピュータ・システムは、上記値(静的番号)に対応する識別子をハッシュ値フィールドに埋め込んでもよい。併せてコンピュータ・システムは、ハッシュ値が一度も参照されていないことを示す参照フラグをハッシュ値フィールドに埋め込む。参照フラグには、例えば、上記オブジェクトが参照されていない場合を0とするならば、コンピュータ・システムは、「0」を設定する。なお、コンピュータ・システムは、オブジェクト識別子を設定する必要はない。
実行時オブジェクトのハッシュ値を参照する命令が初めて実行されることに応じて、コンピュータ・システムは、ハッシュ値フィールドを置き換える。該書き換えでは、値(動的番号)がハッシュ値フィールドに埋め込まれる。また、コンピュータ・システムは、乱数を生成し、そして該生成した乱数をオブジェクト識別子として、ハッシュ値フィールドに埋め込む。さらにコンピュータ・システムは、上記参照フラグにオブジェクトが参照されたことを示す値を設定する。該値は、例えば「1」である。コンピュータ・システムは、上記置き換えられたハッシュ値フィールドの値を、ハッシュ値として参照元に返す。なお、一度置き換えられたハッシュ値フィールドは、該ハッシュ値フィールドを有するオブジェクトの生存期間中にさらに置き換えられることはない。
上記検出は、ソースコード又は中間コードに含まれる割り付ける命令及び参照する命令がスキャンされることで行われうる。
ステップ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は、該処理の終了である。
プログラム・コード(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である。
プログラム・コード(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)は変更されない。すなわち、一度動的番号が割り振られた実行時オブジェクトは、該実行時オブジェクトが生きている間、ハッシュ値フィールドの値が置き換えられることはない。
最初の値(動的番号)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は、(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)で示される段階ごとに説明する。
コンピュータ・システムは、上記オブジェクトのハッシュ値を表すビットを左から順に取得する。コンピュータ・システムは、上記取得したビットに対応する二分木の枝を、ルートノードから取得した順に下降する。上記下降する過程で、割り付け場所が設定されているノードが見つかったならば、コンピュータ・システムは、上記割り付け場所を上記求める割り付け場所とする。
上記オブジェクトのハッシュ値が、例えば(1011)2ならば、コンピュータ・システムは、ルートノードから1に対応する枝、0に対応する枝、1に対応する枝、そして1に対応する枝の順に、二分木を下降する。ここで、例えば、左から1桁目の1に対応する枝を下った先にあるノードには、何も設定されていないとする。また、左から2桁目の0に対応する枝を下った先にあるノードには、割り付け場所が設定されているとする。上記例の場合、コンピュータ・システムは、左から2桁目の0に対応する枝を下った先にあるノードに設定されている割り付け場所を、求める割り付け場所とする。
値(動的番号)はクラスごとにランダムな値にされるので、値(動的番号)とクラス固有の定数CLASS_HASHとの排他的論理和を取った値を値(動的番号)とする。上記割り付け場所を求める場合、上記オブジェクトのハッシュ値の入っているワードとCLASS_HASHとの排他的論理和が求められる。値(動的番号)は、排他的論理和が取られる前の値(動的番号)に戻される必要がある。なお、CLASS_HASHは、例えば、クラスオブジェクトのアドレスの一部であって、クラス固有のランダム値であるとする。該戻された値(動的番号)のビットを使用して、上記二分木からオブジェクトの割り付け場所が求められうる。
上記フローチャートが実装される関数は、新たな値(動的番号)の割り振りが成功した場合はtrueを返し、失敗した場合はfalseを返す。
ステップ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に戻る。
プログラム・コード(801)は、1ワード=32ビットで、上位14ビットがハッシュ値フィールドに用いられる実装例を示す。
プログラム・コード(801)では、ハッシュ値フィールドのビット長は14に定義される。オブジェクト識別子が保存されるビットのビット長は、4〜14ビットとなるように定義される。割り付け場所に対応した値が保存されるビットの最大ビット長は、ハッシュ値フィールドのビット長(14ビット)から、オブジェクト識別子が保存されるビットのビット長のうち最小のビット(4ビット)を引いた長さのビット(10ビット)に定義される。参照フラグが保存されるビットは、18ビット目に設定される。なお、プログラム・コード(801)は、参照フラグをハッシュ値フィールドに含めない例を示す。
プログラム・コード(802)は、図2Aで示すオブジェクトを構造体で表した例を示す。
プログラム・コード(803)は、割り付け場所ごとの情報を保存するための構造体の例を示す。該構造体には、値(動的番号)及びオブジェクト識別子のビット長などの割り付け場所ごとに必要な情報が保存される。
プログラム・コード(804)は、図6Bで示す二分木のノードを構造体で表した例を示す。該構造体には、値(静的番号)、値(動的番号)及び他のノードとの関係などのノードごとに必要な情報が保存される。
プログラム・コード(805)は、図6Bで示す二分木を管理するための構造体の例を示す。該構造体は、クラスごとに用意され、二分木の排他制御及びルートノードについての情報が保存される。
上記関数では、呼び出し元にハッシュ値が返されるとともに、ハッシュ値が初めて参照されたならば、ハッシュ値フィールドの値(静的番号)が値(動的番号)へと書き換えられる。ここで、該書き換えは、原子的に実行される必要がある。
ステップ901では、コンピュータ・システムは、オブジェクト割り付け場所に対応する値(静的番号)を実行時オブジェクトのハッシュ値フィールドに埋め込む方法を開始する。該開始は、上記プログラムにおけるオブジェクト割り付けに対応して、実行環境、例えばJVMで実行時オブジェクトの生成を開始することに応じて行われる。
ステップ904では、コンピュータ・システムは、上記プログラム中のオブジェクト割り付け場所を例えばコンパイラを通じて取得する。
ステップ905では、コンピュータ・システムは、割り付け場所に対応する値(静的番号)がまだ生成されていない場合、割り付け場所に対応する値(静的番号)を生成する。該値(静的番号)は、ハッシュ値フィールドのビット長より短い固定のビット長を有する。
ステップ906では、コンピュータ・システムは、値(静的番号)と該値(静的番号)に対応する割り付け場所との対応付けを記録する対応表をメモリ内に格納する。なお、割り付け場所としてプログラムの行番号それ自体が用いられる場合、該対応表は不要である。
ステップ907では、コンピュータ・システムは、オブジェクト識別子を生成する。該オブジェクト識別子は、任意の方法で生成されうる。例えば、実行時オブジェクトを割り付けようとするアドレスを利用してもよい。
ステップ908では、コンピュータ・システムは、該値(静的番号)及びオブジェクト識別子を実行時オブジェクトのハッシュ値フィールドに埋め込む。
ステップ909では、コンピュータ・システムは、埋め込みを終了する。その後、所望のデータ構造を備えた実行時オブジェクトが、実行環境、例えばJVMで生成され、メモリ内に割り当てられる。
ステップ910では、コンピュータ・システムは、プログラム中のオブジェクトの割り付け場所の追跡を開始する。該追跡は、上記プログラムを実行して、上記プログラムの実行途中又は実行終了後に、追跡開始の指示がコンピュータ・システムに与えられることによって開始される。
ステップ911では、コンピュータ・システムは、ヒープ領域に残存している実行時オブジェクトのハッシュ値フィールドから、埋め込まれた値(静的番号)を取得する。
ステップ912では、コンピュータ・システムは、対応表を参照して、上記取得した値(静的番号)に対応するオブジェクトの割り付け場所を特定する。
ステップ912及びステップ911は、残存している全ての実行時オブジェクトに対して行われる。ステップ912及びステップ911は、ユーザによって指定された実行時オブジェクトに対して行われてもよい。コンピュータ・システムは、各オブジェクトと上記特定された割り付け場所との対応を、画面上に表示し、又はファイルとして出力する。
ステップ913では、コンピュータ・システムは、上記追跡を終了する。
なお、ステップ905で、値(静的番号)が行番号それ自体である場合は、ステップ906の対応表は不要である。また、ステップ907において、オブジェクト識別子を生成せず、実行環境で生成されるハッシュ値を表すビットのうち、値(静的番号)で置き換えられなかったビットで表される値をオブジェクト識別子として使ってもよい。
ステップ921では、コンピュータ・システムは、オブジェクト割り付け場所に対応する値(動的番号)を実行時オブジェクトのハッシュ値フィールドに埋め込む方法を開始する。該開始は、上記プログラムにおけるオブジェクト割り付けに対応して、実行環境、例えばJVMで実行時オブジェクトの生成を開始することに応じて行われる。
ステップ924では、コンピュータ・システムは、上記プログラム中のオブジェクト割り付け場所を例えばコンパイラを通じて取得する。
ステップ925では、コンピュータ・システムは、割り付け場所に対応する値(動的番号)が対応表に記録されていない場合又は同一の割り付け場所について値(動的番号)のビット長を変更する場合、割り付け場所に対応する値(動的番号)を生成する。該値(動的番号)は、ハッシュ値フィールドのビット長より短いビット長を有する。値(動的番号)では、最初は該値のビット長は比較的長く設定される。そして、同じオブジェクトで同じ割り付け場所に割り付けられ数が増えることに応じて、該値(動的番号)のビット長は次第に短く設定される。
ステップ926では、コンピュータ・システムは、値(動的番号)と該値(動的番号)に対応する割り付け場所との対応付けを記録する対応表をメモリ内に格納する。なお、値(動的番号)のビット長が次第に短く設定される場合、それに応じて同じ割り付け場所に複数の値(動的番号)が対応する対応表が作成される。
ステップ927では、コンピュータ・システムは、オブジェクト識別子を生成する。該オブジェクト識別子は、任意の方法で生成されうる。例えば、実行時オブジェクトを割り付けようとするアドレスを利用してもよい。
ステップ928では、コンピュータ・システムは、値(動的番号)及びオブジェクト識別子を実行時オブジェクトのハッシュ値フィールドに埋め込む。
ステップ929では、コンピュータ・システムは、埋め込みを終了する。その後、所望のデータ構造を備えた実行時オブジェクトが、実行環境、例えばJVMで生成され、メモリ内に割り当てられる。
ステップ930では、コンピュータ・システムは、プログラム中のオブジェクト割り付け場所の追跡を開始する。該追跡は、上記プログラムを実行して、上記プログラムの実行途中又は実行終了後に、追跡開始の指示がコンピュータ・システムに与えられることによって開始される。
ステップ931では、コンピュータ・システムは、ヒープ領域に残存している実行時オブジェクトのハッシュ値フィールドから、埋め込まれた値(動的番号)を取得する。
ステップ932では、コンピュータ・システムは、対応表を参照して、上記取得した値(動的番号)に対応するオブジェクトの割り付け場所を特定する。
ステップ932及びステップ931は、残存している全ての実行時オブジェクトに対して行われる。ステップ932及びステップ931は、ユーザによって指定された実行時オブジェクトに対して行われてもよい。コンピュータ・システムは、各オブジェクトと上記特定された割り付け場所との対応を、画面上に表示し、又はファイルとして出力する。
ステップ933では、コンピュータ・システムは、上記追跡を終了する。
ステップ941では、コンピュータ・システムは、オブジェクト割り付け場所に対応する値(静的番号)を実行時オブジェクトのハッシュ値フィールドに埋め込む方法を開始する。該開始は、上記プログラムにおけるオブジェクト割り付けに対応して、実行環境、例えばJVMで実行時オブジェクトの生成を開始することに応じて行われる。
ステップ942では、コンピュータ・システムは、図9Aのステップ904〜906の処理を実行する。次に、コンピュータ・システムは、値(静的番号)及び参照フラグをハッシュ値フィールドに埋めこむ。その後、実行時オブジェクトが実行環境、例えばJava(商標)言語で生成され、メモリ内に割り当てられる。
ステップ943では、上記生成されたオブジェクトへの参照が初めて行われると、コンピュータ・システムは、該オブジェクトのハッシュ値フィールドを置き換える動作を開始する。
ステップ944では、コンピュータ・システムは、置き換え対象オブジェクトのハッシュ値フィールドに保持されている値(静的番号)を取得する。
ステップ945では、コンピュータ・システムは、割り付け場所に対応する値(動的番号)を生成する。該値(動的番号)は、ハッシュ値フィールドのビット長より短いビット長を有する。値(動的番号)では、最初は該値のビット長は比較的長く設定される。そして、同じオブジェクトで同じ割り付け場所に割り付けられ数が増えることに応じて、該値(動的番号)のビット長は次第に短く設定される。
ステップ946では、コンピュータ・システムは、該値(動的番号)と該値(動的番号)に対応する割り付け場所との対応付けを記録する対応表をメモリ内に格納する。なお、値(動的番号)のビット長が次第に短く設定される場合、それに応じて同じ割り付け場所に複数の値(動的番号)が対応する対応表が作成される。
ステップ947では、コンピュータ・システムは、オブジェクト識別子を生成する。該オブジェクト識別子は、任意の方法で生成されうる。例えば、実行時オブジェクトを割り付けようとするアドレスを利用してもよい。
ステップ948では、コンピュータ・システムは、値(動的番号)及びオブジェクト識別子を実行時オブジェクトのハッシュ値フィールドに埋め込む。またコンピュータ・システムは、実行時オブジェクトのハッシュ値フィールドの参照フラグを立てる。
ステップ949では、コンピュータ・システムは、埋め込みを終了する。その後、所望のデータ構造を備えた実行時オブジェクトが、実行環境、例えばJVMで生成され、メモリ内に割り当てられる。
ステップ950では、コンピュータ・システムは、プログラム中のオブジェクト割り付け場所の追跡を開始する。該追跡は、上記プログラムを実行して、上記プログラムの実行途中又は実行終了後に、追跡開始の指示がコンピュータ・システムに与えられることによって開始される。
ステップ951では、コンピュータ・システムは、ヒープ領域に残存している実行時オブジェクトのハッシュ値フィールドから、埋め込まれた値(動的番号)を取得する。
ステップ952では、コンピュータ・システムは、対応表を参照して、上記取得した値(動的番号)に対応するオブジェクトの割り付け場所を特定する。
ステップ952及びステップ951は、残存している全ての実行時オブジェクトに対して行われる。ステップ952及びステップ951は、ユーザによって指定された実行時オブジェクトに対して行われてもよい。コンピュータ・システムは、各オブジェクトと上記特定された割り付け場所との対応を、画面上に表示し、又はファイルとして出力する。
ステップ953では、コンピュータ・システムは、上記追跡を終了する。
コンピュータ・システムは、定期的にヒープ領域をスキャンする。該スキャンは、例えば、ガーベジコレクションが実行されることに応じて実行されてもよい。ガーベジコレクションが実行されることに応じて該スキャンが実行されることにより、コンピュータ・システムは、システムにかかる負荷を低く抑えることができる。また、上記スキャンは、プログラム・コード上の実行頻度の低い割り付け場所で割り付けられるオブジェクトに対してのみ行われてもよい。
上記スキャンでは、コンピュータ・システムは、割り付けられた全てのオブジェクトが生きていない割り付け場所に対応する値(静的番号)及び値(動的番号)を取得する。また、コンピュータ・システムは、割り付けられた全てのオブジェクトに値(動的番号)が埋め込まれている割り付け場所に対応する値(静的番号)を取得してもよい。
コンピュータ・システムは、上記取得した値(静的番号)及び値(動的番号)を、例えば対応表に記録する。
コンピュータ・システムは、新たな割り付け場所で実行時オブジェクトが割り付けられた場合、上記記録された値(静的番号)を新たな割り付け場所に対応する値(静的番号)として使用しうる。
また、コンピュータ・システムは、上記新たな割り付け場所で実行時オブジェクトのハッシュ値が参照された場合、上記記録された値(動的番号)を上記新たな割り付け場所に対応する値(動的番号)として使用しうる。
また、コンピュータ・システムは、上記取得された値(動的番号)に対応する割り付け場所で新たに割り付けられたオブジェクトのハッシュ値が参照された場合、新たな値(動的番号)又は「その他」を表す特別な値を上記取得された値に対応する割り付け場所に割り振る。コンピュータ・システムは、上記割り振られた値を、例えば対応表に記録する。
あるプログラムを実行するとヒープ領域の使用量が無制限に増えていくバグが発見されたとする。該出力例は、該あるプログラムを実行中のある時点において、ヒープ領域にある実行時オブジェクトのメモリ内アドレスと、該プログラム中の割り付け場所の一覧を表示させたものである。該出力から、例えば、最も多くのオブジェクトを割り付けている場所を知ることができる。本出力例では、メソッドmeth2の行番号128に割り付けられたオブジェクトの数が非常に多いことが分かる。これによって、例えばヒープ領域の使用量が無制限に増加していくバグの原因が、メソッドmeth2の行番号128にある可能性が高いことが推定される。このように、オブジェクトの割り付け場所を追跡可能にすることで上記バグの原因が見つけることができ、結果としてプログラムの信頼性が上がる。
図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ビットで表せる数であり、本実験で値(静的番号)があふれることは無かった。
衝突数とは、あるハッシュ値を持つオブジェクトの数であり、全てのオブジェクトが異なるハッシュ値を持つならば衝突数は1である。現実のプログラムでは異なるクラスのオブジェクトのハッシュ値が比較されることは少ないことから、本実験では同じクラスのオブジェクトの間のみで衝突を調べた。また、オブジェクトの生存期間は考慮していないので、同時に生きていないオブジェクトの間で起きた衝突もカウントしている。図12に示す実験結果より、本発明の実施態様による衝突は十分に少なく実用的である。
本実験では、新たな動的番号を割り振れないケースがTrade 6で15回起きた。上記ケースのいずれにおいても、何らかの値(動的番号)が既に割り振られている割り付け場所に新たな動的番号を割り振ろうとして失敗したケースであった。図8A〜図8Fのプログラムに示したように、このように失敗したケースでは既に割り振られた値(動的番号)を使い続けるので、割り付け場所情報の曖昧さは生じない。
コンピュータ・システム(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)又はそれらの組み合わせが使用されてもよい。
置換部(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)の値に割り当てられるビット長を短くし、一方オブジェクト識別子に割り当てられるビット長を長くする。
埋込部(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)の値に割り当てられるビット長を短くし、一方オブジェクト識別子に割り当てられるビット長を長くする。
埋込部(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)はまた、上記実行時オブジェクトに埋め込まれていた値(静的番号)を回収してもよい。ヒープ領域のスキャンがガーベジコレクションとともに行われれば、追跡されるプログラムのオーバーヘッドは少なくて済む。
コンピュータ・システム(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)が接続される。
Claims (19)
- プログラム中のオブジェクトの割り付け場所を、実行時オブジェクトから追跡することを可能にするための該実行時オブジェクトのデータ構造であって、
前記実行時オブジェクトは前記プログラム中に記述されるオブジェクトの割り付け場所から上記プログラムの実行時に生成されるオブジェクトであり、前記割り付け場所は前記プログラムの行番号又はプログラム・コードにおける相対的な位置であり、
前記実行時オブジェクトが有するハッシュ値フィールドが、前記実行時オブジェクトの同一性を識別するための識別子であるハッシュ値として前記割り付け場所に対応した値とオブジェクト識別子とを含み、前記割り付け場所に対応した値は前記プログラム上のオブジェクト割り付け場所を一意に識別する値であり、前記オブジェクト識別子はランダムな値であり、前記追跡が該値に対応する前記オブジェクトの割り付け場所を特定することによって行われ、
前記プログラムは、オブジェクト指向言語で記述されたプログラム又は当該オブジェクト指向言語で記述されたプログラムがコンパイルされた中間コードであり、且つ、前記実行時オブジェクトをメモリに割り付ける命令を有する、前記データ構造。 - ハッシュ値フィールドを有する実行時オブジェクトを実装するためのプログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡するための方法であって、
請求項1に記載のデータ構造から前記割り付け場所に対応した値を取得するステップと、
前記取得した値に対応する前記オブジェクトの割り付け場所を特定するステップと
を含む、前記方法。 - 前記特定が、
ハッシュ値が参照されたことのある実行時オブジェクトのハッシュ値フィールドに含まれる前記値(以下、第1の値)と該第1の値に対応する割り付け場所を特定するための情報との対応付けを記録する対応表(以下、第1の対応表)から、前記第1の値に対応する割り付け場所を特定することによって行われる、請求項2に記載の方法。 - 前記第1の値が、該第1の値を含む前記実行時オブジェクトのハッシュ値が参照されることに応じて求められる値である、請求項3に記載の方法。
- 前記第1の値が、二分木構造によって求められる値である、請求項4に記載の方法。
- 前記二分木構造が前記第1の値と該第1の値に対応する割り付け場所との対応関係を示し、並びに前記二分木構造の枝が前記第1の値のビット表示の各ビットを示し、及び前記二分木構造のノードが前記オブジェクトの割り付け場所を示す、請求項5に記載の方法。
- 前記特定が、
ハッシュ値が参照されたことのない実行時オブジェクトのハッシュ値フィールドに含まれる前記値(以下、第2の値)と該第2の値に対応する割り付け場所との対応付けを記録する対応表(以下、第2の対応表)から、前記第2の値に対応する割り付け場所を特定することによって行われる、請求項2に記載の方法。 - プログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡することを可能にする方法であって、前記実行時オブジェクトは前記プログラム中に記述されるオブジェクトの割り付け場所から上記プログラムの実行時に生成されるオブジェクトであり、前記割り付け場所は前記プログラムの行番号又はプログラム・コードにおける相対的な位置であり、前記プログラムは、オブジェクト指向言語で記述されたプログラム又は当該オブジェクト指向言語で記述されたプログラムがコンパイルされた中間コードであり、且つ、前記実行時オブジェクトをメモリに割り付ける命令を有し、
前記方法が、
前記実行時オブジェクトのメモリへの割り付けに応じて、
請求項1に記載のデータ構造の前記ハッシュ値フィールド内に、前記プログラム中のオブジェクトの前記割り付け場所に対応した値を埋め込むステップを含み、前記ハッシュ値フィールドがハッシュ値として前記埋め込まれた値とオブジェクト識別子とを含み、前記追跡が該埋め込まれた値に対応する前記オブジェクトの割り付け場所を特定することによって行われる、
前記方法。 - 前記実行時オブジェクトのハッシュ値の参照命令が実行されることに応じて、
前記埋め込まれた値を、計算された値に置き換えるステップと、
前記計算された値と前記埋め込まれた値との対応表をメモリ内に作成するステップと
をさらに含む、請求項8に記載の方法。 - 前記プログラム中のオブジェクトの割り付け場所が同一である実行時オブジェクトが多くメモリに割り付けられる場合、前記ハッシュ値フィールド中の値に割り当てられるビット長を短くし、一方前記オブジェクト識別子に割り当てられるビット長を長くするステップをさらに含む、請求項8に記載の方法。
- 前記短くし且つ長くするステップが、ランダムに与えられる前記オブジェクト識別子の一部又は全部が予め決めておいたビットパターンに一致する場合に実行される、請求項10に記載の方法。
- 前記ハッシュ値フィールドは、前記参照命令が実行されたかどうかを示すフラグを含み、
前記参照命令の発行に応じて、該フラグを立てるステップをさらに含む、請求項9に記載の方法。 - 前記フラグの立っているハッシュ値フィールドを含む実行時オブジェクトのハッシュ値の参照命令が実行された場合、前記計算された値に置き換えるステップが実行されない、請求項12に記載の方法。
- 前記メモリが、該メモリのヒープ領域であり、
該ヒープ領域をスキャンし、使われていない実行時オブジェクトのハッシュ値フィールドの前記値を見つけて、新たな実行時オブジェクトに前記見つけた値を使用するステップをさらに含む、請求項8に記載の方法。 - 前記スキャンが、ガーベジコレクションにおいて実行される、請求項14に記載の方法。
- 前記値に割り当てられるビット長が、可変長である、請求項8に記載の方法。
- 前記ハッシュ値フィールドが、前記オブジェクトのオブジェクト・ヘッダ内にある、請求項8に記載の方法。
- プログラム中のオブジェクトの割り付け場所を、該実行時オブジェクトから追跡するためのコンピュータ・システムであって、前記実行時オブジェクトは前記プログラム中に記述されるオブジェクトの割り付け場所から上記プログラムの実行時に生成されるオブジェクトであり、前記割り付け場所は前記プログラムの行番号又はプログラム・コードにおける相対的な位置であり、前記プログラムは、オブジェクト指向言語で記述されたプログラム又は当該オブジェクト指向言語で記述されたプログラムがコンパイルされた中間コードであり、且つ、前記実行時オブジェクトをメモリに割り付ける命令を有し、
前記システムが、
前記実行時オブジェクトを格納するメモリと、
請求項1に記載のデータ構造から前記値を取得する取得部と、
前記取得した値に対応する前記オブジェクトの割り付け場所を特定する特定部と
を含む、前記コンピュータ・システム。 - コンピュータ・システムに、請求項2〜17のいずれか一項に記載の方法の各ステップを実行させることを含む、コンピュータ・プログラム。
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)
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)
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 |
-
2009
- 2009-03-03 JP JP2009049727A patent/JP4852621B2/ja not_active Expired - Fee Related
-
2010
- 2010-03-02 US US12/715,703 patent/US8555255B2/en not_active Expired - Fee Related
-
2013
- 2013-08-16 US US13/969,004 patent/US8782610B2/en not_active Expired - Fee Related
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 |