(57)【要約】      （修正有）【課題】ハードウェア割り込みを用いるサンプリング・プロファイラの精度を改善する。【解決手段】プロファイル対象のプログラム実行中におけるハードウェア割り込みに応答して、割り込みハンドラを起動し、実行中のメソッドからの戻り先アドレスを保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換える（Ｓ５００）。割り込みハンドラによる処理が終わると、上記メソッドの実行を再開し、メソッドの終わりにおいて所定のプロファイル・コードを呼び出す（Ｓ５０２）。所定のプロファイル・コードが実行した後（Ｓ５０４）、保存しておいた戻り先アドレスへジャンプし、プロファイル対象のプログラムの実行を継続する。【選択図】図５
2015090647.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータの処理により、ハードウェア割り込みを用いるサンプリング・プロファイラの精度を改善するための方法であって、
（ａ）前記コンピュータが、前記ハードウェア割り込みに応答して、実行中のメソッドからの戻り先アドレスを保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換えるステップと、
（ｂ）前記コンピュータ（実行部）が、再開された前記メソッドの実行の終わりにおいて、前記所定のプロファイル・コードを実行するステップと、
（ｃ）前記コンピュータが、前記所定のプロファイル・コードの実行の終わりにおいて保存しておいた前記戻り先アドレスへジャンプするステップと、
を含む方法。
【請求項２】
ステップ（ａ）において、前記コンピュータは更に、前記ハードウェア割り込みの発生時点において実行中の命令のアドレスと、ステップ（ａ）において書き換えを行ったメモリアドレスとを保存する、請求項１に記載の方法。
【請求項３】
ステップ（ｂ）における前記所定のプロファイル・コードの実行は、前記コンピュータが所定のプロファイル処理を実行し、該所定のプロファイル処理の結果を前記ハードウェア割り込みの発生時点において実行中の前記命令のアドレスに関連付けるステップを含む、請求項２に記載の方法。
【請求項４】
前記コンピュータが実行するプログラムは、メソッドの先頭及びループのバックエッジにおいてyield pointを含む、請求項３に記載の方法。
【請求項５】
ステップ（ｂ）は、前記メソッドの実行を再開後、かつ前記所定のプロファイル・コードの実行前においてyield pointで実行が停止したことに応答して、前記コンピュータが、前記書き換えを行ったメモリアドレスを参照して前記戻り先アドレスを復帰し、ステップ（ａ）において保存されている情報を削除するステップを含む、請求項４に記載の方法。
【請求項６】
ステップ（ａ）は、前記コンピュータが、前記ハードウェア割り込みの発生時点における実行中の命令がコンパイル済みのコードであるか否かを判定するステップと、実行中の命令がコンパイル済みのコードではないと判定することに応答して、前記戻り先アドレスの保存及び書換えを行うことなく、次のyield pointで実行を止めることを示すyieldフラグをセットするステップを含む、請求項４に記載の方法。
【請求項７】
ステップ（ｂ）は、前記所定のプロファイル・コード実行の終わりにおいて、前記書き換えを行ったメモリアドレスを参照して前記戻り先アドレスを復帰し、ステップ（ａ）において保存されている情報を削除するステップを更に含み、ステップ（ａ）は、前記コンピュータが、前記ハードウェア割り込みに応答して、前記戻り先アドレスを退避させる前に、前回保存された情報が残っているか否かを判定し、前記前回保存された情報が残っていると判定することに応答して、前記戻り先アドレスを復帰し、前記前回保存された情報を削除するステップを含む、請求項４に記載の方法。
【請求項８】
ステップ（ａ）において、前記コンピュータは、前記戻り先アドレスを、レジスタに保存された現在のスタックポインタの情報と、前記実行中のメソッドのメタデータから取得できるオフセット情報とより算出される保存場所から取得する、請求項１に記載の方法。
【請求項９】
ステップ（ａ）において、前記コンピュータは、前記戻り先アドレスがスタックに保存されていない場合に、リンクレジスタから戻り先アドレスを取得する、請求項８に記載の方法。
【請求項１０】
前記コンピュータが実行するプログラムにおいてyield pointを含まないメソッドは、yield pointを含まないことを示す情報をそのメタデータに有し、前記コンピュータは、ステップ（ａ）〜ステップ（ｃ）の一連の処理を、yield pointを含まないメソッドに対してのみ実行する、請求項１に記載の方法。
【請求項１１】
コンピュータに、請求項１乃至１０のいずれか一項に記載の方法の各ステップを実行させるためのサンプリング・プロファイラの精度を改善するためのプログラム。
【請求項１２】
請求項１乃至１０のいずれかに一項に記載の方法の各ステップを実行するように適合された手段を備える、サンプリング・プロファイラの精度を改善するためのシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善のための技術に関し、より詳細には、プログラムに挿入されたyield pointに基づくプロファイラの精度を改善する技術に関する。
【背景技術】
【０００２】
最初に、Java（登録商標）Just-In-Time（以下、JITという）コンパイラについて説明する。 
【０００３】
Java（登録商標）とは、サン・マイクロシステムズ社（SunMicrosystems Inc.）によって開発されたオブジェクト指向のプログラミング言語である。Java（登録商標） プログラミング言語で記述されたプログラムは、Java（登録商標）バイトコードコンパイラによってバイトコード（byte code）と呼ばれる形式のプログラムに変換され、Java（登録商標）仮想計算機（virtual machine）(以下、JVMともいう）によって実行される。Java（登録商標）仮想計算機は、実際の計算機上で稼動するプログラムであり、計算機毎のプロセッサおよびオペレーティング・システムの違いを吸収して、単一のJava（登録商標） プログラミング言語による実行環境を異なる種類の計算機上で提供する。
【０００４】
バイトコード形式のプログラムは、JVMが稼動するいかなる計算機においても実行することができる。しかし、JVMはバイトコードを１命令ずつ解釈して実行するため、プログラムの実行が遅いという問題がある。この問題に対して、JVMはバイトコードの実行中に、バイトコード形式のプログラムを機械語命令形式のプログラムにコンパイルし、得られた機械語命令形式のプログラムを実際の計算機上で直接実行することでプログラムの実行速度を向上する。このように、バイトコードから機械語への変換をプログラムの実行時に行うコンパイラを、Java（登録商標）JITコンパイラと呼ぶ。この方式は、プログラムの実行中にJITコンパイルを行うため、プログラムの実行時間に加えてJITコンパイルの時間が必要になるが、機械語形式による実行が高速であるため、JVMのみによるバイトコードの実行より遥かに高速である。一般にJava（登録商標）JITコンパイラは、Java（登録商標）プログラミング言語における手続きであるメソッド（method） を単位として、Java（登録商標）プログラムがメソッドを呼び出す直前にJITコンパイルを行う。また、JITコンパイルにかかる時間を減らすため、JVMはプログラム中で頻繁に実行されるメソッドだけをJITコンパイルする。
【０００５】
そして、メソッドベースのJITコンパイラでは頻繁に実行されるメソッドを見つけるために、タイマーやパフォーマンスカウンタ等のハードウェア割り込みを用いるサンプリング・プロファイラが利用されている（例えば、特許文献１を参照）。ハードウェア割り込みを用いるサンプリングでは安全な位置で実行を停止させるために、メソッドの先頭、ループのバックエッジにyield point (async check point) が挿入される。そして実行時にタイマー割り込みが起きるとフラグが設定され、スレッドが次のyield pointに達したときに止まる必要があることが示される。なお停止した位置がメソッドの先頭に挿入されたyield pointである場合は、１段のスタックウォークを行ってメソッドの呼び出し元を特定し、呼び出し元にタイマーティック（timer tick）があたったとして実行時間がチャージされる。
【０００６】
ところで上述したyield pointに基づくプロファイルでは、メソッドの呼び出しとループを含まないメソッドについては、どれだけ実行時間を使っても、サンプリングがあたらないという問題がある。そのため、サンプリングが全く当たらないということがないように、メソッドを抜けるすべてのリターン(return)にyield pointを挿入することが考えられる。しかしながら、すべてのリターンにyield pointを入れるとなると、プロファイルの精度を上げことは可能となるが、コードサイズの増加や、ハードウェア割り込みの有無に関係なく条件分岐が入ってしまうことによる性能の低下が起こる問題がある。
【０００７】
なお、以下に示す先行技術文献のリストにおいて、特許文献２、３は本発明の先行技術調査でみつかった文献である。
【０００８】
特許文献２は、プリエンプション処理を要求してきた緊急性の高い緊急プロセスがある場合には、当該緊急プロセスを即座に実行することを課題とし、緊急プロセスにプリエンプション要求情報が設定され、且つ、現在周期起床プロセスの実行中である場合には、割り込みにより実行を中断された周期起床プロセスへのリターンアドレスを上記スタックへ退避させ、リターンアドレスとして上記プリエンプション要求情報が設定された緊急プロセスのアドレスを設定すると共に、上記プリエンプション要求情報が設定された緊急プロセスの最後に上記スタックに格納されたリターンアドレスを獲得してリターンする命令を記述し、当該プリエンプション要求情報が設定された緊急プロセスを実行した後、上記スタックに退避させたリターンアドレスに基づいて上記実行を中断された周期起床プロセスを実行させる技術を開示する。しかしながら特許文献２の技術では、割り込みがかかった直後に緊急プロセスが実行されるので、安全な位置で停止させて実行する必要のあるプロファイルに特許文献２に記載の技術を適用することはできない。
【０００９】
特許文献３は、動作中である分析対象プログラムに影響を及ぼさずに分析対象プログラムの実行を追跡してデバギングするか、プロファイリングすることができるプログラムの動的分析方法及びその装置を提供することを目的とし、関数を構成する命令語は、例外命令語に取り替えられる前にあらかじめ保存されて、例外命令語が実行された後には、保存された元の命令語を復旧して実行することによって、関数の実行に影響を及ぼさないようにする技術を開示する。しかしながら特許文献３の技術では、静的に決まる特定のメソッドのリターンに処理を追加するため、すべてのリターンにyield pointを入れるのと何ら変わりなく、yield pointに基づくプロファイラに特許文献３の技術を適用したとしても、コードサイズの増加の問題が生ずるだけである。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】米国特許第６９７１０９１号明細書
【特許文献２】特開平１０−１４３３７８号公報
【特許文献３】特開２０１０−２３８２２８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
この発明は、上記の問題点を解決するためになされたものであって、ハードウェア割り込みを用いるサンプリング・プロファイラにおいて、yield pointを挿入することによる性能の低下を防ぎつつ、安全な位置でサンプリングが行われるようにすることのできる技術を提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記課題を解決するために、本発明の１態様によれば、以下のようなコンピュータの処理により、ハードウェア割り込みを用いるサンプリング・プロファイラの精度を改善するための方法が提供される。この精度改善方法は、（ａ）前記コンピュータが、前記ハードウェア割り込みに応答して、実行中のメソッドからの戻り先アドレスを保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換えるステップと、（ｂ）前記コンピュータが、再開された前記メソッドの実行の終わりにおいて、前記所定のプロファイル・コードを実行するステップと、（ｃ）前記コンピュータが、前記所定のプロファイル・コードの実行の終わりにおいて保存しておいた前記戻り先アドレスへジャンプするステップとを含む。
【００１３】
好ましくは、ステップ（ａ）において、前記コンピュータは更に、前記ハードウェア割り込みの発生時点において実行中の命令のアドレスと、ステップ（ａ）において書き換えを行ったメモリアドレスとを保存する。
【００１４】
より好ましくは、ステップ（ｂ）における前記所定のプロファイル・コードの実行は、前記コンピュータが所定のプロファイル処理を実行し、該所定のプロファイル処理の結果を前記ハードウェア割り込みの発生時点において実行中の前記命令のアドレスに関連付けるステップを含む。
【００１５】
更に好ましくは、前記コンピュータが実行するプログラムは、メソッドの先頭及びループのバックエッジにおいてyield pointを含む。
【００１６】
そして好ましくは、ステップ（ｂ）は、前記メソッドの実行を再開後、かつ前記所定のプロファイル・コードの実行前においてyield pointで実行が停止したことに応答して、前記コンピュータが、前記書き換えを行ったメモリアドレスを参照して前記戻り先アドレスを復帰し、ステップ（ａ）において保存されている情報を削除するステップを含む。
【００１７】
また好ましくは、ステップ（ａ）は、前記コンピュータが、前記ハードウェア割り込みの発生時点における実行中の命令がコンパイル済みのコードであるか否かを判定するステップと、実行中の命令がコンパイル済みのコードではないと判定することに応答して、前記戻り先アドレスの保存及び書換えを行うことなく、次のyield pointで実行を止めることを示すyieldフラグをセットするステップを含む。
【００１８】
また好ましくは、ステップ（ｃ）は、前記所定のプロファイル・コード実行の終わりにおいて、前記書き換えを行ったメモリアドレスを参照して前記戻り先アドレスを復帰し、ステップ（ａ）において保存されている情報を削除するステップを更に含み、ステップ（ａ）は、前記コンピュータが、前記ハードウェア割り込みに応答して、前記戻り先アドレスを退避させる前に、前回保存された情報が残っているか否かを判定し、前記前回保存された情報が残っていると判定することに応答して、前記戻り先アドレスを復帰し、前記前回保存された情報を削除するステップを含む。
【００１９】
また好ましくは上記ステップ（ａ）において、前記コンピュータは、前記戻り先アドレスを、レジスタに保存された現在のスタックポインタの情報と、前記実行中のメソッドのメタデータから取得できるオフセット情報とより算出される保存場所から取得する。
【００２０】
また好ましくは、ステップ（ａ）において、前記コンピュータは、前記戻り先アドレスがスタックに保存されていない場合に、リンクレジスタから戻り先アドレスを取得する。
【００２１】
また好ましくは、前記コンピュータが実行するプログラムにおいてyield pointを含まないメソッドは、yield pointを含まないことを示す情報をそのメタデータに有し、前記コンピュータは、ステップ（ａ）〜ステップ（ｃ）の一連の処理を、yield pointを含まないメソッドに対してのみ実行する。
【００２２】
以上、ハードウェア割り込みを用いるサンプリング・プロファイラの精度改善方法として本発明を説明したが、本発明は、上記説明したサンプリング・プロファイラの精度改善方法の各ステップをコンピュータに実行させるためのサンプリング・プロファイラの精度改善プログラムとして把握することもできる。また、そのようなサンプリング・プロファイラの精度改善プログラムを、１以上のコンピュータにインストールすることにより実現されるサンプリング・プロファイラの精度改善システムとして把握することもできる。
【発明の効果】
【００２３】
本発明によれば、ハードウェア割り込みに応答して、動的に実行中のメソッドからの戻り先アドレスが所定のプロファイル・コードのアドレスに書き換えられ、その後メソッドの実行が再開され、その処理の終わりにおいて所定のプロファイル・コードが実行されるので、yield pointを挿入する必要なしに、安全な位置で実行を停止してプロファイルすることが可能となる。また、ハードウェア割り込みが起こった場合にのみそのような書換えを行うので、サンプリングの必要がなくなりハードウェア割り込みを止めた際のパフォーマンス劣化も防ぐことが可能となる。本発明のその他の効果については、各実施の形態の記載から理解される。
【図面の簡単な説明】
【００２４】
【図１】本発明の実施の形態に係る精度改善システムを実現するのに好適なコンピュータ・システム１００のハードウェア構成の一例を示した図である。
【図２】図１に示すコンピュータ・システム１００のソフトウェアの構成の一例を示す図である。
【図３】図３（ａ）及び（ｂ）は、yield pointの入れ方によるプロファイルの精度の変化を示した図である。
【図４】図４（ａ）及び（ｂ）は、yield pointの入れ方によるオーバーヘッドを示したグラフである。
【図５】本発明の実施の形態に係る精度改善処理全体の流れの一例を示すフローチャートである。
【図６】図５に示すフローチャートのステップ５０４の処理の詳細な流れを示すフローチャートである。
【図７】プロファイラによる処理の概要を示すフローチャートである。
【発明を実施するための形態】
【００２５】
以下、本発明を実施するための形態を図面に基づいて詳細に説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。なお、実施の形態の説明の全体を通じて同じ要素には同じ番号を付している。
【００２６】
図１は、本発明を実施するのに好適なコンピュータ・システム１００のハードウェア構成の一例を示す。コンピュータ・システム１００は、バス１０６に接続されたメインCPU（中央処理装置）１０２とメイン・メモリ１０４を含んでいる。CPU１０２は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i（商標）シリーズ、Core 2（商標）シリーズ、Atom（商標）シリーズ、Xeon（商標）シリーズ、Pentium（登録商標）シリーズ、Celeron（登録商標）シリーズ、AMD社のPhenom（商標）シリーズ、Athlon（商標）シリーズ、Turion（商標）シリーズ又はSempron（商標）が使用されうる。メイン・メモリ１０４は好ましくは、1GB以上の容量、より好ましくは、2GB以上の容量をもつものであってよい。
【００２７】
バス１０６には、ディスプレイ・コントローラ１０８を介して、ディスプレイ１１０、例えば液晶ディスプレイ（LCD）が接続されうる。ディスプレイ１１０は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。
【００２８】
バス１０６にはまた、SATA又はIDEコントローラ１１２を介して、ディスク１１４、例えばシリコン・ディスク又はハードディスクが接続されうる。バス１０６にはまた、SATA又はIDEコントローラ１１２を介して、任意的に、ドライブ１１６、例えばCD、DVDまたはBDドライブが接続されうる。バス１０６にはさらに、任意的に、キーボード・マウスコントローラ１１８又はUSBバス（図示せず）を介して、キーボード１２０及びマウス１２２が接続されうるが、本発明を実施する上では必要ない。    
【００２９】
ディスク１１４には、オペレーティング・システム、J2EEなどのJava（登録商標）処理環境、Java（登録商標）アプリケーション、Java（登録商標）仮想マシン（VM）を提供するプログラム、その他のプログラム及びデータが、メイン・メモリ１０４にロード可能なように記憶されている。
【００３０】
オペレーティング・システムは、例えば、LINUX（登録商標）、マイクロソフト・コーポレーションが提供するWindows（登録商標）オペレーティング・システム、アップル・コンピュータ・インコーポレイテッドが提供するMacOS（登録商標）若しくはiOS（登録商標）、X Window System備えるUNIX（登録商標）系システム（たとえば、インターナショナル・ビジネス・マシーンズ・コーポレーション（登録商標）が提供するAIX（登録商標）でありうる。
【００３１】
上記ディスク１１４には更に、オペレーティング・システムと協働してCPU１０２に命令を与え、本発明を実施するためのコンピュータ・プログラムを記録することができる。即ち、上記ディスク１１４には、コンピュータ・システム１００にインストールされ、コンピュータ・システム１００を本発明の実施形態によるサンプリング・プロファイラの精度改善システムとして機能させるサンプリング・プロファイラの精度改善生成プログラム、及びそれら関連データを記録することができる。なお、本発明に係るサンプリング・プロファイラの精度改善プログラムは、プロファイラ及びシグナルハンドラ若しくはハードウェア割り込みハンドラの機能として実装可能である。
【００３２】
上記コンピュータ・プログラムは圧縮し、また複数に分割して複数の媒体に記録することもできる。ドライブ１１６は、必要に応じて、CD-ROM、DVD-ROMまたはBDからプログラムをディスク１１４にインストールするために使用されうる。
【００３３】
通信インタフェース１２６は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース１２６は、通信コントローラ１２４を介してバス１０６に接続され、コンピュータ・システム１００を通信回線１２８に物理的に接続する役割を担い、コンピュータ・システム１００のオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線ＬＡＮ環境に基づくもの、又は、無線ＬＡＮ環境、例えば、IEEE802.11a/b/g/nなどのWi-Fi規格に基づくものであってもよい。
【００３４】
以上から、本発明の実施態様において使用されるコンピュータ・システム１００は、特定のオペレーティング・システム環境に限定されるものではないことを理解することができるであろう。なお、上記説明した構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００３５】
次に、図３を参照して、従来のyield pointに基づくプロファイルにおいて、yield pointの入れ方によってプロファイルの精度が変化することを説明する。
【００３６】
図３（ａ）は、プログラムに含まれるメソッドの先頭とループのバックエッジにyield pointを挿入するほか、ループとメソッドコールを含まないメソッドについてはバイトコードのサイズが300を超えるメソッドについてのみそのリターン位置にyield pointを入れた場合（以下、まとめて「標準のyield pointの入れ方」という）における、メソッドごとの最適化レベルとハードウェア割り込みの当たった割合とを示す図である。一方、図３（ｂ）は、同一のプログラムに対し、メソッドの先頭とループのバックエッジにyield pointを挿入するほか、ループとメソッドコールを含まない全てのメソッドのリターン位置にyield pointを入れた場合における、メソッドごとの最適化レベルとハードウェア割り込みの当たった割合とを示す図である。
【００３７】
図３（ａ）、（ｂ）において、最適化レベルの高さは、scorching＞very-hot＞hotである。図３（ａ）を見ると、標準のyield pointの入れ方では、メソッド３００、３０２、３０４の割り込みの当たった割合は、メソッド３０６のそれよりも高いにも関わらず、それらの最適化レベルはメソッド３０６の最適化レベルよりも低い。このことから、標準のyield pointの入れ方では、割り込みが多くあたってもyield pointがヒットしないメソッドが存在することになり、プロファイラの精度に問題があることが分かる。一方、図３（ｂ）を見ると、同じメソッド３００、３０２、３０４の最適化レベルはいずれも一番高いscorchingとなっている。このことから、ループとメソッドコールを含まない全てのメソッドのリターン位置にyield pointを入れることでプロファイラの精度があがることが分かる。
【００３８】
しかしながら上述したように、ループとメソッドコールを含まない全てのメソッドのリターン位置にyield pointを入れるとなると、コードサイズの増加や、ハードウェア割り込みの有無にかかわらず条件分岐が入ってしまうことによる性能の低下が起こる。図４（ａ）、（ｂ）はそれぞれ、ループとメソッドコールを含まない全てのメソッドのリターン位置にyield pointを入れた場合における実行性能の低下と、コンパイル済みコードサイズの増加とを示す。図４（ａ）、（ｂ）の横軸はいずれもDacapoベンチマークスイートの各プログラム名を示す。また、図４（ａ）の縦軸は、標準のyield pointの入れ方における実行性能を１とした相対的な実行性能を示す。同様に、図４（ｂ）の縦軸は、標準のyield pointの入れ方におけるコンパイル済みコードサイズを１とした相対的なコードサイズを示す。
【００３９】
そこで本発明者は、挿入するyield pointの数を増やすことなくプロファイラの精度をあげる手法について鋭意検討を行い、その結果、ハードウェア割り込みに応答して、実行中のメソッドの戻り先アドレスを所定のプロファイル・コードのアドレスに動的に書き換えることで、yield pointを挿入することなしに安全な位置においてプロファイルできることを見出し、本発明に至った。以下、図２、図５〜図７を参照して本発明を詳細に説明する。
【００４０】
図２は、図１に示すコンピュータ・システム１００のソフトウェアの構成の一例を示す図である。CPU１０２は、ディスク１１４からオペレーティング・システム、Java（登録商標）仮想マシン（VM）、本発明の実施形態によるサンプリング・プロファイラの精度改善プログラム、動的コンパイラをメイン・メモリ１０４に読み出し実行することにより、オペレーティング・システム２０８、仮想マシン２１４、プロファイラ２３２、及び動的コンパイラ２２６をメイン・メモリ１０４に展開する。CPU１０２はまたパフォーマンス監視部（performance monitoring unit: PMU）２０６を有する。なお、以下に説明する実施例では、サンプリングに利用するハードウェア割込をパフォーマンスカウンタとするが、これに限定されず、例えばハードウェア割込はタイマーであってもよい。
【００４１】
PMU２０６は、CPU１０２内部の挙動について指定されたイベントの発生を監視し、内部カウンタによりイベントの発生をカウントしたり、カウント値が閾値に達したときに指定された処理を行ったりする、最近のプロセッサが一般的に備えている機能である。監視対象の代表的なものとしては、CPU１０２の実行サイクル数、実行命令数、分岐予測ミス数、データキャッシュミス数などがある。本実施例においては頻繁に実行されるメソッドをサンプリングするためにPMU２０６の機能が利用される。
【００４２】
オペレーティング・システム２０８は、CPU１０２やメモリの管理など、コンピュータ・システム１００が有する基本的な機能を提供するソフトウェアである。オペレーティング・システム２０８はまた、実行された命令をサンプリングするために後述するプロファイラ２３２により用いられる割り込みハンドラ２１０を有する。なお、本実施例では割り込みハンドラ２１０を利用する場合について説明するが、以下に説明する割り込みハンドラ２１０の機能は、割込みハンドラ２１０からの通知を受けるシグナルハンドラの機能として実装してもよい。シグナルハンドラはユーザ空間のソフトウェアであるため実装が容易であるという利点がある。
【００４３】
割り込みハンドラ２１０は、PMU２０６によるハードウェア割り込みに応答して起動されると、ハードウェア割り込み時点で後述する実行部２１６により実行中であったメソッド（以下、単に「実行中のメソッド」ともいう）からの戻り先アドレスを取得して保存し、該戻り先アドレスを所定のプロファイル・コードのアドレスに書き換える。これにより、メソッドの呼び出しとループを含まないメソッドにハードウェア割り込みが当たった場合でも、そのメソッドのリターンにおいて、即ち安全な位置において所定のプロファイルが必ず実行されることになる。割り込みハンドラ２１０の処理が終わると、メソッドの実行が再開される。なお、本実施例では、プロファイル対象のプログラムには従来通りメソッドの先頭及びループのバックエッジにおいてyield pointが挿入されており、従来のyield pointに基づくプロファイルも行われるものとする。
【００４４】
割り込みハンドラ２１０はまた、PMU２０６によるハードウェア割り込みの発生時点において実行中の命令のアドレスと、書き換えを行ったメモリアドレスとを、上記実行中のメソッドからの戻り先アドレスと共にスレッドローカルなメモリ領域に保存する。これら情報は、後述するプロファイラ２３２によって使用され、かつ、使用後において上記メモリ領域から削除される。そのためメソッドのリターンにおいて所定のプロファイル・コードが実行される限り、次に割り込みハンドラ２１０が起動された際には上記スレッドローカルなメモリ領域には何も残っていないはずである。前回保存された情報が残っている場合、割り込みハンドラ２１０は最初に上記メモリアドレスを参照して戻り先アドレスを復帰させ、その後前回保存されたものの使用されなかった情報を削除する。
【００４５】
また、実行中のメソッドからの戻り先アドレスは次のように取得してよい。即ち、割り込みハンドラ２１０は、レジスタに保存された現在のスタックポインタの情報と、実行中のメソッドのメタデータから取得できるスタックポインタからのオフセット情報を取得し、戻り先アドレスの格納位置（スタック内の位置）を算出する。或いは、戻り先アドレスがスタックに保存されていない場合は、割り込みハンドラ２１０はリンクレジスタから戻り先アドレスを取得してよい。
【００４６】
なお、上述した戻り先アドレスの書き換えによる所定のプロファイル・コードの実行は、従来のyield pointに基づくプロファイルと重複して行うことは避けるべきであり、従って、メソッドの呼び出しとループを含まないメソッドに限定して行うのが好ましい。そこで、各メソッドのメタデータにyield pointの有無を示す1ビットの情報を用意し、割り込みハンドラ２１０は、該１ビットがyield pointが含まれないことを示す場合にのみ、戻り先アドレスの書換えを行うのが好ましい。なお上記１ビットは、例えばプロファイル対象のプログラムのコンパイル時において設定可能である。  
【００４７】
また、バイトコードからコンパイル済みコードに実行が戻る際にはyieldフラグのチェックがなされる。そしてyieldフラグが設定されている場合には後述するプロファイラ２３２が適切に呼び出される。このような状況では従来のyield pointに基づくプロファイルを優先させるのが好ましく、戻り先アドレスの書き換えによる不必要なプロファイル実行は避けるべきである。そこで、割り込みハンドラ２１０は、ハードウェア割り込みの発生時点において実行中の命令がコンパイル済みのコードであるか否かを判定し、実行中の命令がコンパイル済みのコードではないと判定した場合には、上述した戻り先アドレスの保存及び書換えを行うことなく、次のyield pointで実行を止めることを示すyieldフラグをセットするのが好ましい。なお、実行中の命令がコンパイル済みのコードであるか否かは、実行中の命令アドレスが、後述する仮想マシン２１４によって管理されるコード・キャッシュ２２４に保存されているか否かによって判定できる。
【００４８】
仮想マシン２１４は、バイトコードの低速実行（interpret）、およびコンパイル済みコードの実行を行うエミュレータである。仮想マシン２１４は、実行部２１６とディスパッチャ２２２とを含み、実行部２１６は、インタープリタ２１８と、コンパイル済みコード実行部２２０とを含んで構成される。
【００４９】
ディスパッチャ２２２は、後述する動的コンパイラ２２６が生成したコンパイル済みコードを保存するメモリ領域であるコード・キャッシュ２２４を参照して、次に実行するバイトコードアドレスから始まるコンパイル済みコードがコード・キャッシュ２２４に保存されている否かを判定する。インタープリタ２１８は、コンパイル済みコードが存在しない場合に、処理対象のバイトコードを低速に実行する。コンパイル済みコード実行部２２０は、コンパイル済みコードが存在する場合、コード・キャッシュ２２４からコンパイル済みコードを取得して実行する。
【００５０】
プロファイラ２３２は、任意のプロファイル処理を行い、次の２つの場合に呼び出される。１つは、従来のプロファイラ呼び出しであり、yield pointでプログラムが停止した際にyieldフラグがセットされている場合に呼び出される。また１つは、本発明による新しい呼び出しであり、メソッドのリターン位置において割り込みハンドラ２１０により書き換えがなされている場合に呼び出される。いずれの位置も安全な位置であるため、プロファイラ２３２はスタックウォークによりメソッドの呼び出し元など必要な情報を取得できる。もちろんプロファイラ２３２により取得されるプロファイル情報はこれに限定されず、例えば、value profilingとしてメソッドの戻り値などを取得することも可能である。なお、プロファイラ２３２によるプロファイル処理そのものは、本発明の要旨ではないため詳細な説明は省略する。
【００５１】
プロファイラ２３２はまた、メソッドのリターン位置において呼び出される場合、プロファイル処理の結果を、割り込みハンドラ２１０がスレッドローカルなメモリ領域に保存しておいた命令のアドレスに関連付けて格納する。プロファイラ２３２は更に、プロファイル処理の後、上記メモリ領域に保存されているメモリアドレスを参照して戻り先アドレスを復帰させ、その後、割り込みハンドラ２１０によってメモリ領域に保存されている情報を削除する。
【００５２】
なお、yield pointに基づいてプロファイラ２３２が呼び出される場合に、上記メモリ領域に戻り先アドレス等の情報が保存されている場合があり得る。これは、上述した割り込みハンドラ２１０の処理が終了してメソッドが再開された後、かつメソッドのリターン位置での所定のプロファイリング・コードの呼び出し前において、yield pointでプロファイル対象のプログラムの実行が停止することにより起こり得る。この場合、プロファイラ２３２は２度呼び出されることになり無駄が生ずる。そこで、yield pointに基づいてプロファイラ２３２が呼び出される場合においてメモリ領域に戻り先アドレス等の情報が保存されている場合には、戻り先アドレスを復帰させ、かつ、全ての情報を削除するものとする。
【００５３】
なお、プロファイラ２３２は、CPU１０２が上記所定のプロファイル・コードをメイン・メモリ１０４に読み出し実行することにより実現されることに留意されたい。
【００５４】
動的コンパイラ２２６は、プロファイラ２３２によるプロファイル結果に基づいて、プロファイル対象のプログラム内の次にコンパイル対象とすべきプログラム領域に対して最適化処理を施して実行時コンパイルを行うコンパイラである。動的コンパイラ２２６は、最適化部２２８と、コード生成部２３０とを含んで構成される。
【００５５】
最適化部２２８は、プロファイリング結果に基づき例えば実行頻度の高いプログラム領域に対してインライニング等の最適化処理を行う。コード生成部２３２は、最適化部２３０により出力された最適化済みのコードをネイティブコードに変換し、コード・キャッシュ２２４に格納する。
【００５６】
次に、図５〜７を参照して、本発明の実施形態に係るサンプリング・プロファイラの精度改善システムの動作について説明する。図５は、本発明の実施の形態に係る精度改善処理全体の流れの一例を示すフローチャートである。図６は、図５に示すフローチャートのステップ５０４の処理の詳細な流れを示すフローチャートである。図７は、プロファイラによる処理の概要を示すフローチャートである。
【００５７】
図５に示すフローチャートは、ハードウェア割り込みによって割り込みハンドラ２１０が起動されることにより開始し、ステップ５００において割り込みハンドラ２１０は、ハードウェア割り込み時点において実行部２１６により実行されていたメソッドからの戻り先アドレスを取得して、これを所定のプロファイル・コードのアドレスに書き換える。割り込みハンドラ２１０の処理の詳細は、図６を参照して後述する。
【００５８】
割り込みハンドラ２１０による処理が終わると、ハードウェア割り込みによって停止されていたメソッドの実行が実行部２１６により再開され、メソッドの実行の終わりにおいて所定のプロファイル・コードが呼び出される（ステップ５０２）。呼び出されたプロファイラ２３２は、所定のプロファイル処理を実行し、最後に、保存されていた戻り先アドレスへジャンプする（ステップ５０４）。プロファイラ２３２の処理の詳細は、図７を参照して後述する。そして処理は終了する。
【００５９】
図６に示すフローチャートはステップ６００で開始し、ハードウェア割り込みに応答して起動された割り込みハンドラ２１０は、ハードウェア割り込み時に実行部２１６により実行中であったメソッドが動的コンパイラ２２６によりコンパイルされたコンパイル済みのコードであるか否かを判定する。コンパイル済みのコードでない場合（ステップ６００：ＮＯ）、上述したように実行中のメソッドはyield pointに基づくプロファイルの対象となると予測されるので、割り込みハンドラ２１０はyieldフラグを設定し（ステップ６０２）、処理を終了する。
【００６０】
実行中のメソッドがコンパイル済みのコードである場合（ステップ６００：ＹＥＳ）、続いて割り込みハンドラ２１０は、実行中のメソッドがyield pointを含むか否かを判定する（ステップ６０４）。実行中のメソッドがyield pointを含む場合（ステップ６０４：ＹＥＳ）、実行中のメソッドはyield pointに基づくプロファイルの対象となるので、割り込みハンドラ２１０はyieldフラグを設定して（ステップ６０２）、処理を終了する。
【００６１】
実行中のメソッドがyield pointを含まない場合（ステップ６０４：ＮＯ）、続いて割り込みハンドラ２１０は、スレッドローカルなメモリ領域に前回保存された情報が残っているか否かを判定する（ステップ６０６）。前回保存された情報が残っている場合（ステップ６０６：ＹＥＳ）、割り込みハンドラ２１０は、書き換えを行ったメモリアドレスを参照して戻り先アドレスを復帰させ、その後保存された情報を削除する（ステップ６０８）。
【００６２】
前回保存された情報が残っていない場合（ステップ６０６：ＮＯ）又はステップ６０８から処理はステップ６１０へ進み、割り込みハンドラ２１０は、実行中のメソッドからの戻り先アドレスを取得してスレッドローカルなメモリ領域に保存する。続いて割り込みハンドラ２１０は、ハードウェア割り込み時に実行中の命令のアドレスと、書換えをおこなったメモリアドレスとを、上記メモリ領域に更に保存する（ステップ６１２）。そして処理は終了する。
【００６３】
図７に示すフローチャートはステップ７００で開始し、呼び出されたプロファイラ２３２は、呼び出された理由に関わらず所定のプロファイル処理を実行する。続いてプロファイラ２３２は、yieldフラグが設定されているか否かを判定する（ステップ７０２）。yieldフラグが設定されている場合（ステップ７０２：ＹＥＳ）、即ち、今回のプロファイラ２３２呼び出しがyield pointに基づく呼び出しである場合、続いてプロファイラ２３２は、上記メモリ領域に情報が保存されているか否かを判定する（ステップ７０４）。上記メモリ領域に情報が保存されている場合（ステップ７０４：ＹＥＳ）、重複して所定のプロファイル処理がなされないように、プロファイラ２３２は、書き換えられたメモリアドレスを参照して戻り先アドレスを復帰させ上記メモリ領域に保存されている情報を削除する（ステップ７０６）。その後処理は終了する。一方、上記メモリ領域に情報が保存されていない場合（ステップ７０４：ＮＯ）、そのまま処理は終了する。
【００６４】
一方、yield フラグが設定されていない場合（ステップ７０２：ＮＯ）、即ち、今回のプロファイラ２３２呼び出しが戻り先アドレスの書き換えに基づく呼び出しである場合、処理はステップ７０６へ進み、プロファイラ２３２は、書き換えられたメモリアドレスを参照して戻り先アドレスを復帰させ、上記メモリ領域に保存されている情報を削除した後、復帰された戻り先アドレスへジャンプする。そして処理は終了する。
【００６５】
以上、実施形態を用いて本発明の説明をしたが、本発明の技術範囲は上記実施形態に記載の範囲には限定されない。上記の実施形態に、種々の変更または改良を加えることが可能であることが当業者に明らかである。従って、そのような変更または改良を加えた形態も当然に本発明の技術的範囲に含まれる。
【図１】
2015090647.tif 000003
【図２】
2015090647.tif 000004
【図３】
2015090647.tif 000005
【図４】
2015090647.tif 000006
【図５】
2015090647.tif 000007
【図６】
2015090647.tif 000008
【図７】
2015090647.tif 000009