(57)【特許請求の範囲】
【請求項１】
サンプリング型プロファイラのためにプロファイル対象を決定するプログラムであって、該プログラムはコンピュータに、
（ａ）プログラムの実行中に、クラス又はオブジェクトの割り付け場所ごとのサンプリング頻度に基づきプロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該アクセスに関するプロファイル情報を格納するステップと、
（ｂ）格納された前記プロファイル情報に基づいて、クラス又はオブジェクトの割り付け場所ごとに、前記プログラムの最適化に利用する性質を有するオブジェクトを割り付けられた割合を算出するステップと、
（ｃ）算出した前記割合が所定の閾値以下であるクラス又はオブジェクトの割り付け場所についての前記サンプリング頻度を下げるステップと、
を実行させる前記プロファイル対象決定プログラム。
【請求項２】
ステップ（ｂ）において、前記プログラムの最適化に利用する性質を有するオブジェクトとは、初期化の後に書き込みがない又は書き込み頻度が低い不変オブジェクトである、請求項１に記載のプロファイル対象決定プログラム。
【請求項３】
ステップ（ｂ）において、前記プログラムの最適化に利用する性質を有するオブジェクトとは、読み込みがない又は読み込み頻度が低い書き込み専用オブジェクトである、請求項１に記載のプロファイル対象決定プログラム。
【請求項４】
ステップ（ｂ）において、前記プログラムの最適化に利用する性質を有するオブジェクトとは、アクセスされないフィールドを有する非アクセス・オブジェクトである、請求項１に記載のプロファイル対象決定プログラム。
【請求項５】
前記プロファイル対象に設定されたオブジェクトは、該オブジェクトを指すポインタに付されたプロファイル対象のマークによって識別され、
（ｄ）前記プロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該オブジェクトが前記プログラムの最適化に利用する性質を満たすか否かを判定するステップと、
（ｅ）前記オブジェクトが前記プログラムの最適化に利用する性質を満たさなくなったことを条件に、前記オブジェクトにプロファイル不要のマークを付すステップと、
（ｆ）前記プログラムの実行中に開始されたガーベッジ・コレクション処理において、前記プロファイル不要のマークを付されたオブジェクトを指すポインタに付された前記プロファイル対象のマークを外すステップとを更に前記コンピュータに実行させる、請求項１に記載のプロファイル対象決定プログラム。
【請求項６】
ステップ（ｄ）において、検出した前記オブジェクトへのアクセスが、該オブジェクトの初期化後になされる書き込みのためのアクセスである場合に、前記オブジェクトが前記プログラムの最適化に利用する性質を満たさなくなったと判定する、請求項５に記載のプロファイル対象決定プログラム。
【請求項７】
ステップ（ｄ）において、検出した前記オブジェクトへのアクセスが、該オブジェクトに対する読み込みのためのアクセスである場合に、前記オブジェクトが前記プログラムの最適化に利用する性質を満たさなくなったと判定する、請求項５に記載のプロファイル対象決定プログラム。
【請求項８】
ステップ（ｄ）において、検出した前記オブジェクトへのアクセスが、該アクセス以前にアクセスのない最後の前記オブジェクトのフィールドへのアクセスである場合に、前記オブジェクトが前記プログラムの最適化に利用する性質を満たさなくなったと判定する、請求項５に記載のプロファイル対象決定プログラム。
【請求項９】
（ｇ）前記プロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該オブジェクトに前記プロファイル不要のマークが付されているか否かを判定するステップと、
（ｈ）前記プロファイル不要のマークが付されているとの判定に応答して、アクセスされる前記オブジェクトを指すポインタを格納するレジスタの値が、該アクセス以降に比較命令のオペランドとして用いられるか否かを判定するステップと、
（ｉ）前記比較命令のオペランドとして用いられないとの判定に応答して、前記プロファイル不要のマークを付されたオブジェクトを指すポインタに付された前記プロファイル対象のマークを外して前記レジスタに書き戻すステップとを更に前記コンピュータに実行させる、請求項５に記載のプロファイル対象決定プログラム。
【請求項１０】
（ｊ）前記プログラムの最適化処理において、前記プログラムに含まれる全てのオブジェクトへのアクセス命令に対し、該オブジェクトを指すポインタを格納するレジスタの値が、前記アクセス命令以降に比較命令のオペランドとして用いられるか否かを判定し、比較命令のオペランドとして用いられないとの判定に対し前記アクセス命令のアドレスを記録するステップを更に前記コンピュータに実行させ、前記ステップ（ｈ）は、ステップ（ｊ）において記録されたアドレスの中からステップ（ｇ）において検出した前記アクセスを指示したアクセス命令のアドレスを検索することにより行われる、請求項９に記載のプロファイル対象決定プログラム。
【請求項１１】
ステップ（ｊ）は、手続き呼び出しへの引数、手続きの返り値、ポインタの比較命令のオペランド、及びメモリに書き込まれる値のいずれかとして前記レジスタの値が利用されることを条件に、前記レジスタの値が前記比較命令のオペランドとして用いられるとの判定を行うステップを含む、請求項１０に記載のプロファイル対象決定プログラム。
【請求項１２】
情報処理装置おいてサンプリング型プロファイラのためにプロファイル対象を決定する方法であって、  （ａ）前記情報処理装置が、プログラムの実行中に、クラス又はオブジェクトの割り付け場所ごとのサンプリング頻度に基づきプロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該アクセスに関するプロファイル情報を格納するステップと、
（ｂ）前記情報処理装置が、格納された前記プロファイル情報に基づいて、クラス又はオブジェクトの割り付け場所ごとに、前記プログラムの最適化に利用する性質を有するオブジェクトを割り付けられた割合を算出するステップと、
（ｃ）前記情報処理装置が、算出した前記割合が所定の閾値以下であるクラス又はオブジェクトの割り付け場所についての前記サンプリング頻度を下げるステップと、
を含むプロファイル対象決定方法。
【請求項１３】
サンプリング型プロファイラのためにプロファイル対象を決定する情報処理装置であって、
プログラムの実行中に、クラス又はオブジェクトの割り付け場所ごとのサンプリング頻度に基づきプロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該アクセスに関するプロファイル情報を格納するプロファイル情報収集部と、
前記プロファイル情報に基づいて、クラス又はオブジェクトの割り付け場所ごとに、前記プログラムの最適化に利用する性質を有するオブジェクトを割り付けられた割合を算出し、算出した前記割合が所定の閾値以下であるクラス又はオブジェクトの割り付け場所についての前記サンプリング頻度を下げるサンプリング頻度更新部と、
を含むプロファイル対象決定装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、サンプリングを用いるプロファイリング技術に関し、より詳細には、プロファイリングによるプログラム実行時の速度オーバーヘッドを削減するための情報処理装置、プロファイル対象決定プログラム及び方法に関する。
【背景技術】
【０００２】
多くのプログラムでは、メモリのヒープ領域に多数のオブジェクトが動的に割り付けられる。当該オブジェクト・フォーマットは、例えば現在のＪａｖａ（登録商標）仮想マシン（Virtual Machine）実装においてプログラム実行を通じて固定されている。当該固定されたオブジェクト・フォーマットは、例えばヘッダ及びデータ・フィールドのレイアウト、並びにそれらのサイズである。ここで、メモリー・フットプリント（メモリ使用量）、必要メモリ帯域幅、キャッシュ・ミス、ガーベジコレクション（ＧＣ）頻度、及びＧＣオーバーヘッドを減少させることが、上記プログラムを実行するコンピュータのコストを減少させる上で有用である。
【０００３】
そこでプログラム実行時にプロファイラによってオブジェクトへのアクセスに関する情報を取得しオブジェクトの性質を調べることによって、上記固定されたオブジェクト・フォーマットを上記コストが減少するように変形し、プログラムを最適化することが従来行われている。
【０００４】
例えば、初期化の後は書込みがない又は書きこみ頻度が低いという性質を持ったオブジェクト（以下、「不変オブジェクト」という）が複数あった場合、内容が同じであればこれらのオブジェクトを単一のオブジェクトにまとめることができる。また、読み込みがない又は読み込み頻度が低いという性質を持つオブジェクト（以下、「書き込み専用オブジェクト」という）が見つかれば、該オブジェクトを圧縮できる。更にまた、配列要素の一部がアクセスされない配列オブジェクト（以下、非アクセスオブジェクト」という）が見つかれば、アクセスのない要素を削除できる。上記最適化により、メモリの節約によるＧＣ頻度の低下や、キャッシュ使用効率の向上が図られる。
【０００５】
上記プロファイリングでは、全てのオブジェクトへのアクセスについてプロファイルを取ると速度オーバーヘッドが非常に大きくなることから、オブジェクトのサンプリングが行われている。しかしながらサンプリングを用いても依然として速度オーバーヘッドは大きく、プログラムの種類によってはプロファイリングのために実行速度が４０％以上遅くなる。一方で、速度オーバーヘッドを小さくするためにサンプリング頻度を単純に下げると、今度はプロファイルの精度が下がるという問題が生ずる。
【０００６】
以下、本発明の先行技術調査において見つかった文献について説明する。
【０００７】
特許文献１は、プロファイル情報又はユーザ指定情報をもとに選択したソース情報を入力し、そのソース情報を構文解析し、解析結果からソース情報に出現する手続き（親手続き）で呼び出される手続呼出し（子手続き）の属性を解析して手続き属性表に記憶し、インライン展開の際に子手続きの属性が手続き属性表に登録されていなければ親手続きに最適化不要をマークし、最適化不要がマークされている親手続きを除いて他の手続きを最適化する技術を開示する。かかる技術によれば、問題を生じる可能性のある最適化は自動的に抑止される。しかしながら、特許文献１に記載の技術は、サンプリングを用いたプロファイリング技術を改善するためのものではないため、プロファイリングによる速度オーバーヘッドを削減することはできない。
【０００８】
特許文献２は、中間形式データに、実行中の手続き内の変数に与えられる値で頻度が５０％以上になりうる値とその出現回数とを最大２組まで記録する処理を付加して、一次プロファイル情報を取得し、続いて、中間形式データに、一次プロファイル情報の２つ値の出現回数と手続きの実行回数を記録する処理を付加して、最終プロファイル情報を取得し、最終プロファイル情報をもとに変数に対し出現頻度が５０％ 以上の値を求め、この値に関する手続きを最適化し、目的プログラムを生成する技術を開示する。かかる技術によれば、手続き中の変数に与えられる値の出現回数を誤りなく見積もることができ、特に、出現頻度が５０％を超える値を確実に記録したプロファイル情報を出力することが可能となる。しかしながら、特許文献２に記載の技術は、サンプリングを用いたプロファイリング技術を改善するためのものではないため、プロファイリングによる速度オーバーヘッドを削減することはできない。
【０００９】
特許文献３は、記録媒体に記録されたコンパイル用プログラムである入力コードを、プロファイルデータを用いてコンパイルして一次目的コードを生成するコンパイル部と、一次目的コードをシミュレーションしプロファイルデータを生成するシミュレータとを備えるマイクロプロセッサ用目的コードの最適化装置において、コンパイル部が生成した一次目的コードの命令コードを解析してこの命令コード対応処理の実行である命令コード実行を行い、命令コード実行によるデータコードのアクセス回数をアドレス及びアクセス対象のデータコードのサイズ毎に記録したデータアクセス情報に基づきアクセス頻度の高いデータコードを検出し、１命令でアクセス可能なデータコード領域であるキャッシュ領域に再配置して二次目的コードを生成し、二次目的コードの命令コードを解析して命令コード実行を行うシミュレータを開示する。かかる技術によれば、ディスプレースメント範囲外データコードであっても、目的コード中のデータコードを再配置しデータへのアクセス方法を最適化するので、プログラムの実行速度を向上させることが可能となる。しかしながら、特許文献３に記載の技術は、サンプリングを用いたプロファイリング技術を改善するためのものではないため、プロファイリングによる速度オーバーヘッドを削減することはできない。
【００１０】
特許文献４は、コンパイラが生成した内部変数をレジスタ、メモリ等の機械資源に割り付ける資源割り付け部が割り付け、アセンブラコード生成部が命令列を出力すると、別名アクセス性解析部が、命令列内に含まれているメモリアクセス命令における別名アクセスの可能性の有無を割り付け資源情報に登録し、アセンブラ最適化部が割り付け情報を参照してアセンブラレベルの最適化を行う技術を開示する。かかる技術によれば、間接アドレス指定型のメモリアクセス命令の存在に起因する制約が緩和され、実行時間及びプログラムサイズの向上を図ることが可能となる。しかしながら、特許文献４に記載の技術は、サンプリングを用いたプロファイリング技術を改善するためのものではないため、プロファイリングによる速度オーバーヘッドを削減することはできない。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２００４−０１０２５９７号公報
【特許文献２】特開２００５−００７１１３５号公報
【特許文献３】特開２００２−０３０４３０２号公報
【特許文献４】特開１９９９−００３９１６７号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
この発明は、上記の問題点を解決するためになされたものであって、プロファイルの精度を下げることなく、プロファイリングによるプログラム実行時の速度オーバーヘッドを削減するための情報処理装置、プロファイル対象決定プログラム及び方法を提供することを目的とする。
【課題を解決するための手段】
【００１３】
本発明の発明者は、上記課題を解決するために研究し、最適化処理において参照するプロファイル情報には真に必要となるプロファイル情報とそうでないプロファイル情報とが存在することに着目した。即ち、最適化処理において重要なのはオブジェクトへの正確なアクセス数ではなく、不変性、書き込み専用性、非アクセス性等の最適化に利用可能なオブジェクトの性質である。従って、このような性質を示さないオブジェクトへのアクセスのプロファイルを省略すれば、プロファイルの精度を下げることなく速度オーバーヘッドを削減することが可能となる。そこで本発明者は更に研究を進め、その結果、同じクラスのオブジェクトや同じ割り付け場所で割り付けられたオブジェクトの性質は似ていることを利用して、クラス又は割り付け場所ごとに、プログラムの最適化に利用する性質を有するオブジェクトを割り付けられた割合を算出し、算出された割合が低いクラス又は割り付け場所に対するサンプリング頻度を下げるというアイデアに想到した。
【００１４】
即ち、上記課題を解決するために、本発明の第１の態様においては、サンプリング型プロファイラのためにプロファイル対象を決定するプログラムが提供される。該プログラムはコンピュータに、（ａ）プログラムの実行中に、クラス又はオブジェクトの割り付け場所ごとのサンプリング頻度に基づきプロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該アクセスに関するプロファイル情報を格納するステップと、（ｂ）格納された前記プロファイル情報に基づいて、クラス又はオブジェクトの割り付け場所ごとに、前記プログラムの最適化に利用する性質を有するオブジェクトを割り付けられた割合を算出するステップと、（ｃ）算出した前記割合が所定の閾値以下であるクラス又はオブジェクトの割り付け場所についての前記サンプリング頻度を下げるステップとを実行させる。
【００１５】
ここで、前記プログラムの最適化に利用する性質を有するオブジェクトとは、初期化の後に書き込みがない又は書き込み頻度が低い不変オブジェクト、読み込みがない又は読み込み頻度が低い書き込み専用オブジェクト、アクセスされないフィールドを有する非アクセス・オブジェクトのいずれかであってよい。
【００１６】
好ましくは、前記プロファイル対象に設定されたオブジェクトは、該オブジェクトを指すポインタに付されたプロファイル対象のマークによって識別される。そして上記プログラムは上記コンピュータに、
（ｄ）前記プロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該オブジェクトが前記プログラムの最適化に利用する性質を満たすか否かを判定するステップと、（ｅ）前記オブジェクトが前記プログラムの最適化に利用する性質を満たさなくなったことを条件に、前記オブジェクトにプロファイル不要のマークを付すステップと、（ｆ）前記プログラムの実行中に開始されたガーベジ・コレクション処理において、前記プロファイル不要のマークを付されたオブジェクトを指すポインタに付された前記プロファイル対象のマークを外すステップとを更に実行させる。
【００１７】
上記ステップ（ｄ）の判定において、好ましくは、検出した前記オブジェクトへのアクセスが、該オブジェクトの初期化後になされる書き込みのためのアクセスである場合に、前記オブジェクトが前記プログラムの最適化に利用する性質を満たさなくなったと判定する。これに加えて、又はこれに代えて、検出した前記オブジェクトへのアクセスが、該オブジェクトに対する読み込みのためのアクセスである場合に、前記オブジェクトが前記プログラムの最適化に利用する性質を満たさなくなったと判定してもよい。更に上記に加えて、又は上記に代えて、検出した前記オブジェクトへのアクセスが、該アクセス以前にアクセスのない最後の前記オブジェクトのフィールドへのアクセスである場合（ここで「最後の前記オブジェクトのフィールド」とは、該フィールド以外に前記アクセス以前にアクセスのない前記オブジェクトのフィールドがないことを意味する）に、前記オブジェクトが前記プログラムの最適化に利用する性質を満たさなくなったと判定してもよい。
【００１８】
好ましくは、上記プログラムは上記コンピュータに、（ｇ）前記プロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該オブジェクトに前記プロファイル不要のマークが付されているか否かを判定するステップと、（ｈ）前記プロファイル不要のマークが付されているとの判定に応答して、アクセスされる前記オブジェクトを指すポインタを格納するレジスタの値が、該アクセス以降に比較命令のオペランドとして用いられるか否かを判定するステップと、（ｉ）前記比較命令のオペランドとして用いられないとの判定に応答して、前記プロファイル不要のマークを付されたオブジェクトを指すポインタに付された前記プロファイル対象のマークを外して前記レジスタに書き戻すステップとを更に実行させる。
【００１９】
更に好ましくは、上記プログラムは上記コンピュータに、（ｊ）前記プログラムの最適化処理において、前記プログラムに含まれる全てのオブジェクトへのアクセス命令に対し、該オブジェクトを指すポインタを格納するレジスタの値が、前記アクセス命令以降に比較命令のオペランドとして用いられるか否かを判定し、比較命令のオペランドとして用いられないとの判定に対し前記アクセス命令のアドレスを記録するステップを更に実行させる。そして前記ステップ（ｈ）は、ステップ（ｊ）において記録されたアドレスの中からステップ（ｇ）において検出した前記アクセスを指示したアクセス命令のアドレスを検索することにより行われる。
【００２０】
更にまた好ましくは、ステップ（ｊ）は、手続き呼び出しへの引数、手続きの返り値、ポインタの比較命令のオペランド、及びメモリに書き込まれる値のいずれかとして前記レジスタの値が利用されることを条件に、前記レジスタの値が前記比較命令のオペランドとして用いられるとの判定を行う。
【００２１】
以上、サンプリング型プロファイラのためにプロファイル対象を決定するプログラムとして本発明を説明した。しかし、本発明は、上記プログラムをインストールしたコンピュータにおいて実行されるプロファイル対象決定方法として把握することもできる。また、本発明は、上記プログラムをインストールしてプロファイル対象決定方法を実行する情報処理装置として把握することもできる。
【発明の効果】
【００２２】
本発明では、同じクラスのオブジェクトや同じ割り付け場所で割り付けられたオブジェクトの性質は似ていることを利用して、クラス又は割り付け場所ごとに、プログラムの最適化に利用する性質を有するオブジェクトを割り付けられた割合を算出し、算出された割合が低いクラス又は割り付け場所に対するサンプリング頻度を下げる。結果、プログラムの最適化に利用する性質を示さないオブジェクトへのアクセスのプロファイルのみを省略することができるようになり、プロファイルの精度を下げることなく速度オーバーヘッドを削減することが可能となった。本発明のその他の効果については、各実施の形態の記載から理解される。
【図面の簡単な説明】
【００２３】
【図１Ａ】本発明の実施形態に係るコンピュータ５０のハードウェア構成の一例を示す。
【図１Ｂ】本発明の実施形態に係るコンピュータ５０のソフトウェア構成の一例を示す。
【図２】本発明の実施形態に係るプロファイル対象決定装置２００の機能構成を示す。
【図３Ａ】マーク解除機能を有しないプロファイラ利用時のプログラム実行軌跡の一例を示す。
【図３Ｂ】マーク解除機能を有するプロファイラ利用時のプログラム実行軌跡の一例を示す。
【図４】本実施形態に係るプロファイル対象決定装置２００の動作フローの一例を示す。
【図５】図４に示すステップ４１０のメモリ管理部１３０による処理の詳細な動作フローの一例を示す。
【図６】図４に示すステップ４２０のプロファイラ１２０の詳細な動作フローの一例を示す。
【図７Ａ】図４に示すステップ４２４の動的コンパイラ１２５による処理の詳細な動作フローの一例を示す。
【図７Ｂ】図４に示すステップ４２４の動的コンパイラ１２５による他の処理の詳細な動作フローの一例を示す。
【図８】速度オーバーヘッドに関する比較実験結果を示す。
【図９Ａ】不変性プロファイルにおける誤差に関する実験結果を示す。
【図９Ｂ】書き込み専用性プロファイルにおける誤差に関する実験結果を示す。
【図９Ｃ】非アクセス性プロファイルにおける誤差に関する実験結果を示す。
【発明を実施するための形態】
【００２４】
以下、本発明の実施形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。なお、実施の形態の説明の全体を通じて同じ要素には同じ番号を付している。
【００２５】
図１は、本発明の実施形態による情報処理装置としてのコンピュータ５０のハードウェア構成の一例を示した図である。コンピュータ５０は、バス２に接続されたメインＣＰＵ（中央処理装置）１とメイン・メモリ４を含んでいる。ＣＰＵ１は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものであり、例えば、インテル社のＣｏｒｅ  ｉ（商標）シリーズ、Ｃｏｒｅ  ２（商標）シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ、Ｃｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ社のＰｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（商標）シリーズ又はＳｅｍｐｒｏｎ（商標）が使用されうる。
【００２６】
またハードディスク装置１３、３０、及びＣＤ−ＲＯＭ装置２６、２９、フレキシブル・ディスク装置２０、ＭＯ装置２８、ＤＶＤ装置３１のようなリムーバブル・ストレージ（記録メディアを交換可能な外部記憶システム）がフレキシブル・ディスクコントローラ１９、ＩＤＥコントローラ２５、ＳＣＳＩコントローラ２７などを経由してバス２へ接続されている。フレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭのような記憶メディアが、リムーバブル・ストレージに挿入される。
【００２７】
これら記憶メディアやハードディスク装置１３、３０、ＲＯＭ１４には、オペレーティング・システム、Ｊ２ＥＥなどのＪａｖａ（登録商標）処理環境、Ｊａｖａ（登録商標）アプリケーション、Ｊａｖａ（登録商標）仮想マシン（ＶＭ）、Ｊａｖａ（登録商標）実行時（ＪＩＴ）コンパイラを提供するプログラム、その他のプログラム及びデータが、メイン・メモリ４にロード可能に記憶されている。更に、上記記憶メディアやハードディスク装置１３、３０、ＲＯＭ１４には、オペレーティング・システムと協働してＣＰＵ１に命令を与え、本発明を実施するためのコンピュータ・プログラムを記録することができる。即ち、上記説明した数々の記憶装置には、コンピュータ５０にインストールされ、コンピュータ５０を本発明の実施形態によるプロファイル対象決定装置２００として機能させるプロファイル対象決定プログラムやデータを記録することができる。
【００２８】
上記プロファイル対象決定プログラムは、マーク設定モジュールと、初期化モジュールと、呼び出し設定モジュールと、検証モジュールと、プロファイル情報収集モジュールと、解除判定モジュールと、サンプリング頻度更新モジュールと、解除モジュールと、即時解除モジュールと、コード書き換えモジュールとを含む。これらプログラム及びモジュールは、ＣＰＵ１に働きかけて、コンピュータ５０を、各々後述するマーク設定部２０２と、初期化部２０３と、呼び出し設定部２０５と、検証部２１０と、プロファイル情報収集部２２０と、解除判定部２３０と、サンプリング頻度更新部２３５と、解除部２４５と、即時解除部２５０と、コード書き換え部２５５としてそれぞれ機能させる。コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。  
【００２９】
コンピュータ５０は、キーボード／マウス・コントローラ５を経由して、キーボード６やマウス７のような入力デバイスからの入力を受ける。コンピュータ５０は、オーディオコントローラ２１を経由して、マイク２４からの入力を受け、またスピーカー２３から音声を出力する。コンピュータ５０は、視覚データをユーザに提示するための表示装置１１に、グラフィックスコントローラ１０を経由して接続される。コンピュータ５０は、ネットワーク・アダプタ１８（イーサネット（登録商標）・カードやトークンリング・カード）等を介してネットワークに接続し、他のコンピュータ等と通信を行うことが可能である。
【００３０】
以上の説明により、コンピュータ５０は、通常のパーソナルコンピュータ、ワークステーション、メインフレームなどの情報処理装置、又は、これらの組み合わせによって実現されることが容易に理解されるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００３１】
図１Ｂは、本発明を実現するソフトウェアの構成を示すブロック図である。同図において、オペレーティング・システム１０５は、ＣＰＵやメモリを資源として管理し、時分割によるマルチスレッドの機能を実現する。仮想マシン１１０は、アプリケーション１３５とオペレーティング・システム１０５とのインタフェースを行うソフトウェアであり、アプリケーション１３５から見て仮想マシン以下の階層全体を例えばＪａｖａ（登録商標）仮想マシン（Virtual Machine）として作用させる。仮想マシン１１０は、プログラムがバイトコード等の中間コードで与えられるときこれを解釈する実行部（インタープリタ）１１５と、その解釈に応じて呼び出されるプロファイラ１２０と、メモリ管理部１３０とを含む。また、仮想マシン１１０は好ましくはＪＩＴコンパイラ等の動的コンパイラ１２５を含み、バイトコードを実行時に動的に機械語にコンパイルしてネイティブコードを生成し、プログラムの実行を高速化する。
【００３２】
次に図１Ｂに示す仮想マシンの機能の更なる詳細を説明する前に、従来のオブジェクト・サンプリングを用いるプロファイリングに基づく最適化処理について説明する。従来の最適化処理では、プロファイル情報が示すオブジェクトの性質に従い次のような処理が行われていた。
（１）初期化の後は書込みがない又は書きこみ頻度が低いという性質を持った不変オブジェクトが複数見つかった場合、内容が同じであればこれらのオブジェクトを単一のオブジェクトにまとめる。
（２）読み込みがない又は読み込み頻度が低いという性質を持つ書き込み専用オブジェクトが見つかった場合、該オブジェクトを圧縮する。
（３）配列要素の一部がアクセスされない非アクセスオブジェクトが見つかった場合、アクセスのない要素を削除する。
上記最適化処理により、メモリの節約によるＧＣ頻度の低下や、キャッシュ使用効率の向上が図られていた。
【００３３】
しかしながら上述したように、従来のオブジェクト・サンプリングを用いるプロファイリングは速度のオーバーヘッドをもたらす。そこで本発明者は、上記最適化処理ではオブジェクトへのアクセス回数ではなくオブジェクトの性質がキーとなること、また、同じクラスのオブジェクトや同じ割り付け場所で割り付けられたオブジェクトの性質は似ていることに着目して、クラス又は割り付け場所ごとに、プログラムの最適化に利用する性質を有するオブジェクトを割り付けられた割合を算出し、算出された割合が低いクラス又は割り付け場所に対するサンプリング頻度を下げるというアイデアに想到した。本発明の実施形態に係るプロファイル対象決定装置２００は、上記アイデアを組み込んで、最適化に真に必要とされるオブジェクトへのアクセスのみを対象としてプロファイル情報を収集できるようにプロファイル対象を決定する。以下、本発明の実施形態に係るプロファイル対象決定装置２００の各構成要素の詳細を説明する。なお、上記（１）〜（３）の処理は説明のための例示であり、他のオブジェクトの性質に基づく最適化のためのプロファイリングに対し以下に説明する本発明を適用可能なことは言うまでもない。
【００３４】
図２は、図１Ａに示すコンピュータ５０のハードウェア機能と図１Ｂに示すソフトウェア機能とを有する、本発明の実施形態に係るプロファイル対象決定装置２００の機能構成を示す。本発明の実施形態に係るプロファイル対象決定装置２００は、マーク設定部２０２と、初期化部２０３と、呼び出し設定部２０５と、検証部２１０と、プロファイル情報収集部２２０と、解除判定部２３０と、サンプリング頻度更新部２３５と、解除部２４５と、即時解除部２５０と、コード書き換え部２５５とを備える。更にプロファイル対象決定装置２００は、検証部２１０の検証結果に基づき求められたオブジェクト・アクセス命令のアドレスを記録したアドレス表を格納するアドレス表格納部２１５と、プロファイル情報収集部２２０により収集されたプロファイル情報を格納するプロファイル情報格納部２２５と、サンプリング頻度更新部２３５により更新されたサンプリング頻度を格納するサンプリング頻度格納部２４０とを備える。なお、上記マーク設定部２０２及び初期化部２０３の機能は、図１Ｂに示す実行部１１５の機能として実装してよい。また、呼び出し設定部２０５及び解除部２４５の機能は図１Ｂに示すメモリ管理部１３０の機能として実装してよい。また、検証部２１０、アドレス表格納部２１５及びコード書き換え部２５５の機能は、図１Ｂに示す動的コンパイラ１２５の機能として実装してよい。また、プロファイル情報収集部２２０、プロファイル情報格納部２２５、解除判定部２３０、サンプリング頻度更新部２３５、サンプリング頻度格納部２４０及び即時解除部２５０は、図１Ｂに示すプロファイラ１２０の機能として実装してよい。
【００３５】
マーク設定部２０２は、クラス又はオブジェクトの割り付け場所ごとのサンプリング頻度に基づき、割り付けたオブジェクトをプロファイル対象とするか否かを決定し、プロファイル対象とすると決定したオブジェクトに対しては、該オブジェクトを指すポインタにプロファイル対象であることを示すマークを設定する。
【００３６】
ここでサンプリング頻度とは、例えば１ＭＢ割り付けるたび１つオブジェクトをサンプリングするといったようなサンプリングを行う頻度である。従来は固定された値のサンプリング頻度が１つだけ用いられていた。本発明では、かかるサンプリング頻度をクラス又はオブジェクトの割り付け場所ごとに用意し、最適化に利用する性質を有さないオブジェクトに対してはプロファイリングが行われないようにすることを可能とした。
【００３７】
なお、クラス又はオブジェクトの割り付け場所ごとのサンプリング頻度は、実行対象プログラムの実行開始前又は直後に同じ所定の値で初期化しておく。また、上記マークの設定は、一例として、ポインタの空いている下１ビットをフラグとして利用したり、ポインタにオフセットを足してヒープ領域外を指すようにしたりして行ってよい。なお、マーク設定部２０２は、上記マークの設定を、例えばオブジェクトの割り付けにおいて、又は、ガーベジコレクションにおいて行う。
【００３８】
初期化部２０３は、後述するプロファイル情報収集部２２０が、収集したプロファイル情報を所定のデータ構造でプロファイル情報格納部２２５に格納できるように、予め所定のデータ構造のプロファイル情報を生成し初期化してプロファイル情報格納部２２５に格納しておく。ここで所定のデータ構造とは、収集したプロファイル情報を効率よく格納するための構造であり、オブジェクト毎のプロファイル情報構造体と、クラス毎のプロファイル情報構造体又はオブジェクトの割り付け場所毎のプロファイル情報構造体とを含む。
【００３９】
オブジェクト毎のプロファイル情報構造体は、オブジェクトの割り付け場所を識別する識別子（以下、「割り付け場所ＩＤ」という）を格納する第１フィールドと、最適化に利用する性質をオブジェクトが有するか否かを判定するのに用いる情報を格納する第２フィールドとを有する。第２フィールドに格納する情報は、適用する最適化の種類によって異なるため、ここでは、オブジェクトの不変性、書き込み専用性、及び非アクセス性を利用する最適化を例として説明する。  
【００４０】
オブジェクトの不変性を利用する最適化では、初期化の後は書込みがない又は書きこみ頻度が低いという性質を持つオブジェクトを識別する必要がある。そこで、上記第２フィールドには、これまでに一度でもreadがあったか否かを示す１ビット（該ビットには、初期値として「readがない」を示す１ビットを設定）を格納する。また、オブジェクトの書き込み専用性を利用する最適化では、読み込みがない又は読み込み頻度が低いという性質を持つオブジェクトを識別する必要がある。しかし該性質は、readのためのアクセスがあった時点で直ちにオブジェクトは書き込み専用性を有さないと判断できる。従って、本ケースでは上記第２フィールドに格納する情報はない（但し、読み込み頻度が低いとする場合は読み込み回数をカウントするカウンタ値や読み込み頻度情報を格納してもよい）。また、オブジェクトの非アクセス性を利用する最適化では、配列要素の一部がアクセスされない配列オブジェクトを識別する必要がある。そこで、上記第２フィールドには、オブジェクト中の各バイトにつきアクセスがあったか否かを示す１ビット（各ビットには、初期値として「アクセスがない」を示す１ビットを設定）を格納する。
【００４１】
初期化部２０３は、オブジェクト毎のプロファイル情報構造体の生成及び初期化を、該オブジェクトの割り付け時に、該オブジェクトがプロファイル対象に決定されることを条件に行う。初期化部２０３は、空のハッシュ表（以下、「第１ハッシュ表」という）を生成してプロファイル情報格納部２２５に格納しておき、オブジェクト毎のプロファイル情報構造体を生成すると、これをオブジェクトの先頭アドレスをキーとして第１ハッシュ表に登録する。このとき初期化部２０３は、オブジェクトの割り付け場所のＩＤをオブジェクト毎のプロファイル情報構造体の第１フィールドに格納する。オブジェクト毎のプロファイル情報構造体の第２フィールドの値の初期化は、適用する最適化の種類によって異なり、オブジェクトの不変性、書き込み専用性、及び非アクセス性を利用する最適化オブジェクについては上述した通りである。
【００４２】
クラス毎のプロファイル情報構造体は、割り付けられた該クラスのオブジェクトの全バイト数を格納する第１フィールド（該フィールドには、初期値として０を設定）と、割り付けられた該クラスのオブジェクトのうち最適化に利用する性質を有する全オブジェクトの全バイト数を格納する第２フィールド（該フィールドには、初期値として０を設定）とを有する。例えばオブジェクトの不変性を利用する最適化では、注目するクラスをクラスＡとすると、クラスＡのプロファイル情報構造体の第１フィールドに、クラスＡに割り付けられたオブジェクトの全バイト数を格納し、クラスＡのプロファイル情報構造体の第２フィールドに、クラスＡに割り付けられた不変オブジェクトの全バイト数を格納する。なお、割り付け場所毎のプロファイル情報構造体についても同様である。即ち、割り付け場所毎のプロファイル情報構造体は、該割り付け場所に割り付けられたオブジェクトの全バイト数を格納する第１フィールド（該フィールドには、初期値として０を設定）と、該割り付け場所に割り付けられたオブジェクトのうち最適化に利用する性質を有する全オブジェクトの全バイト数を格納する第２フィールド（該フィールドには、初期値として０を設定）とを有する。
【００４３】
初期化部２０３は、クラス毎のプロファイル情報構造体又は割り付け場所毎のプロファイル情報構造体の生成及び初期化を、オブジェクトの割り付け時に、該オブジェクトがプロファイル対象に決定されること、かつ、割り付けたオブジェクトがそのオブジェクトのクラスの最初のオブジェクトであること又はその割り付け場所で割り付けられた最初のオブジェクトであることを条件に行う。初期化部２０３は、空のハッシュ表（以下、「第２ハッシュ表」という）又は空の配列（以下、「第１配列」という）を生成してプロファイル情報格納部２２５に格納しておき、クラス毎のプロファイル情報構造体を生成すると該構造体を、クラスを識別する識別子（以下、「クラスＩＤ」という）をキーとして第２ハッシュ表に、又はクラスＩＤを添え字として第１配列に登録する。同様に初期化部２０３は、割り付け場所毎のプロファイル情報構造体を生成すると該構造体を、割り付け場所ＩＤをキーとして第２ハッシュ表に、又は割り付け場所ＩＤを添え字として第１配列に登録する。なお、初期化部２０３は、上記クラス毎のプロファイル情報構造体又は割り付け場所毎のプロファイル情報構造体の生成及び初期化とは別に、オブジェクト毎のプロファイル情報構造体の生成及び初期化を行う際に（対応するクラス毎のプロファイル情報構造体又は対応する割り付け場所毎のプロファイル情報構造体が生成されていない場合はその生成後に）、対応するクラス毎のプロファイル情報構造体又は対応する割り付け場所毎のプロファイル情報構造体の第１フィールド及び第２フィールドのそれぞれに、割り付けたオブジェクトのバイト数を加算する。
【００４４】
呼び出し設定部２０５は、プロファイル対象であることを示すマークを付されたポインタを介してオブジェクトへのアクセスがあるとプロファイラ１２０が呼び出されるように、プロファイラ１２０の呼び出しを設定する。該設定には、実行対象のプログラムのコード（中間コード）を書き換えて行う方法と、ページ保護機構を利用する方法とがある。呼び出し設定部２０５は後者を採用し、前者については、後述するコード書き換え部２５５が採用する。従って、プロファイル対象決定装置２００は、呼び出し設定部２０５と後述するコード書き換え部２５５のうち少なくとも一方を含めばよいことに留意されたい。
【００４５】
ページ保護機構を利用する呼び出し設定部２０５は、より具体的には、プロファイル対象であることを示すマークを付されたポインタが指す先のページを読み書き禁止に設定し、該ポインタを介してオブジェクトがアクセスされるとシグナルハンドラが呼び出されるようにする。この場合、シグナルハンドラがプロファイラ１２０としてプロファイル情報の収集を行う。なお、呼び出し設定部２０５は、上記プロファイラ１２０の呼び出し設定を、例えば実行対象プログラムの実行開始前、又は直後に行う。  
【００４６】
検証部２１０は、実行対象プログラムである中間コードに含まれるオブジェクトへのアクセス命令に用いられるポインタの値を格納する全ベースレジスタの各々について、その値が上記アクセス命令の後においてポインタの比較命令のオペランドとして用いられているか否かを検証する。検証部２１０は、検証の結果、ポインタの比較命令に用いられないと判定したアクセス命令について、そのアクセス命令のアドレスをアドレス表格納部２３０に格納されるアドレス表に登録する。なお、アドレス表は、実行対象プログラムの実行開始前又は直後に空の値で初期化しておく。またアドレス表が大きくなりすぎるような場合は、頻繁に実行される手続き内の命令のアドレスだけを登録するようにしてもよい。アドレス表の利用方法については後述する。
【００４７】
検証部２１０は、より具体的には、実行対象プログラムである中間コードを解析し、オブジェクトへのポインタを格納するベースレジスタの値が、手続き呼び出しへの引数、手続きの返り値、ポインタの比較命令のオペランド、及びメモリに書き込まれる値のいずれかとして利用されるか否かを判定する。好ましくは、検証部２１０は、手続き間解析を利用し、上記ベースレジスタの値が手続き呼び出しへの引数又は手続きの返り値として利用される場合、呼び出される先の手続き又は呼び出し元の手続きにおいて上記解析及び判定を繰り返す。また好ましくは、検証部２１０は、エイリアス解析を利用し、エイリアス解析の結果を用いてベースレジスタもしくはそれがコピーされた値がポインタの比較命令のオペランドとして利用されるか否かを判定する。
【００４８】
なお、上記手続き間解析及びエイリアス解析を利用しない場合、検証部２１０は、上記オブジェクトへのポインタを格納するベースレジスタの値が、手続き呼び出しへの引数、手続きの返り値、メモリに書き込まれる値、及びポインタの比較命令のオペランドのいずれか１つにでも利用される場合、ベースレジスタの値がポインタの比較命令に用いられる可能性があると保守的に判定する。なお、検証部２１０は、上記検証及びアドレス表作成処理を、例えば実行対象プログラムである中間コードの部分の動的コンパイル処理において行う。
【００４９】
プロファイル情報収集部２２０は、プロファイラ１２０又はシグナルハンドラの呼び出しに応答して、即ち、プロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該アクセスに関するプロファイル情報の収集を行う。プロファイル情報収集部２２０は、収集したプロファイル情報を、上記説明したプロファイル情報の構造体に格納する。より具体的には、プロファイル情報収集部２１０は、アクセスされたオブジェクトの先頭アドレスをキーにして第１ハッシュ表を引き、上記オブジェクトに対応するオブジェクト毎のプロファイル情報構造体を得る。そしてプロファイル情報収集部２２０は、取得したオブジェクト毎のプロファイル情報構造体の第２フィールドに、最適化が利用する性質を上記アクセスされたオブジェクトが満たすか否かを判定するのに必要な情報を格納する。
【００５０】
例えばオブジェクトの不変性を利用する最適化の場合、プロファイル情報収集部２２０は、現在のアクセスがreadのためのアクセスであれば、第２フィールドに格納される１ビットを立ててreadのためのアクセスがあったことを示し、現在のアクセスがwriteのためのアクセスであれば、何もしない。オブジェクトの書き込み専用性を利用する最適化の場合、上述したように、プロファイル情報収集部２２０は第２フィールドには何も格納しない。オブジェクトの非アクセス性を利用する最適化の場合、プロファイル情報収集部２２０は、アクセスのあったオブジェクトのバイトに対応するビットを立てる。なお、プロファイル情報収集部２２０は、上記プロファイル情報収集処理を、例えば実行プログラムの実行時においてなされるプロファイリングにおいて行う。プロファイル情報収集部２２０は、収集したプロファイル情報の格納処理が終わると、解除判定部２３０を呼び出す。
【００５１】
解除判定部２３０は、プロファイル情報収集部２２０から呼び出されると、プロファイル情報格納部２２５に格納されるプロファイル情報に基づき、アクセスされるオブジェクトがプログラムの最適化に利用する性質を満たすか否かを判定する。そして解除判定部２３０は、オブジェクトがプログラムの最適化に利用する性質を満たさないと判定することを条件に、該オブジェクトにプロファイル不要のマークを設定する。これは、オブジェクトがプログラムの最適化に利用する性質を満たさない又は満たさなくなった場合には、それ以上プロファイルする価値がないためである。なお、解除判定部２３０は、対応するオブジェクト毎のプロファイル情報構造体へのポインタをプロファイル情報収集部２２０から受け取ってよく、あるいは、現在のアクセスされたオブジェクトの先頭アドレスをキーにして第１ハッシュ表を引くことにより取得してもよい。
【００５２】
ここで、オブジェクトの不変性を利用する最適化を適用している場合、解除判定部２３０は、検出したオブジェクトへのアクセスが、該オブジェクトの初期化後になされる書き込みのためのアクセスであることを条件に、オブジェクトがプログラムの最適化に利用する性質を満たさなくなったと判定する。上記条件は、具体的には、取得した対応するオブジェクト毎のプロファイル情報構造体の第２フィールドのフラグの値がこれまでに１度でもreadがあったことを示す「１」となっており、かつ、現在のアクセスがwriteのためのアクセスである場合に満たされる。
【００５３】
また、オブジェクトの書き込み専用性を利用する最適化を適用している場合、解除判定部２３０は、検出したオブジェクトへのアクセスが、該オブジェクトに対する読み込みのためのアクセスであることを条件に、オブジェクトがプログラムの最適化に利用する性質を満たさなくなったと判定する。上記条件は、具体的には、現在のアクセスがreadのためのアクセスである場合に満たされる。
【００５４】
また、オブジェクトの非アクセス性を利用する最適化を適用している場合、解除判定部２３０は、検出したオブジェクトへのアクセスが、該アクセス以前にアクセスのない最後のオブジェクトのフィールドへのアクセスであることを条件に、オブジェクトがプログラムの最適化に利用する性質を満たさなくなったと判定する。上記条件は、具体的には、取得した対応するオブジェクト毎のプロファイル情報の第２フィールドの全フラグの値が、アクセスがあったことを示す「１」となっている場合に満たされる。
【００５５】
オブジェクトへのプロファイル不要のマーク付けは、オブジェクトのヘッダを利用してよい。即ち、
オブジェクトは、典型的には、ヘッダ及び少なくとも１のフィールドを含む。ヘッダは、オブジェクト内に埋め込まれた、オブジェクト自体の情報を保持する部分であり、例えばオブジェクトのクラスＩＤ及びオブジェクトのサイズを含む。フィールドは、オブジェクトの利用者がアクセス可能な部分であり、例えばポインタと非ポインタの２種類のデータを有する。ポインタは、メモリ領域上のある場所を参照する値であり、多くの言語処理系では，オブジェクトへのポインタはオブジェクトの先頭アドレスを参照する。非ポインタは、プログラミングにおいて、値そのものを利用するものであり、数値、文字、及び／又は真偽値を包含する。そこで、上記プロファイル不要のマーク付けはオブジェクトのヘッダ内の１ビットをフラグとして使用してよい。
【００５６】
解除判定部２３０はまた、上記判定結果を、対応するクラス毎のプロファイル情報構造体又は対応する割り付け場所毎のプロファイル情報構造体に残す。より具体的には、解除判定部２３０は、アクセスされるオブジェクトのヘッダに埋め込まれたクラスＩＤをキーとして第２ハッシュ表を引き、対応するクラス毎のプロファイル情報構造体を取得する。そして解除判定部２３０は、プログラムの最適化に利用する性質を満たさないとの判定結果に対し、上記構造体の第２フィールドに格納された、最適化に利用する性質を有する割り付けられた全オブジェクトの全バイト数から、アクセスされるオブジェクトのバイト数を減算する。割り付け場所毎のプロファイル情報構造体の場合も同様にして処理を行う。但しこの場合、割り付け場所ＩＤは、対応するオブジェクト毎のプロファイル情報構造体の第１フィールドから取得する。
【００５７】
なお、上記処理において減算処理を行う場合、解除判定部２３０は、サンプリング頻度の更新の必要性を判定する。解除判定部２３０はまず、プロファイル情報格納部２２５に格納されるプロファイル情報に基づき、クラス又はオブジェクトの割り付け場所ごとに、プログラムの最適化に利用する性質を有するオブジェクトを割り付けられた割合を算出する。より具体的には、解除判定部２３０は、全クラス毎のサンプリング情報構造体の各々又は全割り付け場所毎のサンプリング情報構造体の各々について、第１フィールドに格納された割り付けられた全オブジェクトのバイト数に対する、第２フィールドに格納された最適化が用いる性質を満たす割り付けられたオブジェクトの全バイト数を求めることにより上記割合を算出する。
【００５８】
続いて解除判定部２３０は、クラス又はオブジェクトの割り付け場所ごとに求めた上記割合を、予め設定した所定の閾値と比較し、所定の閾値よりも算出した割合が小さいと判断したクラス又はオブジェクトの割り付け場所についてサンプリング頻度の更新が必要と判定する。所定の閾値は実験により求めることが出来るが、例えば１％などの数値を用いることができる。結果、サンプリング頻度の更新が必要と判定した場合、解除判定部２３０は、後述するサンプリング頻度更新部２３５を呼び出す。なお、解除判定部２３０は、上記一連の処理を、例えば実行プログラムの実行時においてなされるプロファイリングにおいて行う。
【００５９】
サンプリング頻度更新部２３５は、解除判定部２３０により呼び出されると、解除判定部２３０が所定の閾値よりも算出した割合が小さいと判断したクラス又はオブジェクトの割り付け場所についてのサンプリング頻度をサンプリング頻度格納部２４０から読み出し、読み出した値を小さくしてサンプリング頻度格納部２４０に書き戻す。ここでサンプリング頻度は、所定の値を引いたり、所定の値で割ったりして小さくしてよい。但し、頻度をゼロにしてしまうとプロファイルの正確性が落ちることから、予め所定の下限を設けるのが好ましい。例えば、初期値に１／８ＭＢ（８ＭＢ割り付ける毎に１回サンプリング）を設定し、頻度を下げる際には現在のサンプリング頻度を毎回２で割るよう設定し、下限値に１／５１２ＭＢ（５１２ＭＢ割り付ける毎に１回サンプリング）を設定してよい。サンプリング頻度格納部２４０に格納される更新されたサンプリング頻度は、次回のサンプリングにおいてマーク設定部２０２がプロファイル対象を決定する際に参照される。なお、サンプリング頻度更新部２３５は、上記サンプリング頻度更新処理を、例えば実行プログラムの実行時においてなされるプロファイリングにおいて行う。
【００６０】
解除部２４５は、プログラムの実行中に開始されたガーベジコレクションにおいて不使用オブジェクトを検出するために全てのポインタをスキャンする際に、オブジェクトにプロファイル不要のマークが設定されているか否かを判定する。そして解除部２４５は、オブジェクトにプロファイル不要のマークが設定されていると判定することを条件に、上記オブジェクトを指すポインタに付されたプロファイル対象のマークを外す。
【００６１】
上記解除処理をプログラムの実行時においてなされるガーベジコレクションにおいて行うのは次の理由による。即ち、あるオブジェクトをプロファイル対象から外すためには該オブジェクトを指す全てのポインタのプロファイル対象のマークを外す必要がある。そうしなければ、同一のオブジェクトを指す異なる二つのポインタ値が存在することになり、ポインタの比較が正しく動作しなくなるからである。しかしながら、当該方法には、プロファイル不要のマークが付されてから次回のガーベジコレクションまで、オブジェクトへのアクセスが無駄にプロファイルされてしまうという問題がある。そこで、本発明では即時解除部２５０を設け、上記問題の改善を図った。
【００６２】
即時解除部２５０は、プロファイラ１２０又はシグナルハンドラの呼び出しに応答して、即ち、プロファイル対象に設定されたオブジェクトへのアクセスを検出することに応答して、該オブジェクトにプロファイル不要のマークが付されているか否かを判定する。続いて即時解除部２５０は、オブジェクトにプロファイル不要のマークが付されていると判定することを条件に、アクセスされる上記オブジェクトを指すポインタを格納するベースレジスタの値が、該アクセス以降に比較命令のオペランドとして用いられるか否かを判定する。そして即時解除部２５０は、ベースレジスタの値が比較命令のオペランドとして用いられないと判定することを条件に、上記オブジェクトを指すポインタからプロファイル対象のマークを外してベースレジスタに書き戻す。即時解除部２５０は、上記即時解除処理を、例えば実行対象プログラムの実行時においてなされるプロファイリングにおいて行う。
【００６３】
ここで、オブジェクトにプロファイル不要のマークが付されている場合に、該オブジェクトを指すポインタに付されたプロファイル対象のマークの取り外しを、該ポインタを格納するベースレジスタの値が上記検出したアクセス以降に比較命令のオペランドとして用いられないことを条件として行うのは次の理由による。上述したように、あるオブジェクトをプロファイル対象から外すためには、該オブジェクトを指す全てのポインタのプロファイル対象のマークを外すことによって、同一のオブジェクトを指す異なる二つのポインタ値が存在することに起因するポインタ比較動作の不具合が生じないようにする必要がある。しかしながら、プロファイル対象のマークを外そうとするポインタが、ポインタの比較命令に用いられることがなければ、該ポインタについてプロファイル対象のマークを外したとしても上記不具合は生じない。そして結果として、少なくともプロファイル対象のマークを外したポインタを介したアクセスについては次回のガーベジコレクションまで無駄にプロファイルすることがないという利益が得られる。
【００６４】
なお、即時解除部２５０は、ベースレジスタの値が比較命令のオペランドとして用いられるか否かの上記判定を、アドレス表格納部２３０に格納されたアドレス表を用いて行う。即ち、即時解除部２５０は、アドレス表を検索して、プロファイル不要のマークが付されたオブジェクトへのアクセスを指示するアクセス命令のアドレスが登録されているか否かを判定する。アクセス命令のアドレスがアドレス表に登録されている場合、即時解除部２５０は、ベースレジスタの値が以降のプログラムの実行において比較命令のオペランドとして用いられないと判定する。
【００６５】
ここで図３Ａ、Ｂを参照して、上記解除判定部２３０と即時解除部２５０の機能を組み込んだプロファイラと組み込まないプロファイルとで同じプログラムを実行しても一定の条件が満たされた場合にはプロファイリング回数が異なることを説明する。
【００６６】
図３Ａは、解除判定部２３０と即時解除部２５０の機能を持たないプロファイラを呼び出すプログラムの実行軌跡を示す。ブロック３００でレジスタｒ５にポインタobject_pointerが設定される。ここでポインタobject_pointerには、プロファイル対象のマークが付されているものとする。続いて処理はブロック３０２へ進み、if文によりレジスタｒ５に設定されたポインタがプロファイル対象のマーク付きポインタであるか否かが判定される。ポインタにはプロファイル対象のマークが付されているため、判定結果は真となり、プロファイラが呼び出されてプロファイリング処理３０６が実行される。
【００６７】
図３Ａに示すプロファイリング処理３０６は、１．レジスタｒ５に設定されたポインタが指す先のオブジェクトへアクセスする処理、２．アクセスしたオブジェクトのプロファイル情報を更新する処理、３．現在のアクセス命令の直後に戻る処理を含む。従って、ブロック３０２におけるアクセス命令「r5.field1への書き込み」に応じたプロファイラの呼び出しでは、レジスタｒ５に設定されたポインタが指すオブジェクトのプロファイル情報が、該オブジェクトのfield1への書き込みに基づいて更新される。そして処理は、アクセス命令「r5.field1への書き込み」の直後の「done_Label_1」へ戻る。
【００６８】
続いて処理はブロック３０４へ進み、再びif文によりレジスタｒ５に設定されたポインタがプロファイル対象のマーク付きポインタであるか否かが判定される。レジスタｒ５の値は更新されていないため、今回も判定結果は真となり、プロファイラが呼び出されてプロファイリング処理３０６が実行される。ブロック３０４におけるアクセス命令「r5.field2から読み込み」に応じたプロファイラの呼び出しでは、レジスタｒ５に設定されたポインタが指すオブジェクトのプロファイル情報が、該オブジェクトのfield2からの読み込みに基づいて更新される。そして処理は、アクセス命令「r5.field2から読み込み」の直後の「done_Label_2」へ戻る。
【００６９】
以上のように、解除判定部２３０と即時解除部２５０の機能を有しないプロファイラの下では、ポインタは一度プロファイル対象のマークを付されると少なくとも次回のガーベジコレクションまで該マークを外されることはない。そのため、図３Ａに示す例では、ブロック３０２とブロック３０４におけるレジスタｒ５を介したオブジェクトへのアクセスのいずれについてもプロファイラが呼び出され、プロファイリング処理３０６が実行される（実行軌跡を示す矢印３０８を参照）。
【００７０】
図３Ｂは、解除判定部２３０と即時解除部２５０の機能を組み込んだプロファイラを呼び出すプログラムの実行軌跡を示す。なお、図３Ｂに示すプログラム（ブロック３００〜ブロック３０４を含む）は、図３Ａに示すプログラム（ブロック３００〜ブロック３０４を含む）と同一のものであることに留意されたい。まず、ブロック３００でレジスタｒ５に、プロファイル対象のマークが付されたポインタobject_pointerが設定される。続いて処理はブロック３０２へ進み、if文によりレジスタｒ５に設定されたポインタがプロファイル対象のマーク付きポインタであるか否かが判定される。レジスタｒ５に設定されたポインタにはプロファイル対象のマークが付されているため、判定結果は真となり、プロファイラが呼び出されてプロファイリング処理３１０が実行される。
【００７１】
図３Ｂに示すプロファイリング処理３１０は、１．レジスタｒ５に設定されたポインタが指す先のオブジェクトへアクセスする処理、２．オブジェクトにプロファイル不要のマークが付されているか否かを判定する処理、２−１．プロファイル不要のマークがオブジェクトに付されている場合に、現在のオブジェクトへのアクセスを指示するアクセス命令のアドレスをアドレス表で引く処理、２−２、アドレス表にヒットしたか否かを判定して、ヒットした場合にレジスタｒ５に入っているポインタを取り出してプロファイル対象のマークを外し、レジスタｒ５に書き戻す処理、２−３．プロファイル不要のマークがオブジェクトに付されていない場合に、オブジェクトのプロファイルを更新する処理、２−４．オブジェクトが最適化に利用する性質を満たさなくなっている場合に、オブジェクトにプロファイル不要のマークを付す処理を含む。なお、上記２−４の処理が、解除判定部２３０の機能に対応し、上記２、２−１、及び２−２の処理が、即時解除部２５０の機能に対応している。
【００７２】
従って、ブロック３０２におけるアクセス命令「r5.field1への書き込み」に応じたプロファイラの呼び出しでは、レジスタｒ５に設定されたポインタが指すオブジェクトにプロファイル不要のマークが付されているか否かが判定される。ここでは、オブジェクトにはプロファイル不要のマークが付されており、かつ、アクセス命令「r5.field1への書き込み」のアドレスがアドレス表に登録され、アクセス命令「r5.field1への書き込み」以降の処理において、レジスタｒ５の値がポインタ比較命令のオペランドとして用いられないことが保証されているものとする。すると、プロファイリング処理３１０において、プロファイル対象のマークが外されたポインタがレジスタｒ５に書き戻され、処理は、アクセス命令「r5.field1への書き込み」の直後の「done_Label_1」へ戻る。
【００７３】
続いて処理はブロック３０４へ進み、再びif文によりレジスタｒ５に設定されたポインタがプロファイル対象のマーク付きポインタであるか否かが判定される。上述したようにプロファイリング処理３１０においてポインタはプロファイル対象のマークを外されているため、今度は判定結果は偽となり、プロファイラは呼び出されることなく、アクセス命令「r5.field2から読み込み」が実行される。
【００７４】
以上のように、解除判定部２３０と即時解除部２５０の機能を組み込んだプロファイラの下では、ポインタは一度プロファイル対象のマークを付されても、その後ポインタが指すオブジェクトが最適化に利用する性質を有しなくなり、かつ、該ポインタを格納するレジスタの値が以降の処理においてポインタ比較命令に用いられることがないことが確認されると、上記プロファイル対象のマークは外される。そのため、図３Ｂに示す例では、上記条件が満たされた後のブロック３０４におけるレジスタｒ５を介したオブジェクトへのアクセスに対しては、プロファイラが呼び出されることがないことが示されており、これによってプロファイリング処理３１０が無駄に実行されることはない（実行軌跡を示す矢印３１２を参照）というメリットが得られている。
【００７５】
図２に戻って、コード書き換え部２５５は、プロファイル対象であることを示すマークを付されたポインタを介してオブジェクトへのアクセスがあるとプロファイラが呼び出されるように、プロファイラの呼び出しを設定する。上述したように、コード書き換え部２５５は上記プロファイラの呼び出しの設定をコードの書き換えによって行う。より具体的には、コード書き換え部２５５は、実行対象のプログラムに含まれる全てのポインタ経由のオブジェクトへのアクセス命令の前に、プロファイル対象であることを示すマークの有無を判定するコードと、マークが付されているとの判定結果に対してプロファイラを呼び出すコードとを挿入する（図３Ｂのブロック３０２の１行目のif文と２行目のジャンプ命令gotoを参照）。なお、コード書き換え部２５５は、上記コード書き換え処理を、例えば実行対象プログラムである中間コードの部分の動的コンパイル処理において行う。
【００７６】
次に図４乃至図７Ａ、Ｂを参照して、プロファイル対象決定装置２００の動作を説明する。図４は、本実施形態に係るプロファイル対象決定装置２００の動作フローの一例を示す。図５は、図４に示すステップ４１０のメモリ管理部１３０による処理の詳細な動作フローの一例を示す。図６は、図４に示すステップ４２０のプロファイラ１２０による処理の詳細な動作フローの一例を示す。図７Ａは、図４に示すステップ４２４の動的コンパイラ１２５による処理（手続き間解析及びエイリアス解析を利用するケース）の詳細な動作フローの一例を示す。図７Ｂは、図４に示すステップ４２４の動的コンパイラ１２５による処理（手続き間解析及びエイリアス解析を利用しないケース）の詳細な動作フローの一例を示す。
【００７７】
図４に示すプロファイル対象決定装置２００の動作フローはステップ４００から開始し、実行部１１５は、クラス又はオブジェクトの割り付け場所ごとのサンプリング頻度を同じ所定の値で初期化する。続いて実行部１１５は、メモリ管理部１３０を呼び出して、プロファイラ１２０の呼び出しのためのページ保護機構を設定させる（ステップ４０２）。続いて実行部１１５は、実行対象プログラム（中間コード）の実行を開始して、次に実行しようとする命令を読み出す。
【００７８】
続いて実行部１１５は、実行しようとする現在の命令がオブジェクトを割り付けるか否かを判定する（ステップ４０６）。現在の命令がオブジェクトを割り付けると判定した場合（ステップ４０６：ＹＥＳ）、実行部１１５はガーベジコレクションが必要であるか否かを判定する（ステップ４０８）。ガーベジコレクションが必要であると判定した場合（ステップ４０８：ＹＥＳ）、実行部１１５は、メモリ管理部１３０を呼び出して処理を実行させる。メモリ管理部１３０による処理の詳細は、図５を参照して後述する。
【００７９】
メモリ管理部１３０による処理の後、続いて実行部１１５はサンプリング頻度格納部２４０に格納されたクラス又はオブジェクトの割り付け場所ごとのサンプリング頻度に基づき、現在の命令によって割り付けたオブジェクトをサンプリングするか否か、即ちプロファイル対象とするか否かを判定する（ステップ４１２、４１４）。プロファイル対象とすると判定した場合（ステップ４１４：ＹＥＳ）、実行部１１５は、割り付けたオブジェクトを指すポインタにサンプリング対象であることを示すマークを設定し（ステップ４１６）、割り付けたオブジェクトに対応する所定のデータ構造のプロファイル情報を生成し、初期化し、プロファイル情報格納部２２５に格納する（ステップ４１７）。なお、所定のデータ構造のプロファイル情報とは、上述したオブジェクト毎のプロファイル情報構造体と、該当する場合は、対応するクラス毎のプロファイル情報構造体／割り付け場所毎のプロファイル情報構造体である。なお、後者のプロファイル情報構造体は該当する場合にのみ生成されるが、対応するクラス毎のプロファイル情報構造体／対応する割り付け場所毎のプロファイル情報構造体の弟１及び弟２フィールドに割り付けたオブジェクトのバイト数を加算する処理は、対応するオブジェクト毎のプロファイル情報構造体の生成、初期化の際に常になされることに留意されたい。
【００８０】
ステップ４１７の後、ステップ４０６において現在の命令がオブジェクトを割り付けないと判定された場合（ステップ４０６：ＮＯ）、又はステップ４１４においてプロファイル対象としないと判定された場合（ステップ４１４：ＮＯ）、処理はステップ４１８へ進み、実行部１１５は、現在の命令はサンプリングされた、即ちプロファイル対象のオブジェクトへのアクセス命令であるか否かを判定する。プロファイル対象のオブジェクトへのアクセス命令であると判定した場合（ステップ４１８：ＹＥＳ）、実行部はプロファイラ１２０を呼び出して処理を実行させる（ステップ４２０）。プロファイラ１２０による処理の詳細は、図６を参照して後述する。
【００８１】
ステップ４２０の後、又はステップ４１８において現在の命令がプロファイル対象のオブジェクトへのアクセス命令ではないと判定された場合（ステップ４１８：ＮＯ）、処理はステップ４２２へ進み、実行部１１５は、次に実行する中間コードの部分を動的にコンパイルする必要があるか否かを判定する。動的コンパイルが必要であると判定した場合（ステップ４２２：ＹＥＳ）、実行部は動的コンパイラ１２５を呼び出して処理を実行させる（ステップ４２４）。動的コンパイラ１２５による処理の詳細は、図７Ａ、Ｂを参照して後述する。
【００８２】
ステップ４２４の後、又はステップ４２２において動的コンパイルが必要でないと判定された場合（ステップ４２２：ＮＯ）、処理はステップ４２６へ進み、実行部１１５は、実行対象プログラムの実行が終了したか否かを判定する。実行対象プログラムの実行がまだ終了していない場合（ステップ４２６：ＮＯ）、処理はステップ４０４へ戻る。一方、プログラムの実行が終了した場合（ステップ４２６：ＹＥＳ）、プロファイル対象決定装置２００の動作フローは終了する。
【００８３】
図５に示すメモリ管理部１３０による処理の動作フローはステップ５００から開始し、メモリ管理部１３０は、ヒープ領域に生成されている未だ使用中の全オブジェクトを検出するために、オブジェクト間のポインタによる参照関係を示すツリー構造をスキャンし、使用中のオブジェクトを指す全ポインタについて以下の一連の処理を繰り返す。メモリ管理部１３０はまず、現在のポインタが指すオブジェクトにプロファイル不要のマークが付されているか否かを判定する（ステップ５０２）。プロフィル不要のマークが付されている場合（ステップ５０２：ＹＥＳ）、メモリ管理部１３０は、現在のポインタからプロファイル対象のマークを外す（ステップ５０４）。
【００８４】
一方、ステップ５０２においてプロファイル不要のマークが付されてない場合（ステップ５０２：ＮＯ）、又はステップ５０４から処理はステップ５０６へ進み、メモリ管理部１３０は、現在のポインタに対して、通常のガーベジコレクション処理を実行する。一例としてメモリ管理部１３０は、現在のポインタが指すオブジェクトに対応するマーク記憶領域にマークを付ける（マーク＆スイープ法）。通常のガーベジコレクション処理のアルゴリズムは周知の技術であり、本発明の要旨ではないので、これ以上の詳細な説明は省略する。
【００８５】
使用中のオブジェクトを指す全ポインタについて上記一連の処理が行われると、続いてメモリ管理部１３０は、全不使用のオブジェクトについて、プロファイル情報格納部２２５に格納された対応するオブジェクト毎のプロファイル情報構造体を破棄する。そして処理は終了する。
【００８６】
図６に示すプロファイラ１２０による処理の動作フローはステップ６００から開始し、プロファイラ１２０は、プロファイラ１２０呼び出しの要因となった現在のオブジェクト・アクセス命令におけるオブジェクトをアクセスする。続いてプロファイラ１２０は、アクセスしたオブジェクトにプロファイル不要のマークが付されているか否かを判定する（ステップ６０２）。
【００８７】
プロファイル不要のマークが付されている場合（ステップ６０２：ＹＥＳ）、続いてプロファイラ１２０は、アドレス表格納部２３０に格納されているアドレス表を検索して（ステプ６０４）、現在のオブジェクト・アクセス命令のアドレスと一致するアドレスが記録されているか否かを判定する（ステップ６０６）。一致するアドレスが記録されている場合（ステップ６０６：ＹＥＳ）、プロファイラ１２０は、現在のオブジェクト・アクセス命令に用いられる現在のポインタを格納したベースレジスタにアクセスして現在のポインタからプロファイル対象のマークを外し、プロファイル対象のマークのないポインタを上記ベースレジスタに書き戻す（ステップ６０８）。
【００８８】
一方、プロファイル不要のマークが付されていない場合（ステップ６０２：ＮＯ）、プロファイラ１２０は、現在のオブジェクト・アクセス命令によりアクセスされるオブジェクトについてプロファイル情報を収集し、プロファイル情報格納部２２５に格納される対応するプロファイル情報を更新する（ステップ６１０）。続いてプロファイラ１２０は、現在のオブジェクト・アクセス命令によるオブジェクトへのアクセスが、該オブジェクトが実行対象プログラムの最適化に利用する性質を満たなくなったと判断するための所定の条件を満たすか否かを判定する（ステップ６１２）。所定の条件が満たされると判定した場合（ステップ６１２：ＹＥＳ）、プロファイラ１２０は、現在のオブジェクト・アクセス命令によりアクセスされるオブジェクトにプロファイル不要のマークを付ける（ステップ６１４）。
【００８９】
ステップ６１４から処理はステップ６１６へ進み、プロファイラ１２０は、プロファイル情報格納部２２５に格納されたプロファイル情報に基づいて、クラス又はオブジェクトの割り付け場所ごとのサンプリング頻度を算出し、算出したサンプリング頻度でサンプリング頻度格納部２４０に格納される情報を更新する。ステップ６１６若しくはステップ６０８の後、又はステップ６０６において一致するアドレスが記録されていない場合（ステップ６０６：ＮＯ）若しくはステップ６１２において所定の条件が満たされないと判定された場合（ステップ６１２：ＮＯ）、処理は終了する。
【００９０】
図７Ａに示す動的コンパイラ１２５による処理の動作フローはステップ７００から開始し、動的コンパイラ１２５は、次に実行しようとする実行対象プログラムのコード部分を最適化する。最適化の種類は複数存在し、それぞれのアルゴリズムは既知の技術であり本発明の要旨でもないので、ここでは詳細な説明を省略する。続いて動的コンパイラ１２５は、上記コード部分に含まれるオブジェクト・アクセス命令に用いられるポインタの値を格納する全ベースレジスタを検出し、検出した各ベースレジスタについてステップ７０２からステップ７１２までの一連の処理を繰り返す。
【００９１】
まず動的コンパイラ１２５は、現在のベースレジスタの値が、対応するオブジェクト・アクセス命令以降において、手続き呼び出しへの引数として利用されているか否かを判定する（ステップ７０２）。手続き呼び出しへの引数として利用されていると判定した場合（ステップ７０２：ＹＥＳ）、続いて動的コンパイラ１２５は、呼び出される先の手続きについて、ステップ７０２からステップ７１２までの一連の解析処理と同様の処理を行う。
【００９２】
ステップ７０２において手続き呼び出しへの引数として利用されていないと判定した場合（ステップ７０２：ＮＯ）、又はステップ７０４の後処理はステップ７０６へ進み、動的コンパイラ１２５は、現在のベースレジスタの値が、対応するオブジェクト・アクセス命令以降において、手続きの戻り値として利用されているか否かを判定する。手続きの戻り値として利用されていると判定した場合（ステップ７０６：ＹＥＳ）、続いて動的コンパイラ１２５は、呼び出し元の手続きについて、ステップ７０２からステップ７１２までの一連の解析処理と同様の処理を行う。
【００９３】
ステップ７０６において手続きの戻り値として利用されていないと判定した場合（ステップ７０６：ＮＯ）、又はステップ７０８の後処理はステップ７１０へ進み、動的コンパイラ１２５は、エイリアス解析の結果を利用して、現在のベースレジスタ又は該ベースレジスタの値がコピーされた値が、ポインタの比較命令のオペランドとして用いられるか否かを判定する。ポインタの比較命令のオペランドとして用いられないと判定した場合（ステップ７１０：ＮＯ）、続いて動的コンパイラ１２５は、現在のベースレジスタの値をポインタとして用いるオブジェクト・アクセス命令のアドレスをアドレス表格納部２１５に格納されているアドレス表に登録する（ステップ７１２）。一方、ステップ７１０においてポインタの比較命令のオペランドとして用いられると判定した場合（ステップ７１０：ＹＥＳ）、現在のベースレジスタについての上記一連の処理は終了する。
【００９４】
全ベースレジスタについてステップ７０２からステップ７１２の一連の処理が終了すると、続いて動的コンパイラ１２５は、コンパイル対象の上記コード部分に対し、プロファイラ１２０呼び出しのためのコードの書き換えを行う（ステップ７１４）。続いて、動的コンパイラ１２５は、コンパイル対象の上記コード部分をコンパイルし、ネイティブコードを生成する（ステップ７１６）。コンパイル処理のアルゴリズムは既知の技術であり、本発明の要旨ではないので詳細な説明は省略する。ステップ７１６の後処理は終了する。
【００９５】
なお、図７Ｂに示す、手続き間解析及びエイリアス解析を利用しないケースにおける動的コンパイラ１２５による処理の動作フローは、図７Ａに示す動作フローと次の点を除いて変わらないことから、説明を省略する。
・図７Ａに示す動作フローにおけるステップ７０４及びステップ７０８を含まない。
・図７Ａに示す動作フローにおけるステップ７１０に対応するステップ７５７では、エイリアス解析を利用せずに単にベースレジスタの値がポインタの比較命令のオペランドとして用いられるか否かを判定する。
・図７Ａに示す動作フローにおけるステップ７０２、７０６、７１０にそれぞれ対応するステップ７５２、７５４、７５７、及びステップ７５６として新たに追加したメモリに書き込まれるか否かの判定
のいずれか１つにでも該当すると、ベースレジスタの値がポインタの比較命令に用いられる可能性があると保守的に判定し、直ちに現在のベースレジスタについての一連の処理を終了する。
【００９６】
［実験］
１．実装
動作周波数最大４．７ＧＨｚのＲＩＳＣプロセッサ（クアッドコア、２スレッドのＳＭＴエンジン搭載のＰＯＷＥＲ６（商標））と３２ＧＢのメイン・メモリをハードウエアとして備え、オペレーティング・システムとしてＬｉｎｕｘ（商標）２．６．１８を用いるＩＢＭ社のＪａｖａ（登録商標）仮想マシンに、本発明の実施形態に係るプロファイル対象決定プログラムを実装した。なお、実装したプロファイル対象決定プログラムは、オブジェクトの不変性、書き込み専用性、及び非アクセス性に基づく３つの最適化を同時に行うためにそれぞれの最適化についてプロファイル対象を決定するプログラムである。また、ＳＰＥＣｊｖｍ２００８の中からオブジェクトを多く割り付ける６つのベンチマークプログラム（ｃｏｍｐｉｌｅｒ．ｃｏｍｐｉｌｅｒ、ｄｅｒｂｙ、ｓｅｒｉａｌ、Ｓｓｕｎｆｌｏｗ、ｘｍｌ．ｔｒａｎｓｆｏｒｍ、ｘｍｌ．ｖａｌｉｄａｔｉｏｎ）を選択した。
【００９７】
２．比較対象
実験は、以下に示す３つのサンプリング手法について行った。
１ＭＢ／ＮｏＯｐｔ（従来手法）：オブジェクトを１ＭＢ割り付ける毎に１つサンプリングする（サンプリング頻度は１種類かつ固定）。
６４ＭＢ／ＮｏＯｐｔ（従来手法）：オブジェクトを６４ＭＢ割り付ける毎に１つサンプリングする（サンプリング頻度は１種類かつ固定、サンプリング頻度を単純に下げる手法）。
１ＭＢ／Ｏｐｔ（本発明）：クラス／オブジェクト割り付け場所ごとの可変のサンプリング頻度に初期値として、オブジェクトを１ＭＢ割り付ける毎に１つサンプリングするサンプリング頻度を設定する。
【００９８】
３．評価基準
実験は、速度オーバーヘッドと、プロファイル精度の２つを評価基準として行った。速度オーバーヘッドについては、アクセス・プロファイルを全く取らない場合をベースラインとした。プロファイル精度については、オブジェクトの不変性に基づく最適化のためのプロファイリングを例に説明すると、次のような計算を行った。まず、オブジェクトの割り付け場所毎に、そこに割り付けられた全オブジェクトの合計バイト数に対する不変オブジェクトの合計バイト数の推定割合をプロファイル情報に基づいて算出する。それとは別に全オブジェクトの全アクセスをプロファイルすることで割り付け場所毎に真の割合を求める。推定割合と真の割合の差の絶対値（＝誤差）を各割付場所で割り付けられた全オブジェクトの合計バイト数で加重平均する。残りの２つの最適化についても同様にして求めた。
【００９９】
４．実験結果
図８は、速度オーバーヘッドについての実験結果を示す。また、図９Ａから図９Ｃは、順に、オブジェクトの不変性に基づく最適化のためのプロファイリングにおけるプロファイ精度、オブジェクトの書き込み専用性に基づく最適化のためのプロファイリングにおけるプロファイ精度、オブジェクトの非アクセス性に基づく最適化のためのプロファイリングにおけるプロファイル精度についての実験結果を示す。図８に示されるように、１ＭＢ／ＮｏＯｐｔ（従来手法）では、最大４０％以上の速度オーバーヘッドがあった。また、図９Ａから図９Ｃに示されるように、６４ＭＢ／ＮｏＯｐｔ（従来手法）では、プロファイル誤差が非常に大きかった。また、１ＭＢ／Ｏｐｔ（本発明）は、オブジェクトの非アクセス性に基づく最適化のためのプロファイリングにおけるプロファイル精度が最も高く、上記３つの最適化の中ではオブジェクトの非アクセス性に基づく最適化に対して最も効果を発揮することが分かった。
【０１００】
以上、実施形態を用いて本発明の説明をしたが、本発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更又は改良を加えることが可能であることが当業者に明らかである。従って、そのような変更又は改良を加えた形態も当然に本発明の技術的範囲に含まれる。
【０１０１】
なお、特許請求の範囲、明細書、及び図面中において示した装置、システム、プログラム、及び方法における動作、手順、ステップ、及び段階等の各処理の実行順序は、特段「より前に」、「先立って」等と明示しておらず、また、前の処理の出力を後の処理で用いるのでない限り任意の順序で実現しうることに留意すべきである。また、前の処理の出力を後の処理で用いる場合でも、前の処理と後の処理の間に他の処理が入ることは可能である場合があること、又は間に他の処理が入るように記載されていても前の処理を後の処理の直前に行うよう変更することも可能である場合があることも留意されたい。特許請求の範囲、明細書、及び図面中の動作フローに関して、便宜上「まず、」、「次に、」、「続いて、」等を用いて説明したとしても、この順で実施することが必須であることを必ずしも意味するとは限らない。
【図１Ａ】
0005719278.tif 000002
【図１Ｂ】
0005719278.tif 000003
【図２】
0005719278.tif 000004
【図３Ａ】
0005719278.tif 000005
【図３Ｂ】
0005719278.tif 000006
【図４】
0005719278.tif 000007
【図５】
0005719278.tif 000008
【図６】
0005719278.tif 000009
【図７Ａ】
0005719278.tif 000010
【図７Ｂ】
0005719278.tif 000011
【図８】
0005719278.tif 000012
【図９Ａ】
0005719278.tif 000013
【図９Ｂ】
0005719278.tif 000014
【図９Ｃ】
0005719278.tif 000015