(57)【要約】【課題】Ｊａｖａプログラムの実行を高速化することを目的とする。【解決手段】Ｊａｖａプログラム実行方法は、Ｊａｖａ仮想マシンを起動する起動ステップと、Ｊａｖａプログラムのバイトコードよりホットスポットを検出するホットスポット検出ステップと、該検出したホットスポットが登録されたホットスポットと同一であるか否かを判定する判定ステップと、上記検出したホットスポットが登録されたホットスポットと同一である場合には上記検出したホットスポットのバイトコードをネイティブコードに変換する代わりに上記登録されたホットスポットのネイティブコードを読み出して実行する実行ステップと、を含む。【選択図】  図１
2004272384.tif 000002
【特許請求の範囲】
【請求項１】
Ｊａｖａ仮想マシンを起動する起動ステップと、Ｊａｖａプログラムのバイトコードよりホットスポットを検出するホットスポット検出ステップと、該検出したホットスポットが登録されたホットスポットと同一であるか否かを判定する判定ステップと、上記検出したホットスポットが登録されたホットスポットと同一である場合には上記検出したホットスポットのバイトコードをネイティブコードに変換する代わりに上記登録されたホットスポットのネイティブコードを読み出して実行する実行ステップと、を含むＪａｖａプログラム実行方法。
【請求項２】
請求項１記載のＪａｖａプログラム実行方法において、上記検出したホットスポットが登録されたホットスポットと同一でない場合には、上記検出したホットスポットのバイトコードをネイティブコードに変換し、該変換したネイティブコードをその識別子と共に登録することを特徴とするＪａｖａプログラム実行方法。
【請求項３】
請求項１記載のＪａｖａプログラム実行方法において、上記判定ステップは、上記検出したホットスポットの識別子を演算する識別子演算ステップと、該演算した識別子と上記登録されたホットスポットの識別子を照合し、両者の識別子が同一である場合に上記検出したホットスポットが上記登録されたホットスポットと同一であると判定する識別子検索ステップと、を含むことを特徴とするＪａｖａプログラム実行方法。
【請求項４】
請求項１記載のＪａｖａプログラム実行方法において、更に、上記Ｊａｖａプログラムが初めて起動されるものであるか否かを判定する起動歴判定ステップを有し、上記Ｊａｖａプログラムが初めて起動されるものであると判定された場合には上記Ｊａｖａプログラムの起動に伴う初期化処理の結果を保持する初期値格納ステップを実行することを特徴とするＪａｖａプログラム実行方法。
【請求項５】
請求項４記載のＪａｖａプログラム実行方法において、上記Ｊａｖａプログラムが初めて起動されるものでないと判定された場合には上記Ｊａｖａプログラムの初期化処理を実行する代わりに、保存されたＪａｖａプログラムの初期化処理の結果を利用する保存初期値利用ステップを実行することを特徴とするＪａｖａプログラム実行方法。
【請求項６】
請求項２又は３記載のＪａｖａプログラム実行方法において、上記識別子はハッシュ値であることを特徴とするＪａｖａプログラム実行方法。
【請求項７】
請求項１から５のいずれか１項に記載した方法を実行するためのコンピュータによって実行可能なプログラム。
【請求項８】
Ｊａｖａプログラムの起動に伴う初期化処理を実行する初期化処理部と、Ｊａｖａプログラムのバイトコードよりホットスポットを検出するホットスポット検出部と、該検出したホットスポットの識別子を演算する識別子演算部と、該演算した識別子と登録されているホットスポットの識別子を照合して上記検出したホットスポットが既に登録されているか否かを検索する識別子検索部とを有し、上記検出したホットスポットが既に登録されている場合には、上記検出したホットスポットのバイトコードをネイティブコードに変換する代わりに該登録されたホットスポットのネイティブコードを使用することを特徴とするＪａｖａプログラム実行装置。
【請求項９】
請求項８記載のＪａｖａプログラム実行装置において、更に、Ｊａｖａプログラムが初めて起動されるものであるか又は既に起動されたことがあるかを判定する起動歴判定部と、上記初期化処理部によって実行されたＪａｖａプログラムの起動に伴う初期化処理の結果を格納する初期値格納部と、を有し、上記起動歴判定部によってＪａｖａプログラムが初めて起動されるものであると判定されたとき、上記初期化処理部はＪａｖａプログラムの起動に伴う初期化処理の結果を上記初期値格納部に格納し、上記起動歴判定部によってＪａｖａプログラムが既に起動されたことがあると判定されたとき、上記初期化処理部はＪａｖａプログラムの起動に伴う初期化処理を実行する代わりに上記初期値格納部に格納された初期化処理の結果を利用することを特徴とするＪａｖａプログラム実行装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、Ｊａｖａ（登録商標）プログラムを実行する方法及び装置に関し、特に、Ｊａｖａプログラムの実行を高速化する技術に関する。
【０００２】
【従来の技術】
Ｊａｖａ言語はＷＷＷ（Ｗｏｒｌｄ    Ｗｉｄｅ    Ｗｅｂ）への適用を目的として１９９５年に開発されたオブジェクト指向言語であり、ＪａｖａプログラムはＪａｖａ言語によって記述されたプログラムである。ＪａｖａプログラムはＯＳ（Ｏｐｅｒａｔｉｎｇ    Ｓｙｓｔｅｍ）やハードウエア（プラットフォーム）に依存しないため、複数のコンピュータを接続したネットワークシステムにおける利用に便利である。
【０００３】
図４を参照して、Ｊａｖａプログラムの実行方法の概略を説明する。先ず、Ｊａｖａサーバ４１において、Ｊａｖａプログラムのソースコードは、バイトコードと称するＯＳやハードウエア（プラットフォーム）に依存しない中間形式の符号にコンパイル（一括変換）され、クラスファイルに格納される。
【０００４】
Ｊａｖａプログラムを実行するＪａｖａクライアント４２は「Ｊａｖａ仮想マシン」４３と呼ばれるソフトウエアを有する。Ｊａｖａクライアントは、Ｊａｖａプログラムの実行時に、「Ｊａｖａ仮想マシン」によって、バイトコードをＪａｖａクライアントにて実行可能な形式であるネイティブコードにインタープリット（一行毎の変換）しながら、実行する。
【０００５】
Ｊａｖａプログラムは「Ｊａｖａ仮想マシン」を使用するため、ＯＳやハードウエア（プラットフォーム）に依存しないで実行可能である長所を有するが、「Ｊａｖａ仮想マシン」によって、バイトコードをネイティブコードにインタープリットするため、実行速度が遅い欠点がある。Ｊａｖａプログラムの実行方法の高速化技術として、サンマイクロシステムズ社が開発したＨｏｔＳｐｏｔ（商品名）が知られている。
【０００６】
ＨｏｔＳｐｏｔは、バイトコードからネイティブコードにインタープリットするときに、動作のボトルネックとなる部分を識別し、それを最適化する技術である。本明細書では、動作のボトルネックとなる部分又はパフォーマンスクリティカルな部分をホットスポットと称し、最適化技術であるＨｏｔＳｐｏｔと区別する。
【０００７】
特開２０００−４０００７号公報には、コンパイラに提示したバイトコード群から、実行時にコンパイラにおいてネイティブコードを生成し最適化する方法が記載されている。ダイナミックコンパイラは、実行中のプログラムがホットスポットを検出した際、複数のコード生成メソッドから、一つのコード生成メソッドを選択する。コード生成器は、選択したコード生成メソッドを用いて、最適化したネイティブコードを生成する。
【０００８】
特開２０００−０５７１１３号公報には、オブジェクト指向言語、特に、クライアントが、サーバ上に存在するＪａｖａアプリケーションを実行する環境での、Ｊａｖａアプリケーションの実行性能向上のための装置と方法が記載されている。クライアントが、サーバに置かれているアプリケーションを実行する際、Ｊａｖａアプリケーション・コードをサーバ内に存在するＪａｖａサーバに移す。Ｊａｖａサーバはアプリケーション・コードを利用して、クラス及びメソッドのライブラリの機能を果たす。
【０００９】
アプリケーションの実行開始後、Ｊａｖａサーバが呼び出されると、Ｊａｖａサーバは同じサーバ内にある子Ｊａｖａサーバに分岐し、既にロードされているクラス及びメソッドの処理を行わせる。このように、Ｊａｖａサーバのライブラリ機能のために、Ｊａｖａクラス及びメソッドのロードはＪａｖａ仮想マシンのスタート時の１回だけとなる。
【００１０】
【特許文献１】
特開２０００−４０００７号公報
【特許文献２】
特開２０００−０５７１１３号公報
【００１１】
【発明が解決しようとする課題】
しかし、特開２０００−４０００７号公報に記載の技術では、Ｊａｖａアプリケーションを終了する際、ホットスポットをコンパイルして作成したネイティブコードを格納しているメモリがクリアされる。このため過去にコンパイルしたホットスポットがバイトコード上に存在しても、再度コンパイルする必要がある。
【００１２】
また、特開２０００−０５７１１３号公報に記載の技術では、実行した処理の結果を持つことができないため、Ｊａｖａアプリケーション終了後に、新たに実行されたＪａｖａアプリケーションは、以前実行した処理と同じ処理でも再び実行する必要がある。
本発明の目的は、Ｊａｖａプログラムの実行方法を高速化する技術を提供することにある。
【００１３】
【課題を解決するための手段】
本発明によると、Ｊａｖａプログラム実行方法は、Ｊａｖａ仮想マシンを起動する起動ステップと、Ｊａｖａプログラムのバイトコードよりホットスポットを検出するホットスポット検出ステップと、該検出したホットスポットが登録されたホットスポットと同一であるか否かを判定する判定ステップと、上記検出したホットスポットが登録されたホットスポットと同一である場合には上記検出したホットスポットのバイトコードをネイティブコードに変換する代わりに上記登録されたホットスポットのネイティブコードを読み出して実行する実行ステップと、を含む。
【００１４】
本発明によると、検出したホットスポットのバイトコードをネイティブコードに変換する代わりに登録されたホットスポットのネイティブコードを読み出して実行するから、Ｊａｖａプログラム実行が高速化される。
【００１５】
【発明の実施の形態】
図１を参照して本発明によるＪａｖａプログラム実行システムの例を説明する。本例のＪａｖａプログラム実行システム１０は、Ｊａｖａプログラム実行部１００と、Ｊａｖａ仮想マシンサーバプロセス部１２０と、初期値格納部１４０と、ネイティブコード格納部１６０と、を有し、Ｊａｖａクライアントに設けられる。Ｊａｖａプログラム実行部１００は、Ｊａｖａプログラムの起動時に、Ｊａｖａプログラムが初めて起動されるものであるか又は既に起動されたことがあるかを判定する起動歴判定部１０１を有する。
【００１６】
Ｊａｖａ仮想マシンサーバプロセス部１２０は、初期値処理部１２１とハッシュ値計算部１２２とハッシュ値検索部１２３とホットスポット検出部１２４を有する。初期値処理部１２１は、初期化処理を実行するルーチンである。ハッシュ値計算部１２２は、Ｊａｖａプログラムのバイトコードの読み出し中に発見したホットスポットのバイトコードからハッシュ値を計算するルーチンである。ハッシュ値検索部１２３は、計算したハッシュ値と登録されているハッシュ値を照合して、発見したホットスポットのネイティブコードが、すでに登録されているか否かを検索するルーチンである。ホットスポット検出部１２４はＪａｖａプログラムのバイトコードよりホットスポットを検出するルーチンである。
【００１７】
初期値格納部１４０は、初期値処理部１２１によって実行された初期化処理の結果を格納する。初期値格納部１４０は、Ｊａｖａプログラム起動時の共通データを格納する初期値データ部１４１と初期値のコード部分を格納する初期値コード部１４２とを有する。
【００１８】
ネイティブコード格納部１６０は、ハッシュ値計算部１２２によって計算された各ホットスポットのバイトコードのハッシュ値と該各ホットスポットのバイトコードをコンパイルすることによって作成されたネイティブコードを対応付けたレコードを格納する。ネイティブコード格納部１６０は、あらかじめ定められた領域分だけ該ハッシュ値とネイティブコードのレコードを格納できる。図１の例では、Ｎ個のハッシュ値とネイティブコードのレコードが格納されている。
【００１９】
本例では、Ｊａｖａプログラムの終了時にメモリが開放されても、初期化処理の結果は初期値格納部１４０に保存され、ホットスポットのネイティブコードはネイティブコード格納部１６０に保存され、それらは再利用される。
【００２０】
ハッシュ値は適当なハッシュ関数によって一意に決定される。ここでは、ネイティブコードを識別するためにハッシュ値を使用するが、ハッシュ値は単なる例であり、ネイティブコードを識別することができる識別子であればハッシュ値以外であってもよい。
【００２１】
図１に示した本発明によるＪａｖａプログラム実行システムは、Ｊａｖａクライアントのコンピュータシステムのメモリによって実現されてよい。Ｊａｖａプログラム実行システムの各部は、ソフトウエアによって実現されてもよい。
【００２２】
図２を参照して本発明によるＪａｖａプログラム実行システムの動作を説明する。ステップ１２にて、Ｊａｖａプログラムが起動されると、ＪａｖａプログラムはＪａｖａ仮想マシンを起動する。ステップ１３にて、このＪａｖａプログラムの起動が初めてであるか否かを判定する。
【００２３】
このＪａｖａプログラムの起動が初めてであれば、ステップ１４に進み、このＪａｖａプログラムの起動が初めてでなければ、ステップ１６に進む。ステップ１４にて、Ｊａｖａ仮想マシンサーバプロセス部１２０を生成する。Ｊａｖａ仮想マシンサーバプロセス部１２０の構造は図１に示した。
【００２４】
ステップ１５にて、Ｊａｖａ仮想マシンサーバプロセス部１２０の初期値処理部１２１は初期化処理を行う。初期化処理の結果は、再利用のために初期値格納部１４０に保存される。
【００２５】
ステップ１６にて、Ｊａｖａプログラムは、Ｊａｖａ仮想マシンサーバプロセス部１２０と通信し、初期値データ部１４１に保持された初期値データ及び初期値コード部１４２よりロードした初期値コードを取得する。
【００２６】
ステップ１７にて、ＪａｖａプログラムのＭａｉｎメソッドを実行する。ステップ１８にてＪａｖａプログラムのバイトコードを読み出す。ステップ１９にて、バイトコードの読み出し中に、ホットスポットが検出されたか否かを判定する。ホットスポットが検出された場合には、ステップ２０に進み、ホットスポットが検出されない場合には、ステップ２６に進む。ステップ２６にて、Ｊａｖａプログラムはインタプリタ（一行毎の変換）を実行する。即ち、Ｊａｖａプログラムのバイトコードを１行毎にネイティブコードに変換し、実行する。
【００２７】
ステップ２０にて、ＪａｖａプログラムはＪａｖａ仮想マシンサーバプロセス部１２０と通信し、Ｊａｖａ仮想マシンサーバプロセス部１２０に以下の処理を実行させる。ハッシュ値計算部１２２は、検出したホットスポットのバイトコードからハッシュ値を計算する。ステップ２１にて、ハッシュ値検索部１２３は、計算したハッシュ値が、ネイティブコード格納部１６０に登録されているか否かを判断する。計算したハッシュ値がネイティブコード格納部１６０に登録されている場合には、ステップ２２に進み、登録されていない場合ステップ２３に進む。
【００２８】
ステップ２２にて、Ｊａｖａ仮想マシンサーバプロセス部１２０は、ネイティブコード格納部１６０からハッシュ値検索部１２３で検索されたハッシュ値に対応するネイティブコードを読み出して使用する。即ち、検出したホットスポットのバイトコードをネイティブコードに変換する代わりに、登録されているネイティブコードを読み出して実行する。
【００２９】
ステップ２３にて、ハッシュ値計算部１２２は、検出したホットスポットのバイトコードからハッシュ値を計算する。ステップ２４にて、Ｊａｖａ仮想マシンサーバプロセス部１２０は、検出したホットスポットのバイトコードをコンパイルし、ネイティブコードを作成する。ステップ２５にて、計算したハッシュ値及び作成したネイティブコードをネイティブコード格納部１６０に格納する。ステップ２２にて、Ｊａｖａ仮想マシンサーバプロセス部１２０は、ネイティブコード格納部１６０よりステップ２３で生成したハッシュ値に対応するネイティブコードを読み出して実行する。
【００３０】
最後にステップ２７にてＪａｖａプログラムのバイトコードの読み出しが終了したか否かを判定する。読み出しが終了していない場合にはステップ１８に戻り、読み出しが終了している場合には、処理を終了する。
【００３１】
図３を参照して、２つのＪａｖａプログラムにおいて、ネイティブコードを再利用する場合の処理を説明する。第１のＪａｖａプログラム３１の実行時に、ｆｏｏ１クラス内にホットスポットＡが発見された場合を考える。ホットスポットＡのハッシュ値が計算される。計算されたハッシュ値は登録されたハッシュ値と照合され、ホットスポットＡが登録されたものでない場合には、ホットスポットＡのバイトコードは、Ｊａｖａ仮想マシンサーバプロセスによってコンパイルされ、ネイティブコードが生成される。ホットスポットＡのネイティブコードはハッシュ値と共にネイティブコード格納部１６０に保持される。
【００３２】
次に第２のＪａｖａプログラム３２の実行時に、ｆｏｏ２クラス内にホットスポットＡが発見されると、Ｊａｖａ仮想マシンサーバプロセスに通信し、ホットスポットＡのハッシュ値が計算される。計算されたハッシュ値は登録されたハッシュ値と照合され、ホットスポットＡが既登録か否かが判定される。ここでは、第１のＪａｖａプログラム３１の実行時に既に、ホットスポットＡのネイティブコードが登録されている。従って、第２のＪａｖａプログラムの実行において、発見したホットスポットＡのバイトコードをネイティブコードに変換する代わりに、登録済みのホットスポットＡのネイティブコードを再利用する。
【００３３】
このように、本例は、Ｊａｖａ仮想マシンを複数回起動する可能性がある環境、例えばＪａｖａ言語を用いてソフトウェアを開発する現場や、ＷＥＢサーバに相異なる複数のＪａｖａプログラムが動作しているシステム等にて利用して好適である。
【００３４】
以上本発明の例を説明したが本発明は上述の例に限定されるものではなく、特許請求の範囲にて様々な変形が可能であることは当業者に理解されよう。
【００３５】
【発明の効果】
本発明によれば、登録されたホットスポットのネイティブコードを再利用することによって、ホットスポットのバイトコードをネイティブコードに変換する処理を省略することができるから、Ｊａｖａプログラムの実行を高速化することができる効果がある。
【００３６】
本発明によれば、保存された初期値処理の結果を再利用することによって、Ｊａｖａプログラムの初期値処理を省略することができるから、Ｊａｖａプログラムの実行を高速化することができる効果がある。
【図面の簡単な説明】
【図１】本発明によるＪａｖａプログラム実行システムの構成例を示す図である。
【図２】本発明によるＪａｖａプログラム実行システムの動作を説明するための説明図である。
【図３】本発明のＪａｖａプログラム実行システムにおいて、二つのＪａｖａプログラムが、ネイティブコードを再利用する動作を説明するための図である。
【図４】従来のＪａｖａプログラムの実行方法を説明するための説明図である。
【符号の説明】
１００…Ｊａｖａプログラム実行部、１２０…Ｊａｖａ仮想マシンサーバプロセス部、１２１…初期値処理部、１２２…ハッシュ値計算部、１２３…ハッシュ値検索部、１２４…ホットスポット検出部、１４１…初期値データ部、１４２…初期値コード部、１６０…ネイティブコード格納部
【図１】
2004272384.tif 000003
【図２】
2004272384.tif 000004
【図３】
2004272384.tif 000005
【図４】
2004272384.tif 000006