(57)【特許請求の範囲】
【請求項１】
仮想マシンを実行することにより中間コードからなるアプリケーションを実行し、かつ、アプリケーションサーバプログラムを実行することにより前記仮想マシンの起動を制御するアプリケーションサーバ装置であって、
前記アプリケーションサーバプログラムは、
前記アプリケーションサーバ装置上で実行される第１の仮想マシンに対して、前記アプリケーションにおける手続きの実行頻度を集計した第１の実行頻度情報を外部ファイルから取得するべき旨の取得条件と、前記第１の実行頻度情報に基づいて実行頻度が所定の値よりも高い手続きを中間コードからネイティブコードにコンパイルすべき旨と、前記第１の仮想マシンの起動直後にコンパイルを実行する旨を示すタイミングとを指定し、前記アプリケーションサーバ装置上で実行され、かつ前記第１の仮想マシンの起動後に起動される第２の仮想マシンに対して、前記第１の仮想マシンにおける前記アプリケーションにおける手続きの実行頻度情報である第２の実行頻度情報を前記第１の仮想マシンとのプロセス間通信によって取得するべき旨の取得条件と、前記第２の実行頻度情報に基づいて実行
頻度が前記所定の値よりも高い手続きを中間コードからネイティブコードにコンパイルすべき旨と、前記第２の仮想マシンの起動直後にコンパイルを実行する旨を示すタイミングとを指定して前記第１および第２の仮想マシンを起動する仮想マシン制御手段として前記アプリケーションサーバ装置を機能させ、
前記第１および第２の仮想マシンは、
前記取得条件に従って前記第１または第２の実行頻度情報を前記外部ファイルまたは前記プロセス間通信によって取得する実行頻度情報入力手段と、
前記実行頻度情報入力手段によって取得された前記第１または第２の実行頻度情報から実行頻度が前記所定の値よりも大きい手続きを選択するコンパイル対象選択手段と、
前記コンパイル対象選択手段により選択された手続きに対応する中間コードを、前記仮想マシン制御手段で指定されたタイミングで、ネイティブコードにコンパイルするコンパイル手段と、
実行中の前記アプリケーションにおいて前記コンパイル手段によってコンパイルされたネイティブコードが存在する手続きが呼び出された場合に、中間コードに代えて前記ネイティブコードを実行する実行制御手段として前記アプリケーションサーバ装置を機能させる
ことを特徴とするアプリケーションサーバ装置。
【請求項２】
コンピュータに、
中間コードからなるアプリケーションにおける手続きの実行頻度を集計した実行頻度情報であり、かつ前記コンピュータ上で前記アプリケーションを実行するための他の仮想マシンの実行によって集計された実行頻度情報を前記他の仮想マシンとのプロセス間通信によって取得するべき旨の取得条件と、該実行頻度情報に基づいて実行頻度が所定の値よりも高い手続きを中間コードからネイティブコードにコンパイルすべき旨と、仮想マシンの起動直後もしくは手続きの呼び出し時のいずれでコンパイルを実行するかを示すタイミングとが指定された起動パラメータとを受信する受信手順と、
前記取得条件に従って前記実行頻度情報を前記プロセス間通信によって取得する実行頻度情報入力手順と、
前記実行頻度情報において実行頻度が前記所定の値よりも高い手続きを、前記受信手順で受信した起動パラメータで指定されたタイミングで、中間コードからネイティブコードに変換するコンパイル手順と、
実行中の前記アプリケーションにおいて前記コンパイル手順によってコンパイルされたネイティブコードが存在する手続きが呼び出された場合に、中間コードに代えて前記ネイティブコードを実行する実行制御手順と
を実行させることを特徴とする仮想マシンプログラム。
【請求項３】
前記コンパイル手順は、前記受信手順により受信した前記起動パラメータに含まれるコンパイル開始条件が、仮想マシンの起動直後にコンパイルを実行する旨を示す場合であって、当該起動直後に前記実行頻度情報入力手順によって前記実行頻度情報が取得された場合に、前記実行頻度情報から実行頻度が前記所定の値よりも大きい手続きを選択し、選択した手続きに対応する中間コードをネイティブコードにコンパイルする
ことを特徴とする請求項２に記載の仮想マシンプログラム。
【請求項４】
前記コンパイル手順は、前記受信手順により受信した前記起動パラメータに含まれるコンパイル開始条件が、手続きの呼び出し時にコンパイルを実行する旨を示す場合であって、前記アプリケーションを実行中に手続きが呼び出された場合に、前記実行頻度情報を参照して該手続きの実行頻度を取得し、取得された実行頻度が前記所定の値よりも高ければ、該手続きに対応する中間コードをネイティブコードにコンパイルする
ことを特徴とする請求項２に記載の仮想マシンプログラム。
【請求項５】
前記コンパイル手順は、前記コンピュータが備えるＣＰＵの負荷が所定の値よりも高い場合は、前記手続きに対応する中間コードをネイティブコードにコンパイルする処理を行わない
ことを特徴とする請求項２〜４のいずれか一つに記載の仮想マシンプログラム。
【請求項６】
仮想マシンを実行することにより中間コードを用いて表現されたアプリケーションを、前記アプリケーションに含まれる複数の手続きの各々の実行頻度に基づいて前記中間コードをネイティブコードに変換し、かつ、アプリケーションサーバプログラムを実行することにより前記仮想マシンの起動を制御するアプリケーションサーバ装置であって、
仮想マシンが第１の仮想マシンであるか、前記第１の仮想マシンの起動後に起動される第２の仮想マシンであるかを示した仮想マシンの種類を含む前記仮想マシンの起動指示を受信すると、受信した前記起動指示に含まれる前記仮想マシンの種類が前記第１の仮想マシンを示す場合には、前記アプリケーションに含まれる複数の手続きの各々の実行頻度の取得を外部ファイルから取得する取得方法を指定し、受信した前記起動指示に含まれる前記仮想マシンの種類が前記第２の仮想マシンを示す場合には、前記第１の仮想マシンにおける前記アプリケーションに含まれる複数の手続きの各々の実行頻度の取得を前記第１の仮想マシンとのプロセス間通信によって取得する取得方法を指定して前記起動指示によって起動が指示された前記第１または第２の仮想マシンを起動する仮想マシン制御手段
を備えたことを特徴とするアプリケーションサーバ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、実行頻度の高い手続きを中間コードからネイティブコードに変換して実行することによりアプリケーションの実行速度を改善させるアプリケーションサーバシステムおよび仮想マシンプログラムに関し、特に、実行頻度の高い手続きを変換する処理を開始する時期を適切に調整することができ、さらに、この変換処理にともなう負荷によってアプリケーションの実行に支障が生じることを防止することができるアプリケーションサーバシステムおよび仮想マシンプログラムに関する。
【背景技術】
【０００２】
Ｊａｖａ（登録商標）アプリケーションのように、仮想マシン上で中間コードを実行させる実行形態をとるアプリケーションは、実行ファイルのサイズが小さく、様々な環境で実行が可能であるという利点を有する一方で、実行速度の面からみると、ネイティブコードからなるアプリケーションに劣ることがある。
【０００３】
このような実行速度における欠点を改善するため、中間コードからなるアプリケーションの一部をネイティブコードに変換して実行する技術が知られている。例えば、非特許文献１には、予め、アプリケーションの一部をネイティブコードに変換しておく技術が開示されている。また、特許文献１には、アプリケーションの実行時に手続きの実行頻度を集計し、実行頻度の高い手続きを動的にネイティブコードに変換する技術が開示されている。
【０００４】
【特許文献１】特開２００５−３４６４０７号公報
【非特許文献１】"ネイティブ イメージ ジェネレータ (Ngen.exe)"、  ［online］、  マイクロソフト株式会社、  ［平成１８年１月２７日検索］、  インターネット<ＵＲＬ： http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cptools/html/cpgrfnativeimagegeneratorngenexe.asp>
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、非特許文献１にて開示されている技術では、アプリケーションのどの部分をネイティブコードに変換すれば実行速度の改善に有効であるかを検討することが必要であるため、運用に手間がかかる。また、実行時にメモリ上のどこに配置されてもよいようにするため、ネイティブコードを再配置可能な構造、すわなち、実行時にアドレス変換を必要とする構造にする必要があり、変換後のネイティブコードは、仮想マシンで変換される通常のネイティブコードよりも実行速度の面で劣ったものとなる。
【０００６】
一方、特許文献１にて開示されている技術では、ネイティブコードに変換すべき箇所が自動的に選択され、ネイティブコードを再配置可能な構造にする必要もないので、上記の問題は生じない。しかし、この従来技術においては、実行頻度の集計が進んで実行頻度の高い手続きの変換が開始されるまでは、実行速度が改善されることがなく、また、変換が開始された後は、中間コードの変換とアプリケーションの実行が平行して行われることになるため、負荷が高まってアプリケーションの実行に支障が生じる場合がある。
【０００７】
この発明は、上述した従来技術による問題点を解消するためになされたものであり、実行頻度の高い手続きをネイティブコードへ変換する処理を開始する時期を適切に調整することができ、さらに、この変換処理にともなう負荷によってアプリケーションの実行に支障が生じることを防止することができるアプリケーションサーバシステムおよび仮想マシンプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するため、本発明は、中間コードからなるアプリケーションを実行する仮想マシンと、前記仮想マシンの起動を制御するアプリケーションサーバとを備えるアプリケーションサーバシステムであって、前記アプリケーションサーバは、前記アプリケーションにおける手続きの実行頻度を集計した実行頻度情報を外部から取得するべき旨と、該実行頻度情報に基づいて実行頻度が所定の値よりも高い手続きを中間コードからネイティブコードにコンパイルすべき旨と、仮想マシンの起動直後もしくは手続きの呼び出し時のいずれでコンパイルを実行するかを示すタイミングとを指定して前記仮想マシンを起動する仮想マシン制御手段を備え、前記仮想マシンは、前記アプリケーションサーバの指定に従って前記実行頻度情報を外部から取得する実行頻度情報入力手段と、前記実行頻度情報入力手段によって取得された前記実行頻度情報から実行頻度が所定の値よりも大きい手続きを選択するコンパイル対象選択手段と、前記コンパイル対象選択手段により選択された手続きを、前記仮想マシン制御手段で指定されたタイミングで、ネイティブコードにコンパイルするコンパイル手段と、実行中の前記アプリケーションにおいて前記コンパイル手段によってコンパイルされたネイティブコードが存在する手続きが呼び出された場合に、中間コードに代えて前記ネイティブコードを実行する実行制御手段とを備えたことを特徴とする。
【０００９】
この発明によれば、アプリケーションサーバプログラムの指示に基づいて、仮想マシンプログラムが外部から実行頻度情報を取得し、この実行頻度情報に基づいて実行頻度の高い手続きをネイティブコードに変換するように構成したので、仮想マシンプログラムが実行頻度情報の集計を開始する前から変換を開始できることとなり、アプリケーションサーバシステムにおいて仮想マシンプログラムが起動されてから実行頻度の高い手続きをネイティブコードに変換する処理が開始されるまでの時間が大きく短縮される。
【００１０】
また、本発明は、中間コードからなるアプリケーションにおける手続きの実行頻度を集計した実行頻度情報を外部から取得するべき旨と、該実行頻度情報に基づいて実行頻度が所定の値よりも高い手続きを中間コードからネイティブコードにコンパイルすべき旨と、仮想マシンの起動直後もしくは手続きの呼び出し時のいずれでコンパイルを実行するかを示すタイミングとが指定された起動パラメータとを受信する受信手順と、前記実行頻度情報において実行頻度が所定の値よりも高い手続きを、受信手順で受信した起動パラメータで指定されたタイミングで、中間コードからネイティブコードに変換するコンパイル手順と、実行中の前記アプリケーションにおいて前記コンパイル手順によってコンパイルされたネイティブコードが存在する手続きが呼び出された場合に、中間コードに代えて前記ネイティブコードを実行する実行制御手順とをコンピュータに実行させることを特徴とする。
【００１１】
この発明によれば、実行頻度情報に基づいて実行頻度の高い手続きをネイティブコードへ変換する機能を有する仮想マシンプログラムにおいて、実行頻度情報を外部から取得できるように構成したので、仮想マシンプログラムが起動されてから実行頻度の高い手続きをネイティブコードに変換する処理が開始されるまでの時間が大きく短縮される。
【００１２】
また、本発明は、上記の発明において、前記実行頻度情報入力手順によって取得された前記実行頻度情報から実行頻度が所定の値よりも大きい手続きを選択し、選択した手続きをネイティブコードに変換する処理を前記コンパイル手順に実行させるコンパイル対象選択手順をさらにコンピュータに実行させることを特徴とする。
【００１３】
この発明によれば、実行頻度情報を外部から取得された場合に、その実行頻度情報から実行頻度が所定の値よりも大きい手続きを選択して、アプリケーションサーバプログラムがリクエストの処理を開始する前に、選択した手続きをネイティブコードに変換する処理をコンパイル手段に一括実行させるように構成したので、選択した手続きの変換処理にともなう負荷によってアプリケーションの実行に支障が生じることを防止できる。
【００１４】
また、本発明は、上記の発明において、前記コンパイル手順は、前記アプリケーションを実行中に手続きが呼び出された場合に、前記実行頻度情報を参照して該手続きの実行頻度を取得し、取得された実行頻度が所定の値よりも高ければ、該手続きを中間コードからネイティブコードにコンパイルすることを特徴とする。
【００１５】
この発明によれば、実行頻度情報において実行頻度が所定の値よりも大きい手続きをネイティブコードへ変換する処理を該当する手続きが呼び出されたタイミングで実行するように構成したので、変換処理にともなう負荷の発生を分散させることができる。
【００１６】
また、本発明は、上記の発明において、前記コンパイル手順は、ＣＰＵの負荷が所定の値よりも高い場合は、手続きをネイティブコードにコンパイルする処理を行わないことを特徴とする。
【００１７】
この発明によれば、ＣＰＵの負荷が所定の値よりも大きい場合は、実行頻度が所定の値よりも大きい手続きをネイティブコードへ変換する処理を行わないように構成したので、変換処理にともなう負荷の発生によってアプリケーションの実行に支障がでることを防止することができる。
【発明の効果】
【００１８】
本発明によれば、アプリケーションサーバプログラムの指示に基づいて、仮想マシンプログラムが外部から実行頻度情報を取得し、この実行頻度情報に基づいて実行頻度の高い手続きをネイティブコードに変換するように構成したので、仮想マシンプログラムが実行頻度情報の集計を開始する前から変換を開始できることとなり、アプリケーションサーバシステムにおいて仮想マシンプログラムが起動されてから実行頻度の高い手続きをネイティブコードに変換する処理が開始されるまでの時間が大きく短縮されるという効果を奏する。
【００１９】
また、本発明によれば、実行頻度情報に基づいて実行頻度の高い手続きをネイティブコードへ変換する機能を有する仮想マシンプログラムにおいて、実行頻度情報を外部から取得できるように構成したので、仮想マシンプログラムが起動されてから実行頻度の高い手続きをネイティブコードに変換する処理が開始されるまでの時間が大きく短縮されるという効果を奏する。
【００２０】
また、本発明によれば、実行頻度情報を外部から取得された場合に、その実行頻度情報から実行頻度が所定の値よりも大きい手続きを選択して、アプリケーションサーバプログラムがリクエストの処理を開始する前に、選択した手続きをネイティブコードに変換する処理をコンパイル手段に一括実行させるように構成したので、選択した手続きの変換処理にともなう負荷によってアプリケーションの実行に支障が生じることを防止できるという効果を奏する。
【００２１】
また、本発明によれば、実行頻度情報において実行頻度が所定の値よりも大きい手続きをネイティブコードへ変換する処理を該当する手続きが呼び出されたタイミングで実行するように構成したので、変換処理にともなう負荷の発生を分散させることができるという効果を奏する。
【００２２】
また、本発明によれば、ＣＰＵの負荷が所定の値よりも大きい場合は、実行頻度が所定の値よりも大きい手続きをネイティブコードへ変換する処理を行わないように構成したので、変換処理にともなう負荷の発生によってアプリケーションの実行に支障がでることを防止することができるという効果を奏する。
【発明を実施するための最良の形態】
【００２３】
以下に添付図面を参照して、本発明に係るアプリケーションサーバシステムおよび仮想マシンプログラムの好適な実施の形態を詳細に説明する。
【実施例】
【００２４】
まず、本実施例に係るアプリケーションサーバシステムの構成について説明する。図１は、本実施例に係るアプリケーションサーバシステム１０の構成を示すブロック図である。
【００２５】
同図に示すように、アプリケーションサーバシステム１０は、アプリケーションサーバ１００と、仮想マシン２００と、Ｊａｖａ（登録商標）アプリケーション３００とを有する。ここで、アプリケーションサーバシステム１０は、サーバ装置１上で稼動しているものとし、サーバ装置１は、ネットワークを通じて端末装置２と接続されているものとする。
【００２６】
アプリケーションサーバ１００は、仮想マシン２００を起動させ、さらに、仮想マシン２００の上でＪａｖａ（登録商標）アプリケーション３００を起動させるプログラムである。なお、アプリケーションサーバ１００は、複数の仮想マシン２００を起動させることができる。
【００２７】
また、アプリケーションサーバ１００は、端末装置２で稼動するブラウザ２０のようなクライアントプログラムからリクエストを受け取ると、そのリクエストをＪａｖａ（登録商標）アプリケーション３００に引き渡して処理させ、結果を受け取ると、それを整形してクライアントプログラムへ応答する。アプリケーションサーバ１００とクライアントプログラムの間のやりとりは、ＨＴＴＰ（HyperText Transfer Protocol）などのプロトコルに基づいて行われる。
【００２８】
仮想マシン２００は、Ｊａｖａ（登録商標）の中間コードであるバイトコードを実行可能な仮想マシンであり、実行頻度の高い手続き（Ｊａｖａ（登録商標）においてはメソッドとも呼ばれる）を動的にネイティブコードへ変換して実行し、実行速度を向上させる機能を備える。ネイティブコードとは、サーバ装置１が備えるＣＰＵ（Central Processing Unit）が直接実行できるコード（命令）のことである。
【００２９】
Ｊａｖａ（登録商標）アプリケーション３００は、特定の業務用途を満たすためにＪａｖａ（登録商標）によって作成されたプログラムであり、クラスファイルと呼ばれる複数のモジュールから構成される。クラスファイルは、Ｊａｖａ（登録商標）のソースコードをバイトコード列へ変換したものである。なお、以下の説明において、単にアプリケーションという場合は、Ｊａｖａ（登録商標）アプリケーション３００と同様にＪａｖａ（登録商標）によって作成されたアプリケーションを指すものとする。
【００３０】
次に、本実施例に係るアプリケーションサーバシステムにおける仮想マシンの起動方法について説明する。図２は、本実施例に係るアプリケーションサーバシステムにおける仮想マシンの起動方法を説明するための説明図である。
【００３１】
同図に示すように、アプリケーションサーバ１００は、仮想マシン２００を起動するにあたって、実行頻度情報取得方式と、コンパイルタイミングと、実行頻度閾値と、ＣＰＵ負荷閾値という起動パラメータを指定する。
【００３２】
実行頻度情報取得方式は、手続きの実行頻度を手続きごとに集計した情報（以下、この情報を「実行頻度情報」という）をどのように取得するかを指定するパラメータであり、「なし」、「プロセス間通信」もしくは「ファイル」のいずれかの値をとる。
【００３３】
「なし」は、実行頻度情報を外部から取得せず、自身で集計した実行頻度情報のみに基づいて実行頻度の高い手続きを選定すべきことを意味する。この値が指定された場合、仮想マシン２００は、実行頻度情報の集計が進むまで、実行頻度の高い手続きをネイティブコードへ変換する処理（以下、この処理を「動的コンパイル」という）を開始することができないため、仮想マシン２００上で起動されたアプリケーションは、起動後しばらくは実行速度が改善されない状態のままとなる。
【００３４】
「プロセス間通信」は、稼働中の他の仮想マシンが集計した実行頻度情報を共有メモリなどを用いたプロセス間通信によって取得すべきことを意味する。そして、「ファイル」は、実行頻度情報をファイルから入手すべきことを意味する。このファイルは、稼働中の他の仮想マシンが出力したものである場合もあれば、かつて稼動していた他の仮想マシンが出力したものである場合もある。
【００３５】
実行頻度情報取得方式として「プロセス間通信」もしくは「ファイル」のいずれかの値が指定された場合、仮想マシン２００は、取得した実行頻度情報に基づいて動的コンパイルを即座に開始することができる。また、これらの値が指定された場合、仮想マシン２００は、実際にアプリケーションの実行が開始される前に動的コンパイルを一通り完了し、アプリケーションが高速に実行可能な状態を予め作っておくこともできる。
【００３６】
なお、実行頻度情報取得方式として「プロセス間通信」が指定された場合に必要となるハンドル等や、実行頻度情報取得方式として「ファイル」が指定された場合に必要となるファイル名等は、アプリケーションサーバ１００が指定することとしてもよいし、予め設定ファイルに記述されたものを使用することとしてもよい。
【００３７】
コンパイルタイミングは、実行頻度情報が外部から取得された場合に、その実行頻度情報から実行頻度が高いと判断される手続きの動的コンパイルを実行するタイミングを指定するパラメータであり、「起動直後」もしくは「手続き呼び出し時」のいずれかの値をとる。「起動直後」は、仮想マシン２００が起動した直後に一括して動的コンパイルを実行すべきことを意味し、「手続き呼び出し時」は、対象の手続きが呼び出されたときにその手続きの動的コンパイルを行うべきことを意味する。
【００３８】
コンパイルタイミングの指定が「起動直後」である場合、実行頻度の高い手続きの変換が一通り完了するまでの時間は短くなるが、発生する負荷は非常に大きくなる。一方、コンパイルタイミングの指定が「手続き呼び出し時」である場合、実行頻度の高い手続きの変換が一通り完了するまでの時間は長くなるが、動的コンパイルによる負荷の発生は分散される。
【００３９】
実行頻度閾値は、手続きの実行頻度の高さを判定するための閾値であり、実行頻度情報における実行頻度がこの閾値よりも大きい手続きが動的コンパイルの対象となる。ＣＰＵ負荷閾値は、ＣＰＵに高い負荷がかかっているときに動的コンパイルを行うことによってさらに負荷を増大させることを防止するための閾値であり、ＣＰＵの負荷がこの閾値よりも高い場合、仮想マシン２００は、動的コンパイルを中止する。
【００４０】
このように、本実施例に係るアプリケーションサーバシステムにおいては、アプリケーションサーバ１００は、起動パラメータによって、仮想マシン２００が動的コンパイルを開始する時期と動的コンパイルによる負荷の集中度合いを調整することができ、また、動的コンパイルによる負荷によってアプリケーションの実行に支障がでることを防止することができる。
【００４１】
また、仮想マシン２００は、動的コンパイルを一通り終えた後、コンパイル完了通知をアプリケーションサーバ１００に応答するので、アプリケーションサーバ１００は、仮想マシン２００を起動した後、この応答を待って、実行頻度が高い手続きが全てネイティブコードに変換された状態でアプリケーションを起動することもできる。
【００４２】
次に、アプリケーションサーバ１００が仮想マシン２００を起動するにあたって指定する起動パラメータの具体例を起動目的ごとに示す。
【００４３】
図３−１は、仮想マシン２００を運用仮想マシン２０１として起動する場合の起動パラメータの一例を示す図である。運用仮想マシン２０１は、アプリケーションサーバ１００がクライアントアプリケーションから受け付けたリクエストを処理するアプリケーションを起動するための仮想マシンである。
【００４４】
運用仮想マシン２０１の起動は、アプリケーションサーバ１００がクライアントアプリケーションからのリクエストの受け付けを開始する前に行われる。このため、大きな負荷が発生してもアプリケーションに支障がでることはない。また、アプリケーションが高速に動作可能な状態をなるべく早く作り上げることが好ましいが、この段階では、アプリケーションを実行している他の仮想マシン２００は存在しない。
【００４５】
そこで、アプリケーションサーバ１００は、運用仮想マシン２０１を起動させるにあたって、実行頻度情報取得方式として「ファイル」を、コンパイルタイミングとして「起動直後」を、実行頻度閾値として「１０００回」を、そしてＣＰＵ負荷閾値として「１００％」を起動パラメータとして指定している。
【００４６】
実行頻度情報取得方式として「ファイル」を指定しているのは、既に集計されている実行頻度情報を利用させて動的コンパイルの開始時期を早めさせるためである。動的コンパイルの開始時期を早めさせるために、実行頻度情報取得方式として「プロセス間通信」を指定することも有効であるが、この時点では他の仮想マシンが起動していないため、これらを指定することはできない。
【００４７】
コンパイルタイミングとして「起動直後」を指定し、ＣＰＵ負荷閾値として「１００％」を指定しているのは、負荷の発生を考慮することなく、動的コンパイルを早期に一通り完了させるためである。
【００４８】
図３−２は、仮想マシン２００をリカバリ仮想マシン２０２として起動する場合の起動パラメータの一例を示す図である。リカバリ仮想マシン２０２は、図３−１に示した運用仮想マシンが何らかの理由でダウンした場合に、代替の仮想マシンとして新たに起動される仮想マシンである。
【００４９】
リカバリ仮想マシン２０２の起動は、運用仮想マシン２０１がダウンした直後、アプリケーションサーバ１００がクライアントアプリケーションからのリクエストを受け付けている最中に行われる。すなわち、リカバリ仮想マシン２０２は、起動直後からアプリケーションを実行する必要があり、実行されるアプリケーションは起動直後からリクエストの対応を行う必要がある。このため、動的コンパイルを集中して実行して大きな負荷を発生させることは好ましくない。
【００５０】
そこで、アプリケーションサーバ１００は、リカバリ仮想マシン２０２を起動させるにあたって、実行頻度情報取得方式として「ファイル」を、コンパイルタイミングとして「手続き呼び出し時」を、実行頻度閾値として「１０００回」を、そしてＣＰＵ負荷閾値として「６０％」を起動パラメータとして指定している。
【００５１】
実行頻度情報取得方式として「ファイル」を指定しているのは、既に集計されている実行頻度情報を利用させて動的コンパイルの開始時期を早めさせるためである。この例では、運用仮想マシン２０１がダウンしているので、実行頻度情報取得方式として「プロセス間通信」を指定することはできない。
【００５２】
コンパイルタイミングとして「手続き呼び出し時」を指定し、ＣＰＵ負荷閾値として「６０％」を指定しているのは、動的コンパイルによる負荷の発生を分散させ、アプリケーションの実行に支障を生じさせないためである。なお、動的コンパイルによる負荷の発生を軽減させるため、実行頻度閾値としてより大きな値を指定し、動的コンパイルの対象となる手続きの数を減少させることも有効である。
【００５３】
図３−３は、仮想マシン２００をスタンバイ仮想マシン２０３として起動する場合の起動パラメータの一例を示す図である。スタンバイ仮想マシン２０３は、図３−１に示した運用仮想マシンが何らかの理由でダウンする場合に備えて、代替の仮想マシンとして事前に起動される仮想マシンである。
【００５４】
スタンバイ仮想マシン２０３の起動は、いつ行ってもよいが、ここでは、運用仮想マシン２０１が起動した直後であって、アプリケーションサーバ１００がクライアントアプリケーションからのリクエストを受け付ける前に行うものとする。このため、動的コンパイルによる負荷を発生を考慮する必要はあまりないものとする。
【００５５】
そこで、アプリケーションサーバ１００は、スタンバイ仮想マシン２０３を起動させるにあたって、実行頻度情報取得方式として「プロセス間通信」を、コンパイルタイミングとして「起動直後」を、実行頻度閾値として「１０００回」を、そしてＣＰＵ負荷閾値として「８０％」を起動パラメータとして指定している。
【００５６】
実行頻度情報取得方式として「プロセス間通信」を指定しているのは、既に起動されている運用仮想マシン２０１から実行頻度情報を取得させて、動的コンパイルの開始時期を早めさせるためである。なお、運用仮想マシン２０１は、ファイルから実行頻度情報を取得する等して、集計が十分に進んでいる実行頻度情報を既に保持しているものとする。
【００５７】
コンパイルタイミングとして「起動直後」を指定しているのは、動的コンパイルを早期に一通り完了させるためであり、ＣＰＵ負荷閾値として「８０％」を指定しているのは、運用仮想マシン２０１における動的コンパイルを優先させるためである。
【００５８】
なお、仮想マシン２００を負荷分散仮想マシンとして起動する場合の起動パラメータのも同様のものとなる。負荷分散仮想マシンは、図３−１に示した運用仮想マシン２０１の負荷が高まった場合に運用仮想マシン２０１の処理を一部肩代わりできるように、事前に起動される仮想マシンである。
【００５９】
次に、本実施例に係るアプリケーションサーバ１００の構成について説明する。図４は、本実施例に係るアプリケーションサーバ１００の構成を示す機能ブロック図である。同図に示すように、アプリケーションサーバ１００は、プログラム領域１１０と、データ領域１２０とを有する。
【００６０】
プログラム領域１１０は、アプリケーションサーバ１００の機能を実現するための命令列等からなる領域であり、仮想マシン制御部１１１と、アプリケーション制御部１１２と、リクエスト制御部１１３とを有する。
【００６１】
仮想マシン制御部１１１は、仮想マシン２００の起動や生存監視を制御する制御部であり、アプリケーション制御部１１２は、仮想マシン２００上でのアプリケーションの起動や生存監視を制御する制御部である。リクエスト制御部１１３は、クライアントアプリケーションから送信されたリクエストを仮想マシン２００上で起動させたアプリケーションに引渡し、処理結果を受け取って要求元のクライアントアプリケーションへ応答するまでの一連の処理を制御する制御部である。
【００６２】
データ領域１２０は、プログラム領域１１０の各部が各種機能を実現するために必要なデータを保持する領域であり、設定情報記憶領域１２１と、仮想マシン情報記憶領域１２２とを有する。設定情報記憶領域１２１は、仮想マシン制御部１１１、アプリケーション制御部１１２およびリクエスト制御部１１３の動作を規定する各種設定情報を保持する領域である。仮想マシン情報記憶領域１２２は、仮想マシン制御部１１１により起動された仮想マシン２００の識別情報等を保持する領域である。
【００６３】
仮想マシン制御部１１１は、設定情報記憶領域１２１と仮想マシン情報記憶領域１２２に保持されている情報に基づいて動作内容を決定する。
【００６４】
例えば、仮想マシン制御部１１１は、仮想マシン２００を運用仮想マシンとして起動するように指示を受けると、設定情報記憶領域１２１から仮想マシン２００を運用仮想マシンとして起動するために必要な情報を取得し、取得した情報に応じた起動パラメータを指定して仮想マシン２００を起動する。そして、起動した仮想マシン２００を識別するためのプロセスＩＤ等の識別情報と共に仮想マシン２００を運用仮想マシンとして起動した旨を仮想マシン情報記憶領域１２２に記録し、起動した仮想マシン２００の生存監視を開始する。
【００６５】
また、仮想マシン制御部１１１は、仮想マシン２００をスタンバイ仮想マシンとして起動するように指示を受けると、設定情報記憶領域１２１から仮想マシン２００を運用仮想マシンとして起動するために必要な情報を取得し、取得した情報に応じた起動パラメータを指定して仮想マシン２００を起動する。そして、起動した仮想マシン２００を識別するためのプロセスＩＤ等の識別情報と共に仮想マシン２００をスタンバイ仮想マシンとして起動した旨を仮想マシン情報記憶領域１２２に記録し、起動した仮想マシン２００の生存監視を開始する。
【００６６】
このとき、設定情報記憶領域１２１において、仮想マシン２００をスタンバイ仮想マシンとして起動するときは運用仮想マシンからプロセス間通信を通じて実行頻度情報を取得させるべき旨の設定がなされている場合は、仮想マシン情報記憶領域１２２を参照して運用仮想マシンの識別情報を取得し、この識別情報が示す仮想マシンとスタンバイ仮想マシンとして起動した仮想マシンの間で実行頻度情報の受け渡しがおこなわれるように制御する。
【００６７】
次に、本実施例に係る仮想マシン２００の構成について説明する。図５は、本実施例に係る仮想マシン２００の構成を示す機能ブロック図である。同図に示すように、仮想マシン２００は、プログラム領域２１０と、データ領域２２０と、仮想マシンメモリ領域２３０と、ネイティブコード格納領域２４０とを有する。
【００６８】
プログラム領域２１０は、仮想マシン２００の機能を実現するための命令列等からなる領域であり、実行頻度管理部２１１と、プログラム実行部２１２と、最適化部２１３とを有する。実行頻度管理部２１１は、実行頻度情報を管理する処理部であり、実行頻度計数部２１１ａと、実行頻度情報入力部２１１ｂと、実行頻度情報出力部２１１ｃとを有する。
【００６９】
実行頻度計数部２１１ａは、プログラム実行部２１２にて手続きが呼び出された頻度を手続きごとに集計する処理部である。実行頻度情報入力部２１１ｂは、実行頻度情報を、ファイルからの読み込み、もしくは、プロセス間通信によって外部から入力する処理部であり、実行頻度情報出力部２１１ｃは、実行頻度情報を、ファイルへの書き出し、もしくは、プロセス間通信によって外部へ出力する処理部である。
【００７０】
プログラム実行部２１２は、中間コードからなるアプリケーションを実行する処理部であり、プログラムロード部２１２ａと、インタープリータ２１２ｂと、ネイティブコード呼出部２１２ｃと、実行制御部２１２ｄとを有する。
【００７１】
プログラムロード部２１２ａは、アプリケーションを構成するモジュールであるクラスファイルを読み込んで仮想マシンメモリ領域２３０に展開する処理部である。インタープリータ２１２ｂは、仮想マシンメモリ領域２３０に展開された中間コードを実行する処理部であり、ネイティブコード呼出部２１２ｃは、最適化部２１３によって動的コンパイルされたネイティブコードを呼び出すことによって手続きを実行する処理部である。
【００７２】
実行制御部２１２ｄは、プログラム実行部２１２を全体制御する制御部であり、プログラムロード部２１２ａにロードさせたプログラムに含まれる中間コードをインタープリータ２１２ｂに順次実行させ、既に動的コンパイルされたネイティブコードが存在する手続きの呼び出しに出くわした場合は、ネイティブコード呼出部２１２ｃにそのネイティブコードを呼び出させる。
【００７３】
また、実行制御部２１２ｄは、プログラムの実行中に手続きの呼び出しに出くわすたびにその手続きの情報を実行頻度計数部２１１ａに通知して実行頻度情報を更新させ、さらに、その手続きのネイティブコードが存在せず、かつ、実行頻度が起動パラメータにて指定された閾値よりも高ければ、最適化部２１３の動的コンパイラ２１３ｂにも同じ情報を引き渡して動的コンパイルを実行させる。
【００７４】
また、実行制御部２１２ｄは、プログラムロード部２１２ａにクラスファイルを読み込ませた後、そのクラスファイルが実行頻度情報の収集時と同一であるかを確認し、改修が認められる場合はそのクラスファイルに含まれる手続きに関する情報を実行頻度情報から削除する。改修によって実行頻度情報の収集時と、処理手続きが変化している可能性があるためである。
【００７５】
最適化部２１３は、動的コンパイルを実現する処理部であり、コンパイル対象選択部２１３ａと、動的コンパイラ２１３ｂと、負荷判定部２１３ｃとを有する。
【００７６】
コンパイル対象選択部２１３ａは、実行頻度情報入力部２１１ｂによって外部から実行頻度情報が取得され、かつ、起動パラメータにおいてコンパイルタイミングとして「起動直後」が指定されている場合に、実行頻度が起動パラメータにて指定された閾値よりも高く、動的コンパイルが行われていない手続きを選択し、選択した手続きの情報を動的コンパイラ２１３ｂに引き渡して動的コンパイルを実行させる処理部である。
【００７７】
動的コンパイラ２１３ｂは、実行頻度が起動パラメータにて指定された閾値よりも高い手続きを動的コンパイルする処理部である。なお、動的コンパイラ２１３ｂは、負荷判定部２１３ｃにてＣＰＵの負荷が高いと判定された場合は、動的コンパイルを中止する。負荷判定部２１３ｃは、ＣＰＵの負荷が起動パラメータにて指定された閾値よりも高いか否かを判定する処理部である。
【００７８】
データ領域２２０は、プログラム領域２１０の各部が各種処理を実現するために必要なデータを保持する領域であり、設定情報記憶領域２２１と、実行頻度情報記憶領域２２２と、実行頻度カウンタ記憶領域２２３と、変換済手続情報記憶領域２２４とを有する。設定情報記憶領域１２１は、各種設定情報を保持する領域であり、指定された起動パラメータもここに保持される。
【００７９】
実行頻度情報記憶領域２２２は、外部から読み込まれた実行頻度情報を保持する領域である。実行頻度情報は、実行頻度データとモジュールデータとして保持される。図６−１は、実行頻度データのデータ構成の一例を示す図である。同図に示すように、実行頻度データは、手続き識別子と、実行頻度と、モジュールＩＤという項目を有し、手続きごとにデータが作成される。
【００８０】
手続き識別子は、手続きを識別するための識別子である。Ｊａｖａ（登録商標）では、クラスファイルと呼ばれるモジュール内で戻り値や引数の型が異なる同名の手続きを複数定義することができるため、手続き識別子は、手続き名に戻り値や引数の型を付加した形式となっている。例えば、１行目の「ｉｎｔ  Ｃｌａｓｓ１．ｆｕｎｃ１（ｌｏｎｇ，  Ｓｔｒｉｎｇ）」という手続きは、Ｃｌａｓｓ１というクラスファイル内で定義されたｆｕｎｃ１という名前の手続きであって、ｌｏｎｇとＳｔｒｉｎｇという型の２つの引数をもち、ｉｎｔという型の戻り値を返すことを示している。
【００８１】
実行頻度は、当該の手続きの実行頻度を示す数値である。この数値は、一定時間内の平均実行回数であってもよいし、延べ実行回数であってもよい。モジュールＩＤは、当該の手続きが定義されているクラスファイルの識別番号であり、モジュールデータのモジュールＩＤと対応する。
【００８２】
図６−２は、モジュールデータのデータ構成の一例を示す図である。同図に示すように、モジュールデータは、モジュールＩＤと、モジュール名と、サイズと、チェックサムという項目を有し、クラスファイルごとにデータが作成される。
【００８３】
モジュールＩＤは、当該のクラスファイルの識別番号であり、モジュール名は、クラスファイルの存在場所を示す名称である。サイズは、クラスファイルのファイルサイズであり、チェックサムは、クラスファイルの同一性を確認するための符号値である。
【００８４】
図５の説明に戻って、実行頻度カウンタ記憶領域２２３は、仮想マシン２００の起動後に、実行頻度計数部２１１ａによって集計された実行頻度情報を保持する領域である。実行頻度情報は、実行頻度情報記憶領域２２２と同様に、実行頻度データとモジュールデータとして保持される。
【００８５】
変換済手続情報記憶領域２２４は、動的コンパイルが完了した手続きの情報を保持する領域である。そして、仮想マシンメモリ領域２３０は、プログラム実行部２１２によって実行されるアプリケーションを構成するクラスファイル等が展開される領域であり、ネイティブコード格納領域２４０は、最適化部２１３によって動的コンパイルされて生成されたネイティブコードが格納される領域である。
【００８６】
次に、仮想マシン２００の処理手順について説明する。図７は、仮想マシン２００の起動時の処理手順を示すフローチャートである。同図は、仮想マシン２００が、起動後に外部から実行頻度情報を取得し、その実行頻度情報において実行頻度が高い手続きを全て動的コンパイルするまでの処理手順を示している。
【００８７】
同図に示すように、仮想マシン２００は、起動時に指定された起動パラメータにおいて実行頻度情報を外部から取得することを求められていた場合は（ステップＳ１０１肯定）、以下の一連の処理を行う。なお、起動パラメータにおいて実行頻度情報を外部から取得することを求められていなかった場合は（ステップＳ１０１否定）、以下の一連の処理を行うことなく他の処理へ移行する。
【００８８】
起動パラメータにおいて実行頻度情報を外部から取得することを求められていた場合、実行頻度情報入力部２１１ｂは、起動パラメータにて指定された方式で実行頻度情報を外部から取得し、実行頻度情報記憶領域２２２に格納する（ステップＳ１０２）。
【００８９】
続いて、コンパイル対象選択部２１３ａが、実行頻度情報記憶領域２２２から実行頻度が起動パラメータにて指定された頻度よりも多く、まだネイティブコードに変換されていない手続きの情報を取得する（ステップＳ１０３）。ここで、該当する手続きが存在しなければ（ステップＳ１０４否定）、コンパイル完了通知をアプリケーションサーバ１００へ送信した後（ステップＳ１１０）、一連の処理を完了して、他の処理へ移行する。
【００９０】
該当する手続きが存在し、その手続きの情報を取得できた場合（ステップＳ１０４肯定）、コンパイル対象選択部２１３ａは、取得した情報を動的コンパイラ２１３ｂに引き渡してその手続きをネイティブコードに変換するように要求する。
【００９１】
要求を受けた動的コンパイラ２１３ｂは、まず、負荷判定部２１３ｃにＣＰＵの負荷が起動パラメータにて指定された閾値よりも高いかどうかを問い合せる。ここで、ＣＰＵの負荷が起動パラメータにて指定された閾値よりも高かった場合は（ステップＳ１０５否定）、動的コンパイラ２１３ｂは、手続きの変換を中止してその旨をコンパイル対象選択部２１３ａへ通知し、コンパイル対象選択部２１３ａは、ステップＳ１０３から処理を再開する。
【００９２】
ＣＰＵの負荷が起動パラメータにて指定された閾値よりも低かった場合は（ステップＳ１０５肯定）、動的コンパイラ２１３ｂは、実行制御部２１２ｄに変換対象の手続きを含むモジュールのロードを依頼する。
【００９３】
実行制御部２１２ｄは、依頼を受けると、プログラムロード部２１２ａに指示して、依頼されたモジュールをロードさせる（ステップＳ１０６）。そして、ロードされたモジュールのファイルサイズとチェックサムを求め、実行頻度情報記憶領域２２２に格納されている当該のモジュールのファイルサイズとチェックサムと比較する。
【００９４】
ここで、ファイルサイズとチェックサムの一方でも一致しない場合は（ステップＳ１０７肯定）、モジュールが更新されていると判断して、実行頻度情報記憶領域２２２から当該のモジュールに関連する情報を削除し（ステップＳ１０８）、動的コンパイラ２１３ｂにその旨を通知する。
【００９５】
モジュールが更新されていると判断された場合、動的コンパイラ２１３ｂは、手続きの変換を中止してその旨をコンパイル対象選択部２１３ａへ通知し、コンパイル対象選択部２１３ａは、ステップＳ１０３から処理を再開する。
【００９６】
一方、実行制御部２１２ｄから正常にモジュールがロードされた旨の通知があった場合、動的コンパイラ２１３ｂは、指定された手続きをネイティブコードに変換してネイティブコード格納領域２４０に格納し、その旨を変換済手続情報記憶領域２２４に記録する（ステップＳ１０９）。そして、動的コンパイラ２１３ｂは、変換を完了した旨をコンパイル対象選択部２１３ａへ通知し、コンパイル対象選択部２１３ａは、次の手続きの情報を取得するため、ステップＳ１０３から処理を再開する。
【００９７】
図８は、仮想マシン２００の手続き呼び出し時の処理手順を示すフローチャートである。同図は、仮想マシン２００が、実行中のアプリケーションの実行中において手続きの呼び出しが発生した後、その手続きに相当する処理の実行を完了するまでの処理手順を示している。
【００９８】
同図に示すように、実行制御部２１２ｄは、実行中のアプリケーションにおいて手続きの呼び出しが発生すると（ステップＳ２０１）、手続きを含むモジュールがロードされていなければ、プログラムロード部２１２ａに指示してこれをロードさせる（ステップＳ２０２）。そして、呼び出された手続きの情報を実行頻度計数部２１１ａに引き渡して、後述する実行頻度情報更新処理を実行させる（ステップＳ２０３）。
【００９９】
続いて、実行制御部２１２ｄは、変換済手続情報記憶領域２２４を参照し、呼び出された手続きに対応するネイティブコードが既に存在する場合は（ステップＳ２０４肯定）、ネイティブコード呼出部２１２ｃに指示してそのネイティブコードを呼び出させて処理を完了する（ステップＳ２１２）。
【０１００】
呼び出された手続きに対応するネイティブコードが存在しない場合は（ステップＳ２０４否定）、実行制御部２１２ｄは、外部から取得した実行頻度情報を記憶する実行頻度情報記憶領域２２２を参照し、手続きの実行頻度が起動パラメータにて指定された頻度よりも多いか否かを確認する。
【０１０１】
ここで、実行頻度が起動パラメータにて指定された頻度よりも少ない場合は（ステップＳ２０５否定）、ステップＳ２０８へ遷移して、仮想マシン２００の起動後の手続きの実行頻度が起動パラメータにて指定された頻度よりも多いか否かを確認する。
【０１０２】
実行頻度が起動パラメータにて指定された頻度よりも多い場合（ステップＳ２０５肯定）、実行制御部２１２ｄは、呼び出された手続きを含むモジュールのサイズとチェックサムを求め、実行頻度情報記憶領域２２２のモジュールデータに記録されている同モジュールのファイルサイズおよびチェックサムと比較する。
【０１０３】
そして、サイズとチェックサムの一方でも一致しない場合は（ステップＳ２０６肯定）、モジュールが更新されていると判断して、実行頻度情報記憶領域２２２から当該のモジュールに関する情報を削除し（ステップＳ２０７）、ステップＳ２０８へ遷移して、仮想マシン２００の起動後の手続きの実行頻度が起動パラメータにて指定された頻度よりも多いか否かを確認する。
【０１０４】
また、サイズとチェックサムの双方が一致する場合は（ステップＳ２０６否定）、モジュールが更新されていないと判断して、呼び出された手続きに関する情報を動的コンパイラ２１３ｂに引き渡してその手続きをネイティブコードに変換するように要求する。
【０１０５】
ステップＳ２０５において実行頻度が起動パラメータにて指定された頻度よりも少なかった場合（ステップＳ２０５否定）、もしくは、ステップＳ２０６においてモジュールが更新されていると判断された場合（ステップＳ２０６肯定）、実行制御部２１２ｄは、実行頻度カウンタ記憶領域２２３を参照し、仮想マシン２００の起動後の手続きの実行頻度が起動パラメータにて指定された頻度よりも多いか否かを確認する。
【０１０６】
ここで、実行頻度が起動パラメータにて指定された頻度よりも少ない場合は（ステップＳ２０８否定）、インタープリータ２１２ｂに手続きを中間コードのまま実行させて処理を完了する（ステップＳ２１１）。一方、実行頻度が起動パラメータにて指定された頻度よりも多い場合は（ステップＳ２０８肯定）、呼び出された手続きに関する情報を動的コンパイラ２１３ｂに引き渡してその手続きをネイティブコードに変換するように要求する。
【０１０７】
要求を受けた動的コンパイラ２１３ｂは、負荷判定部２１３ｃにＣＰＵの負荷が起動パラメータにて指定された閾値よりも高いかどうかを問い合せる。ここで、ＣＰＵの負荷が起動パラメータにて指定された閾値よりも高かった場合は（ステップＳ２０９否定）、動的コンパイラ２１３ｂは、手続きの変換を中止してその旨を実行制御部２１２ｄへ通知し、実行制御部２１２ｄは、インタープリータ２１２ｂに手続きを中間コードのまま実行させて処理を完了する（ステップＳ２１１）。
【０１０８】
ＣＰＵの負荷が起動パラメータにて指定された閾値よりも低かった場合は（ステップＳ２０９肯定）、指定された手続きをネイティブコードに変換してネイティブコード格納領域２４０に格納し、その旨を変換済手続情報記憶領域２２４に記録する（ステップＳ２１０）。そして、動的コンパイラ２１３ｂは、その旨を実行制御部２１２ｄへ通知し、実行制御部２１２ｄは、ネイティブコード呼出部２１２ｃに指示して変換されたネイティブコードを呼び出させて処理を完了する（ステップＳ２１２）。
【０１０９】
図９は、実行頻度情報更新処理の処理手順を示すフローチャートである。同図は、実行中のアプリケーションにおいて手続きの呼び出しが発生するたびに、実行頻度計数部２１１ａが、実行頻度情報を更新する処理の処理手順を示している。
【０１１０】
実行頻度計数部２１１ａは、呼び出された手続きが、実行頻度カウンタ記憶領域２２３に登録されていなければ（ステップＳ３０１肯定）、手続きを含むモジュールのファイルサイズとチェックサムを取得して（ステップＳ３０２）、実行頻度データとモジュールデータに情報を登録する（ステップＳ３０３）。
【０１１１】
一方、呼び出された手続きが、実行頻度カウンタ記憶領域２２３に登録されていれば（ステップＳ３０１否定）、実行頻度データの実行頻度を更新する（ステップＳ３０４）。
【０１１２】
上記実施例で説明してきたアプリケーションサーバ１００および仮想マシン２００は、あらかじめ用意されたプログラムをコンピュータで実行することによって実現される。そこで、以下では、図１０をもちいて、かかるプログラムを実行するコンピュータの一例を説明する。
【０１１３】
図１０は、アプリケーションサーバシステム１０を実行するコンピュータ１０００を示す機能ブロック図である。このコンピュータ１０００は、各種演算処理を実行するＣＰＵ（Central Processing Unit）１０１０と、ユーザからのデータの入力を受け付ける入力装置１０２０と、各種情報を表示するモニタ１０３０と、各種プログラム等を記録した記録媒体からプログラム等を読み取る媒体読取り装置１０４０と、ネットワークを介して他のコンピュータとの間でデータの授受をおこなうネットワークインターフェース装置１０５０と、各種情報を一時記憶するＲＡＭ（Random Access Memory）１０６０と、ハードディスク装置１０７０とバス１０８０で接続して構成される。
【０１１４】
そして、ハードディスク装置１０７０には、アプリケーションサーバプログラム１０７１と、仮想マシンプログラム１０７２と、Ｊａｖａ（登録商標）アプリケーションプログラム１０７３と、各種設定情報からなる設定情報ファイル１０７４が記憶される。
【０１１５】
そして、ＣＰＵ１０１０がアプリケーションサーバプログラム１０７１をハードディスク装置１０７０から読み出してＲＡＭ１０６０に展開することにより、アプリケーションサーバプログラム１０７１は、アプリケーションサーバ１００として機能するようになる。
【０１１６】
同様に、ＣＰＵ１０１０が仮想マシンプログラム１０７２をハードディスク装置１０７０から読み出してＲＡＭ１０６０に展開することにより、仮想マシンプログラム１０７２は、仮想マシン２００として機能するようになり、ＣＰＵ１０１０がＪａｖａ（登録商標）アプリケーションプログラム１０７３をハードディスク装置１０７０から読み出してＲＡＭ１０６０に展開することにより、Ｊａｖａ（登録商標）アプリケーションプログラム１０７３は、Ｊａｖａ（登録商標）アプリケーション３００として機能するようになる。
【０１１７】
そして、アプリケーションサーバ１００、仮想マシン２００およびＪａｖａ（登録商標）アプリケーション３００は、設定情報ファイル１０７４から読み出した情報等を適宜ＲＡＭ１０６０に記憶させ、ＲＡＭ１０６０に記憶させたデータ等に基づいて各種データ処理を実行する。
【０１１８】
なお、上記のアプリケーションサーバプログラム１０７１、仮想マシンプログラム１０７２およびＪａｖａ（登録商標）アプリケーションプログラム１０７３については、必ずしもハードディスク装置１０７０に格納されている必要はなく、ＣＤ−ＲＯＭ等の記憶媒体に記憶されたこれらのプログラムを、コンピュータ１０００が読み出して実行するようにしてもよい。また、公衆回線、インターネット、ＬＡＮ（Local Area Network）、ＷＡＮ（Wide Area Network）等を介してコンピュータ１０００に接続される他のコンピュータ（またはサーバ）等にこれらのプログラムを記憶させておき、コンピュータ１０００がこれらからプログラムを読み出して実行するようにしてもよい。
【０１１９】
上述してきたように、本実施例では、実行頻度情報を外部から取得できるように仮想マシン２００を構成したので、仮想マシン２００が起動されてから動的コンパイルが開始されるまでの時間が大きく短縮される。
【０１２０】
また、本実施例では、仮想マシン２００が実行頻度情報を外部を取得した場合に、その実行頻度情報から実行頻度が所定の値よりも大きい手続きを選択して、アプリケーションサーバプログラムがリクエストの処理を開始する前に、選択した手続きの動的コンパイルを一括実行するように構成したので、選択した手続きの変換処理にともなう負荷によってアプリケーションの実行に支障が生じることを防止できる。
【０１２１】
また、本実施例では、手続きが呼び出されたタイミングでその手続きの動的コンパイルを実行するように構成したので、動的コンパイルにともなう負荷の発生を分散させ、動的コンパイルにともなう負荷の発生によってアプリケーションの実行に支障がでることを防止することができる。
【０１２２】
また、本実施例では、ＣＰＵの負荷が所定の値よりも大きい場合は、動的コンパイルを実行しないように構成したので、動的コンパイルにともなう負荷の発生によってアプリケーションの実行に支障がでることを防止することができる。
【０１２３】
なお、上記の実施例では、中間コードを実行する仮想マシンの一例としてＪａｖａ（登録商標）の中間コードであるバイトコードを実行する仮想マシンをもちいて説明をおこなったが、本発明は、他の種類の中間コードを実行する仮想マシンにおいても有効である。
【０１２４】
（付記１）中間コードからなるアプリケーションを実行する仮想マシンプログラムと、
前記仮想マシンプログラムの起動を制御するアプリケーションサーバプログラムとをコンピュータに実行させるアプリケーションサーバシステムであって、
前記アプリケーションサーバプログラムは、
前記アプリケーションにおける手続きの実行頻度を集計した実行頻度情報を外部から取得するべき旨と、該実行頻度情報に基づいて実行頻度が所定の値よりも高い手続きを中間コードからネイティブコードにコンパイルすべき旨とを指定して前記仮想マシンプログラムを起動する仮想マシン制御手段を備え、
前記仮想マシンプログラムは、
前記アプリケーションサーバプログラムの指定に従って前記実行頻度情報を外部から取得する実行頻度情報入力手段と、
前記実行頻度情報入力手段によって取得された前記実行頻度情報から実行頻度が所定の値よりも大きい手続きを選択するコンパイル対象選択手段と、
前記コンパイル対象選択手段により選択された手続きをネイティブコードにコンパイルするコンパイル手段と、
実行中の前記アプリケーションにおいて前記コンパイル手段によってコンパイルされたネイティブコードが存在する手続きが呼び出された場合に、中間コードに代えて前記ネイティブコードを実行する実行制御手段と
を備えたことを特徴とするアプリケーションサーバシステム。
【０１２５】
（付記２）前記コンパイル対象選択手段は、選択した全ての手続きが前記コンパイル手段によってネイティブコードにコンパイルされた後に、前記アプリケーションサーバプログラムにその旨を通知することを特徴とする付記１に記載のアプリケーションサーバシステム。
【０１２６】
（付記３）前記コンパイル手段は、前記コンパイル対象選択手段より選択された手続きをネイティブコードにコンパイルする代わりに、前記アプリケーションを実行中に手続きが呼び出された場合に、前記実行頻度情報を参照して該手続きの実行頻度を取得し、取得された実行頻度が所定の値よりも高ければ、該手続きを中間コードからネイティブコードにコンパイルすることを特徴とする付記１または２に記載のアプリケーションサーバシステム。
【０１２７】
（付記４）前記コンパイル手段は、ＣＰＵの負荷が所定の値よりも高い場合は、手続きをネイティブコードにコンパイルする処理を行わないことを特徴とする付記１〜３のいずれか一つに記載のアプリケーションサーバシステム。
【０１２８】
（付記５）中間コードからなるアプリケーションを実行中に該アプリケーションにおける手続きの呼び出し頻度を計数して実行頻度情報として記憶手段に記憶させる計数手段と、
前記実行頻度情報において実行頻度の高い手続きを中間コードからネイティブコードに変換するコンパイル手段と、
実行中の前記アプリケーションにおいて前記コンパイル手段によってコンパイルされたネイティブコードが存在する手続きが呼び出された場合に、中間コードに代えて前記ネイティブコードを実行する実行制御手段と
をコンピュータに実行させる仮想マシンプログラムであって、
前記実行頻度情報を外部から取得する実行頻度情報入力手段をさらにコンピュータに実行させることを特徴とする仮想マシンプログラム。
【０１２９】
（付記６）前記実行頻度情報入力手段によって取得された前記実行頻度情報から実行頻度が所定の値よりも大きい手続きを選択し、選択した手続きをネイティブコードに変換する処理を前記コンパイル手段に実行させるコンパイル対象選択手段をさらにコンピュータに実行させることを特徴とする付記５に記載の仮想マシンプログラム。
【０１３０】
（付記７）前記コンパイル手段は、前記アプリケーションを実行中に手続きが呼び出された場合に、前記実行頻度情報を参照して該手続きの実行頻度を取得し、取得された実行頻度が所定の値よりも高ければ、該手続きを中間コードからネイティブコードにコンパイルすることを特徴とする付記５に記載の仮想マシンプログラム。
【０１３１】
（付記８）前記コンパイル手段は、ＣＰＵの負荷が所定の値よりも高い場合は、手続きをネイティブコードにコンパイルする処理を行わないことを特徴とする付記５〜７のいずれか一つに記載の仮想マシンプログラム。
【０１３２】
（付記９）前記計数手段は、前記実行頻度情報に手続きを含むモジュールのファイルサイズを含めて記憶させ、
前記実行制御手段は、手続きを含むモジュールをロードする場合に、ロードしたモジュールのファイルサイズと前記実行頻度情報に記憶された該モジュールのファイルサイズとを照合し、両者の値が相違している場合は、前記実行頻度情報における該モジュールに関する情報を削除することを特徴とする付記５〜８のいずれか一つに記載の仮想マシンプログラム。
【０１３３】
（付記１０）前記計数手段は、前記実行頻度情報に手続きを含むモジュールの同一性を確認するための符号値を含めて記憶させ、
前記実行制御手段は、手続きを含むモジュールをロードする場合に、ロードしたモジュールの符号値と前記実行頻度情報に記憶された該モジュールの符号値とを照合し、両者の値が相違している場合は、前記実行頻度情報における該モジュールに関する情報を削除することを特徴とする付記５〜８のいずれか一つに記載の仮想マシンプログラム。
【産業上の利用可能性】
【０１３４】
以上のように、本発明に係るアプリケーションサーバシステムおよび仮想マシンプログラムは、中間コードからなるアプリケーションの一部をネイティブコードに変換して実行速度を改善させる場合に有用であり、特に、実行頻度の高い手続きを変換する処理を開始する時期を適切に調整することができ、さらに、この変換処理にともなう負荷によってアプリケーションの実行に支障が生じることを防止することが必要な場合に適している。
【図面の簡単な説明】
【０１３５】
【図１】アプリケーションサーバシステムの構成を示すブロック図である。
【図２】本実施例に係るアプリケーションサーバシステムにおける仮想マシンの起動方法を説明するための図である。
【図３−１】仮想マシンを運用仮想マシンとして起動する場合の起動パラメータの一例を示す図である。
【図３−２】仮想マシンをリカバリ仮想マシンとして起動する場合の起動パラメータの一例を示す図である。
【図３−３】仮想マシンをスタンバイ仮想マシンとして起動する場合の起動パラメータの一例を示す図である。
【図４】本実施例に係るアプリケーションサーバの構成を示す機能ブロック図である。
【図５】本実施例に係る仮想マシンの構成を示す機能ブロック図である。
【図６−１】実行頻度データのデータ構成の一例を示す図である。
【図６−２】モジュールデータのデータ構成の一例を示す図である。
【図７】仮想マシンの起動時の処理手順を示すフローチャートである。
【図８】仮想マシンの手続き呼び出し時の処理手順を示すフローチャートである。
【図９】実行頻度情報更新処理の処理手順を示すフローチャートである。
【図１０】アプリケーションサーバシステムを実行するコンピュータを示す機能ブロック図である。
【符号の説明】
【０１３６】
１    サーバ装置
２    端末装置
１０    アプリケーションサーバシステム
２０    ブラウザ
１００    アプリケーションサーバ
１１０    プログラム領域
１１１    仮想マシン制御部
１１２    アプリケーション制御部
１１３    リクエスト制御部
１２０    データ領域
１２１    設定情報記憶領域
１２２    仮想マシン情報記憶領域
２００    仮想マシン
２０１    運用仮想マシン
２０２    リカバリ仮想マシン
２０３    スタンバイ仮想マシン
２１０    プログラム領域
２１１    実行頻度管理部
２１１ａ  実行頻度計数部
２１１ｂ  実行頻度情報入力部
２１１ｃ  実行頻度情報出力部
２１２    プログラム実行部
２１２ａ  プログラムロード部
２１２ｂ  インタープリータ
２１２ｃ  ネイティブコード呼出部
２１２ｄ  実行制御部
２１３    最適化部
２１３ａ  コンパイル対象選択部
２１３ｂ  動的コンパイラ
２１３ｃ  負荷判定部
２２０    データ領域
２２１    設定情報記憶領域
２２２    実行頻度情報記憶領域
２２３    実行頻度カウンタ記憶領域
２２４    変換済手続情報記憶領域
２３０    仮想マシンメモリ領域
２４０    ネイティブコード格納領域
３００    Ｊａｖａ（登録商標）アプリケーション
１０００    コンピュータ
１０１０    ＣＰＵ
１０２０    入力装置
１０３０    モニタ
１０４０    媒体読取り装置
１０５０    ネットワークインターフェース装置
１０６０    ＲＡＭ
１０７０    ハードディスク装置
１０７１    アプリケーションサーバプログラム
１０７２    仮想マシンプログラム
１０７３    Ｊａｖａ（登録商標）アプリケーションプログラム
１０７４    設定情報ファイル
１０８０    バス
【図１】
0005167589.tif 000002
【図２】
0005167589.tif 000003
【図３−１】
0005167589.tif 000004
【図３−２】
0005167589.tif 000005
【図３−３】
0005167589.tif 000006
【図４】
0005167589.tif 000007
【図５】
0005167589.tif 000008
【図６−１】
0005167589.tif 000009
【図６−２】
0005167589.tif 000010
【図７】
0005167589.tif 000011
【図８】
0005167589.tif 000012
【図９】
0005167589.tif 000013
【図１０】
0005167589.tif 000014