(57)【要約】【課題】  ネイティブコードを適切に利用し、コンピュータプログラムの実行速度を向上させることを目的とする。【解決手段】  アプリケーションを実行する情報処理装置であって、前記アプリケーションをネイティブコードにコンパイルするコンパイル手段と、前記コンパイルによって生成されたネイティブコード群を保持する保持手段と、前記情報処理装置の状態を取得する取得手段と、前記情報処理装置の状態に基づいて、前記ネイティブコード群からネイティブコードを選択して利用する利用手段と、を有することを特徴とする。【選択図】  図５
2019152911.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションを実行する情報処理装置であって、
前記アプリケーションをネイティブコードにコンパイルするコンパイル手段と、
前記コンパイルによって生成されたネイティブコード群を保持する保持手段と、
前記情報処理装置の状態を取得する取得手段と、
前記情報処理装置の状態に基づいて、前記ネイティブコード群からネイティブコードを選択して利用する利用手段と、を有することを特徴とする情報処理装置。
【請求項２】
前記情報処理装置で実行するプログラムを監視する監視手段を更に有し、
前記コンパイル手段は、前記監視手段による監視の結果に基づいて、前記ネイティブコード群を作成することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記利用手段は、前記ネイティブコード群の利用を行う条件と前記情報処理装置の状態とに基づき、前記ネイティブコード群からネイティブコードを選択して利用することを特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項４】
前記利用手段は、前記ネイティブコード群の利用を行う条件と前記情報処理装置の状態と前記監視の結果とに基づき、前記ネイティブコード群からネイティブコードを選択して利用することを特徴とする請求項２に記載の情報処理装置。
【請求項５】
前記利用手段は、前記ネイティブコード群の利用を停止する条件に基づき、前記ネイティブコード群の利用を停止することを特徴とする請求項１乃至４のいずれか１項に記載の情報処理装置。
【請求項６】
前記利用手段は、前記ネイティブコード群の利用を停止する条件と前記開始の結果とに基づき、前記ネイティブコード群の利用を停止することを特徴とする請求項２に記載の情報処理装置。
【請求項７】
前記利用手段は、前記ネイティブコード群を削除する条件と前記監視の結果に基づき、前記ネイティブコード群を削除することを特徴とする請求項２に記載の情報処理装置。
【請求項８】
前記コンパイル手段は、前記ネイティブコード群を利用しているか否かに関する情報に基づき、前記コンパイルの動作を変えることを特徴とする請求項１乃至７のいずれか１項に記載の情報処理装置。
【請求項９】
前記保持手段は、前記ネイティブコード群を利用しているか否かに関する情報に基づき、
複数のネイティブコード群を保持することを特徴とする請求項８に記載の情報処理装置。
【請求項１０】
アプリケーションを実行する情報処理装置の情報処理方法であって、
コンパイル手段が、前記アプリケーションをネイティブコードにコンパイルするコンパイル工程と、
保持手段が、前記コンパイルによって生成されたネイティブコード群を保持する保持工程と、
取得手段が、前記情報処理装置の状態を取得する取得工程と、
利用手段が、前記情報処理装置の状態に基づいて、前記ネイティブコード群からネイティブコードを選択して利用する利用工程と、を有することを特徴とする情報処理方法。
【請求項１１】
コンピュータを、
アプリケーションを実行する情報処理装置であって、
前記アプリケーションをネイティブコードにコンパイルするコンパイル手段と、
前記コンパイルによって生成されたネイティブコード群を保持する保持手段と、
前記情報処理装置の状態を取得する取得手段と、
前記情報処理装置の状態に基づいて、前記ネイティブコード群からネイティブコードを選択して利用する利用手段と、を有することを特徴とする情報処理装置として機能させるためのコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、中間コードで記述されたプログラムを実行するための情報処理装置、情報処理方法およびコンピュータプログラムに関する。
【背景技術】
【０００２】
従来から、中間コードにより記述されたプログラムを実行するための仮想マシン技術が知られている。仮想マシンは、仮想マシン用のコードである中間コードを実行するインタプリタを備える。しかし、インタプリタを用いたプログラムの実行処理速度は遅い。そこで、中間コードをネイティブコードに変換する方法（以下、コンパイルと記す）が普及している。ネイティブコードは、仮想マシンが動作しているＣＰＵで直接実行可能なデータ形式であり、コンパイル後のプログラムは高速に動作する。
【０００３】
コンパイル方法としては、ＡＯＴ（Ａｈｅａｄ  Ｏｆ  Ｔｉｍｅ）コンパイルとＪＩＴ（Ｊｕｓｔ  Ｉｎ  Ｔｉｍｅ）コンパイルがある。ＡＯＴコンパイルでは、仮想マシンがプログラムをロードする前にコンパイル処理がなされる。しかし、ＡＯＴコンパイルでは実行状態に応じたコンパイルができないため、最適なコンパイルを実現できない。
【０００４】
一方、ＪＩＴコンパイルでは、中間コードでプログラムをロードした後、実行時にネイティブコードにコンパイルする。そのため、コンパイル後の動作は速いものの、最初の実行時にはコンパイルの処理が必要なため、実行時の負荷が高くなってしまう。そこで、ＪＩＴコンパイルの処理の負荷を低減する方法として、特許文献１および特許文献２には、ＪＩＴコンパイル結果を再利用する方法が開示されている
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００１−２７３１５１号公報
【特許文献２】特開２０１１−２２１６０９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
特許文献１では、ＪＩＴコンパイルされたプログラムのネイティブコードを記憶装置に保持しておき、次回起動時に参照する。しかし、ＪＩＴコンパイルを行ったときのデバイスの状態と次回起動時のデバイスの状態が異なると、保持するネイティブコードが再利用できない。
【０００７】
特許文献２では、プログラム中のメソッド１つに対して、複数のネイティブコードを保持し、起動中の状態に応じてネイティブコードを選択して再利用する。しかし、ネイティブコードの参照はメソッド単位で行うため、プログラム中の各メソッドを実行するたびに保持するネイティブコード群から選択する処理が必要となり、プログラムの実行速度が遅くなることがある。
【０００８】
本発明は上記の課題に鑑みてなされたものであり、ネイティブコードを適切に利用し、コンピュータプログラムの実行速度を向上させることを目的とする。
【課題を解決するための手段】
【０００９】
アプリケーションを実行する情報処理装置であって、前記アプリケーションをネイティブコードにコンパイルするコンパイル手段と、前記コンパイルによって生成されたネイティブコード群を保持する保持手段と、前記情報処理装置の状態を取得する取得手段と、前記情報処理装置の状態に基づいて、前記ネイティブコード群からネイティブコードを選択して利用する利用手段と、を有することを特徴とする。
【発明の効果】
【００１０】
本発明によれば、ネイティブコードを適切に利用し、コンピュータプログラムの実行速度を向上させることが出来る。
【図面の簡単な説明】
【００１１】
【図１】情報処理装置のハードウェア構成の一例を示す概略図である。
【図２】情報処理装置上に構築するシステム構成の一例を示す模式図である。
【図３】仮想マシンの構成を示す模式図である。
【図４】スナップショットの構成を示す模式図である。
【図５】実施形態１にかかる情報処理装置の起動処理のフローチャートである。
【図６】実施形態１にかかるスナップショットの作成処理のフローチャートである。
【図７】実施形態１にかかるスナップショットの適合度の確認処理のフローチャートである。
【図８】スナップショットを管理するテーブルの一例を示す図である。
【図９】実施形態２にかかる情報処理装置のプログラム実行処理のフローチャートである。
【図１０】実施形態３にかかるＪＩＴコンパイルオプションの例を示す図である。
【図１１】実施形態３にかかる仮想マシンの構成を示す模式図である。
【図１２】実施形態３にかかるＪＩＴコンパイルオプションの複雑な例を示す図である。
【図１３】実施形態４にかかるＪＩＴコンパイルオプションの例を示す図である。
【図１４】実施形態４にかかる仮想マシンの構成を示す模式図である。
【図１５】実施形態４にかかるスナップショットの作成処理のフローチャートである。
【発明を実施するための形態】
【００１２】
以下、添付の図面を参照して、本発明の好適な実施形態を詳細に説明する。
【００１３】
（実施形態１）
図１は、一般的な情報処理装置１０１のハードウェア構成の一例を示す図である。図１に示されるように情報処理装置１０１は、ハードウェア構成として、ＣＰＵ１１を含む。
【００１４】
ＣＰＵ１１が、記憶装置１３に記憶されている後述するアプリケーションやプログラム実行環境等の各々に対応するコンピュータプログラムに基づき処理を行うことによって、後述する各機能、又はフローチャートを実現する。
【００１５】
また、ＣＰＵ１１には、バス１０を介して、入力装置１２、記憶装置１３、表示装置１４及び外部接続ＩＦ１５が接続されている。入力装置１２は、情報を入力するキーボード及び／又はマウスである。記憶装置１３は、例えば、ＲＯＭ、ＲＡＭ、ハードディスク装置等を含み、上述した各プログラム以外に、プログラムに基づく処理で用いられるデータ等を記憶する。表示装置１４は、画面等を表示するディスプレイである。外部接続ＩＦ１５は、ネットワークインタフェース、外部機器との各種接続インタフェースである。
【００１６】
尚、ＣＰＵ１１はプログラムを実行することで各種の手段として機能することが可能である。なお、ＣＰＵ１１と協調して動作するＡＳＩＣなどの制御回路がこれらの手段として機能してもよい。また、ＣＰＵ１１と情報処理装置１０１の動作を制御する制御回路との協調によってこれらの手段が実現されてもよい。また、ＣＰＵ１１は単一のものである必要はなく、複数であってもよい。この場合、複数のＣＰＵ１１は分散して処理を実行することが可能である。また、複数のＣＰＵ１１は単一のコンピュータに配置されていてもよいし、物理的に異なる複数のコンピュータに配置されていてもよい。なお、ＣＰＵ１１がプログラムを実行することで実現する手段が専用の回路によって実現されてもよい。
【００１７】
次に、情報処理装置１０１上に構築するシステム構成について、図２を用いて説明する。図２は、情報処理装置１０１のシステム構成の一例を示す図である。
【００１８】
オペレーティングシステム２０１は、システム全体の基盤となるソフトウェアである。仮想マシン２０２は、オペレーティングシステム２０１上のプロセスでありながら、自身の上でアプリケーションが動作する環境を提供するソフトウェアである。アプリケーション２０３は仮想マシン２０２で実行されるプログラムであり、中間コードによって構成されている。
【００１９】
次に、仮想マシン２０２の具体的な構成を、図３を用いて説明する。図３は仮想マシン２０２が備える機能を示す図である。仮想マシン２０２は、中間コードを実行するインタプリタ３０１を備える。また、仮想マシン２０２は、中間コードをネイティブコードにコンパイルするＪＩＴコンパイラ３０２を備える。ＪＩＴコンパイラ３０２は、コンパイルしたネイティブコードをＪＩＴコードキャッシュ３０３に格納する。通常、ＪＩＴコードキャッシュ３０３は、記憶装置１３中の特定のメモリ領域である。もしメモリでなくハードディスクなどの記憶装置１３中の不揮発性記憶領域にすると、アクセスが遅くなって処理が遅くなってしまう。
【００２０】
次に、再利用するために保存するスナップショットの構成を、図４を用いて説明する。図４は、記憶装置１３上に保存したスナップショット４０１の構成を示す図である。スナップショット４０１は、機器の状態に応じて複数保存されうる。スナップショット４０１はネイティブコード群４０２を備える。ネイティブコード群４０２は、仮想マシン２０２の実行中にＪＩＴコードキャッシュ３０３に保存されるネイティブコードの集合である。また、スナップショット４０１は、ネイティブコード中のアドレスを機器の状態に適した値に変換するためのアドレス変換テーブル４０３を備える。また、スナップショット４０１は、スナップショットの適用開始条件４０４、適用停止条件４０５、削除条件４０６を備える。
【００２１】
仮想マシン２０２は、機器の状態を取得する機器状態取得手段３０４を備える。機器の状態には、例えば機器のネットワーク設定状態や、機器の起動モードがある。また、仮想マシン２０２は、仮想マシン２０２上で実行しているプログラムを監視するための実行プログラム監視手段３０５を備える。また、仮想マシン２０２は、スナップショット４０１を管理するスナップショット管理手段３０６を備える。スナップショット管理手段３０６は、複数のスナップショット４０１をスナップショット管理テーブル８０１によって管理する。図８にスナップショット４０１を管理するテーブルの一例を示す。
【００２２】
具体的に、本実施形態における仮想マシン２０２はＪＲＥ（Ｊａｖａ  Ｒｕｎｔｉｍｅ  Ｅｎｖｉｒｏｎｍｅｎｔ）とする。ＪＲＥとは、Ｊａｖａ（登録商標）言語で開発されたソフトウェアを実行するために必要なソフトウェアのセットである。ＪＲＥは、クラスライブラリ、ＪａｖａＶＭ（Ｊａｖａ言語にて記述されたアプリケーションを実行するためのソフトウェア）、及びＪＲＥを搭載する端末固有のポーティングレイヤを含む。以降では、情報処理装置１０１を機器と記す。
【００２３】
ＪＩＴコンパイルでは、Ｊａｖａプログラムのメソッドをネイティブコードに変換する。ＪＩＴコンパイルの処理の負荷を低減するには、以前のＪＩＴコンパイルで作成したネイティブコードの再利用が有効となる。しかし、機器の設定によっては、以前のネイティブコードを再利用できない。例えば、ネットワーク設定がＩＰｖ４アドレスであるときには、ＩＰｖ４アドレス用のメソッドが実行される。一方、ネットワーク設定がＩＰｖ６アドレスであるときには、ＩＰｖ６アドレス用のメソッドが実行される。そのため、ＩＰｖ４アドレス設定のときに作成されたネイティブコードは、ＩＰｖ６アドレス設定のときに再利用できない。そこで、機器の状態に応じたＪＩＴコンパイル結果を保存しておき、選択して再利用する仕組みが必要となる。また、再利用をメソッド単位で行うと、メソッドを実行する度に保存したネイティブコードを取得するオーバヘッドが生じ、機器が高速に動作できない。高速に動作するためには、実行するメソッド群に対応するネイティブコード群を一度に取得する仕組みが必要となる。
【００２４】
これらの仕組みを実現する実施形態を、図５、図８を用いて説明する。図５は機器の起動処理のフローチャートである。図８はスナップショット管理テーブルの例を示す図である。
【００２５】
本実施形態では、以前の起動時にＪＩＴコンパイルしたネイティブコードを利用して起動する方法について説明する。機器の起動が開始されると、オペレーティングシステム２０１が起動する。そして、アプリケーション２０３を実行するための仮想マシン２０２の起動が開始される。仮想マシン２０２は、機器状態取得手段３０４によって、機器の状態を取得する（Ｓ５０１）。また、スナップショット管理手段３０６によって、スナップショット管理テーブル８０１を取得する（Ｓ５０２）。そして、仮想マシン２０２はスナップショット作成指示があるかを確認する（Ｓ５０３）。スナップショット作成指示としては、記憶装置１３上に機器を操作するユーザが作成するフラグファイルや、仮想マシン２０２の起動時に与えるオプション値などが考えられる。例えば工場で機器を生産するときに、工員がスナップショット４０１の作成指示をだして機器を再起動することで、スナップショット４０１を作成する。
【００２６】
ステップＳ５０３においてスナップショット作成指示がある場合、仮想マシン２０２は機器の起動処理を実行する（Ｓ５０４）。起動処理では、機器のＵＩや各種機能を実現するアプリケーション２０３を起動する。これらの処理において、インタプリタ３０１で頻繁に実行されるメソッドは、ＪＩＴコンパイラ３０２によってＪＩＴコンパイルされる。コンパイルされたネイティブコードはＪＩＴコードキャッシュ３０３に格納される。機器の起動処理は、機器のＵＩが操作可能となり、基本機能をユーザが利用できるようになった段階で完了する。仮想マシンが機器の起動処理が完了したことを検知するには、機器上で動作する複数のアプリケーション２０３を管理するアプリケーション管理フレームワークが発行する起動完了イベントを受信する方法がある。機器の起動処理が完了すると、仮想マシン２０２はスナップショット４０１を作成する（Ｓ５０５）。スナップショット４０１の作成処理については、後述する。以降では、起動完了イベントを受信したときを、起動完了と記す。
【００２７】
ステップＳ５０３においてスナップショット作成指示がない場合、仮想マシン２０２はスナップショット管理テーブル８０１を参照して、状態に応じたスナップショット４０１があるかを確認する（Ｓ５０６）。確認は、スナップショット管理テーブル８０１内のスナップショット４０１の適用開始条件を参照し、現在の機器の状態に応じるものがあるかどうかを調べることで行う。状態に応じたスナップショット４０１がない場合、仮想マシン２０２はスナップショット４０１の作成条件を満たしているかを確認する（Ｓ５１２）。スナップショット４０１の作成条件について、通常なら作成しても問題ない。しかし、メンテナンスモードで機器が起動している場合や、スナップショット４０１を保存するだけの空き容量が記憶装置１３にない場合には、スナップショット４０１を作成しないほうが望ましい。また、実施形態２に示すように、累積したＪＩＴコンパイル処理の時間を閾値と比較して、スナップショット４０１を作成すべきか判断する場合もある。そこで、ステップＳ５１２において、新規に作成してもよいかを確認する。
【００２８】
ステップＳ５１２において、スナップショット４０１の作成条件を満たしている場合、ステップＳ５０４を実施する。ステップＳ５１２において、スナップショット４０１の作成条件を満たしていない場合、ステップＳ５０４と同様に機器の起動処理を行い（Ｓ５１３）、機器の起動は完了する。
【００２９】
ステップＳ５０６において状態に応じたスナップショット４０１がある場合、スナップショット管理手段３０６は、そのスナップショット４０１を選択する（Ｓ５０７）。
【００３０】
そして、スナップショット管理手段３０６は、選択したスナップショット４０１のネイティブコード群４０２をＪＩＴコードキャッシュ３０３に展開する（Ｓ５０８）。展開においては、アドレス変換テーブル４０３を参照して、ネイティブコード群４０２に含まれるアドレスを現在の起動状態に適したアドレスに変換する。また、スナップショット管理テーブル８０１で、選択したスナップショットの適用中の状態は「○」にする。
【００３１】
そして、選択したスナップショット４０１が有効に機能しているかを確認するために、適合度の確認を行う。適合度を確認するために、仮想マシン２０２は実行プログラム監視手段３０５によって実行プログラムの監視を開始する（Ｓ５０９）。監視では、仮想マシン２０２上で実行されるメソッドや、実行されるアプリケーション２０３を監視する。そして、ステップＳ５０４と同様に機器の起動処理を行う（Ｓ５１０）。起動処理が完了すると、選択したスナップショット４０１の適合度の確認を行う（Ｓ５１１）。適合度の確認処理については、後述する。
【００３２】
次に、スナップショット４０１の作成処理について、図６を用いて説明する。図６はスナップショット４０１の作成処理のフローチャートである。図８のスナップショット管理テーブル８０１が空の状態、かつ機器のネットワーク設定がＩＰｖ４アドレスの設定である状態でステップＳ５０５から作成処理が開始されるとする。
【００３３】
スナップショット４０１の作成を開始すると、スナップショット管理手段３０６はＪＩＴコードキャッシュ３０３からネイティブコード群４０２を取得する（Ｓ６０１）。しかし、このネイティブコードには、オペレーティングシステム２０１がロードしたライブラリのアドレスのように、起動の度に値が変わるものが含まれる。そこで、ネイティブコード群４０２に含まれるアドレスを次回起動時に変換して適用できるように、スナップショット管理手段３０６はアドレス変換テーブル４０３を作成する（Ｓ６０２）。
【００３４】
さらにスナップショット管理手段３０６は、機器状態取得手段３０４で取得した機器の状態から、適用開始条件を設定する（Ｓ６０３）。本実施形態で作成したネイティブコードは、機器の起動時、かつネットワーク設定がＩＰｖ４である状態で作成したものである。そこで、「機器の起動時、かつネットワーク設定がＩＰｖ４である状態」をスナップショット４０１の適用開始条件とする。また、実行プログラム監視手段３０５によって取得したプログラムの履歴と、ＪＩＴコンパイラ３０２から取得するＪＩＴコンパイル処理の履歴を照合する。そして、ＪＩＴコンパイル処理が多数発生するきっかけとなるプログラムを適用開始条件に設定する方法も考えられる。
【００３５】
また、スナップショット管理手段３０６は、適用停止条件を設定する（Ｓ６０４）。適用停止条件は、利用中のスナップショット４０１が実際に機器で実行されるプログラムと対応しないことを判定する条件として利用する。機器の起動時に作成したスナップショットは、起動完了後の動作でしか実行されないメソッドに対応するネイティブコードを含んでいない。そのため、適用停止の条件として、「機器の起動が完了した時」を設定する。また、例えばスナップショットを作成後に２０３がアップデートされた場合、そのスナップショットを適用しても、スナップショットに含まれないメソッドが多く実行されることがありえる。このような場合にはスナップショットの適用を停止することが望ましい。そこで、スナップショットの適用停止条件に、「スナップショットに含まれないメソッドの実行回数が５００回以上の時」を設定する。スナップショットに含まれないメソッドの実行回数の集計は、実行プログラム監視手段３０５が行う。
【００３６】
そして、スナップショット管理手段３０６は、スナップショット管理テーブル８０１内の既存のスナップショットの更新が必要かどうかを判定する（Ｓ６０５）。判定方法としては、適用開始条件が同一であるスナップショット４０１が、スナップショット管理テーブル８０１内に存在するかどうかを確認する方法が単純である。
【００３７】
ステップＳ６０５において更新が必要と判定すれば、既存のスナップショットを作成したスナップショットで更新する（Ｓ６０６）。具体的には、スナップショット管理テーブル８０１内の既存のスナップショット４０１のネイティブコード群４０２とアドレス変換テーブル４０３を、新しいものに更新する。更新では、適用開始条件が同一のスナップショットを更新するので、適用開始条件４０４の更新は不要である。また、適用停止条件４０５と削除条件４０６も、基本的に更新は不要である。
【００３８】
ステップＳ６０５において更新が不要と判定すれば、新しいスナップショット４０１を作成し、スナップショット管理テーブル８０１に追加する（Ｓ６０７）。ところで、多数のスナップショット４０１をスナップショット管理テーブル８０１に追加すると、記憶装置１３の容量を多く消費してしまう。そこで、スナップショット４０１には、削除条件を設定する。削除の方法として、記憶装置１３の空き容量が不足している場合に、使用頻度が低いスナップショットを削除する方法が適切である。そこで、標準の削除条件を「ハードディスクの空き容量が５％以下、かつスナップショット管理テーブルのスナップショット群において使用頻度が３位以下である場合」とする。
【００３９】
削除条件の判定を行うために、スナップショット４０１を適用した履歴をスナップショット管理手段３０６が保持する。例えば削除処理を機器の起動時に実行する場合、Ｓ５０１において記憶装置１３の空き容量を取得する。空き容量が５％以下であれば、Ｓ５０２においてスナップショット管理テーブル８０１の各スナップショット４０１を適用した履歴を参照し、使用頻度が３位以下のスナップショット４０１を削除する。スナップショット管理テーブル８０１に追加したスナップショット４０１の削除処理を実行するタイミングとしては、機器の起動時だけでなく、機器のシャットダウン時なども考えられるが、特に制限はない。
【００４０】
次に、適合度の確認処理について、図７を用いて説明する。図７はスナップショット４０１の適合度の確認処理のフローチャートである。適合度は、仮想マシン２０２上で実行された実際のプログラムにスナップショット４０１がどれだけ適合するかを示す度合いである。適合度の利用方法として、スナップショット４０１を適用中に適合度を適宜計測し、スナップショット４０１の適用をいつまで行うかを判断するために利用することが考えられる。また、スナップショット４０１の更新が必要かどうかを判断するために利用することが考えられる。
【００４１】
適合度の確認では、はじめにスナップショット管理手段３０６が、仮想マシン２０２が実行したプログラムの履歴を取得する（Ｓ７０１）。この履歴は、実行プログラム監視手段３０５によって作成されたものである。
【００４２】
実行したプログラムの履歴を取得すると、適用中のスナップショット４０１との適合度が閾値以下の値であるかを確認する（Ｓ７０２）。具体的な適合度の算出方法として単純な方法は、スナップショットに含まれないメソッドが実行された回数を用いる方法である。例えば、「適合度＝１／（スナップショットに含まれないメソッドが実行された回数）」として、閾値を１／１００とする。すると、スナップショットに含まれないメソッドが機器の起動処理中に１００回以上実行された場合に、ステップＳ７０２において適合度が閾値以下となる。
【００４３】
また、適合度の算出方法として、ＪＩＴコードキャッシュ３０３のｄｉｆｆを用いる方法もありえる。スナップショット４０１を適用すると、ネイティブコード群４０２がＪＩＴコードキャッシュ３０３に展開される。しかし、適用したスナップショット４０１と機器が実行するプログラムが適合しなければ、適用したスナップショット４０１に対応しないメソッドの実行が頻発する。すると、それらのメソッドがＪＩＴコンパイルされ、ＪＩＴコードキャッシュ３０３にネイティブコードとして追加されていく。また、追加時にＪＩＴコードキャッシュ３０３の空きがなければ、実行頻度が低いネイティブコードがＪＩＴコードキャッシュ３０３から削除される。この結果、ＪＩＴコードキャッシュ３０３の内容は、スナップショット４０１を適用した時点の状態と差異が生じていく。そこで、スナップショット４０１を適用直後のＪＩＴコードキャッシュ３０３と、適合度の確認を行う時点でのＪＩＴコードキャッシュ３０３のｄｉｆｆを計測し、適合度として利用する。
【００４４】
ステップＳ７０２において適合度が閾値以下の場合、スナップショット４０１を作成する（Ｓ７０３）。スナップショット作成の手順については、図６を用いて前述した。ステップＳ７０２において適合度が閾値より大きい場合、適用中のスナップショットは適切であると判断し、何も行わずに適合度の確認は終了する。
【００４５】
以上、機器の起動時にスナップショット４０１を利用する方法について説明した。機器の起動時には多くのメソッドが実行されるため、スナップショット４０１を利用してＪＩＴコンパイル処理の負荷を低減することで、機器は高速に起動する。
【００４６】
（実施形態２）
実施形態１では、機器の起動時にスナップショット４０１を利用する方法について説明した。しかし、機器の起動完了後に実行されるプログラムによって、ＪＩＴコンパイルが多く発生することがある。例えば、機器の起動が完了したあとで、ユーザがアプリケーション２０３の実行を開始して、多くのＪＩＴコンパイルが発生する場合である。
【００４７】
このような場合にＪＩＴコンパイル処理の負荷を低減するためには、多くのＪＩＴコンパイルが発生する処理を検出してスナップショット４０１を作成し、次回からはそのタイミングで作成したスナップショット４０１を利用すればよい。
【００４８】
そこで、機器の起動完了後にスナップショット４０１を選択して利用する方法を、実施形態２として説明する。説明は図９を用いて行う。図９は機器がプログラムを実行する処理を示すフローチャートである。機器の起動時にスナップショット管理テーブル８０１のスナップショット＿ａを選択して適用中であるとして説明する。実行するプログラムは、機器の起動が完了したのちに、ユーザの指示で起動したアプリケーション２０３とする。以降、このアプリケーション２０３を、アプリＸと記す。また、スナップショット管理テーブル８０１にはスナップショット＿ａのみがある状態であるとする。
【００４９】
仮想マシン２０２はプログラムを開始する前に、実行プログラムの監視を開始する（Ｓ９０１）。この処理はステップＳ５０９と同様である。
【００５０】
そして、仮想マシン２０２は、シャットダウンが指示されたかどうかを確認する（Ｓ９０２）。ステップＳ９０２においてシャットダウンが指示されていれば、シャットダウンの処理を実行し（Ｓ９１３）、プログラムの実行は終了する。
【００５１】
ステップＳ９０２においてシャットダウンの指示がなければ、仮想マシン２０２は、プログラムを実行する（Ｓ９０３）。実行するプログラムの単位で最小のものはメソッドである。しかし、このフローチャートにおいて１つのメソッドを実行するたびにステップＳ９０４以降の処理を行うと、負荷が高くなってしまう。そのため、ステップＳ９０３で実行するプログラムの単位は、ある程度まとまった処理とする。例えば、メソッド１００個の実行処理や、３分間の実行処理、などが考えられる。
【００５２】
プログラムの実行が終わると、スナップショット管理手段３０６はスナップショットを適用中かどうか確認する（Ｓ９０４）。実施形態１で説明したように、スナップショット４０１はＪＩＴコードキャッシュ３０３のネイティブコード群である。そのため、複数のスナップショット４０１では、例えばＪａｖａの基本クラスのメソッドに対応するネイティブコードなどが重複しえる。そのため、複数のスナップショットを同時に適用すると重複を解決する必要があるため、本実施形態ではスナップショットは一度に１つしか適用しない。ここで、現在はスナップショット＿ａを選択して適用中であるので、スナップショット管理手段３０６はスナップショット＿ａの適用停止条件を満たしているかを確認する（Ｓ９０５）。
【００５３】
そして、スナップショット＿ａの適用停止条件である「機器の起動が完了した時」を満たしているため、スナップショット管理手段３０６はスナップショットの適用を停止する（Ｓ９０７）。スナップショットの適用を停止する方法では、単にスナップショット管理テーブル８０１の適用中の項目を「×」にする方法が単純である。
【００５４】
そして、スナップショット管理手段３０６は、状態に応じたスナップショット４０１があるかを確認する（Ｓ９０８）。ここで、現在はスナップショット＿ａしかないため、状態に応じたスナップショットがない。そこで、スナップショットの作成条件を満たしているかを確認する（Ｓ９０９）。
【００５５】
ステップＳ９０９の処理は基本的にステップＳ５１２と同様であるが、本実施形態でさらに詳細に説明する。スナップショット４０１は、ハードディスクのように大容量だが低速なデバイスに保存される。スナップショット４０１を適用して機器の動作を高速にするためには、低速なデバイスにアクセスする遅延時間よりも、スナップショット４０１の適用によって省略されるＪＩＴコンパイル処理の時間が大きくなければならない。つまり、本実施形態の場合、アプリＸが起動してから発生したＪＩＴコンパイル処理の合計時間が閾値以上でなければならない。
【００５６】
ステップＳ９０９において、アプリＸが起動してから発生したＪＩＴコンパイル処理の合計時間が閾値以上でなければ、ステップＳ９０２に戻ってアプリＸのプログラムの実行を継続する。
【００５７】
ステップＳ９０９において、アプリＸが起動してから発生したＪＩＴコンパイル処理の合計時間が閾値以上であれば、スナップショットを作成する（Ｓ９１０）。スナップショットを作成する処理は、実施形態１で説明したとおりである。本実施形態では、適用開始条件として、「アプリＸの実行開始時」を設定し、スナップショット管理テーブル８０１にスナップショット＿ｃを作成する。また、適用停止条件には、「アプリＸの停止」を設定する。また、このスナップショット＿ｃはアプリＸのプログラムに依存するものであり、アプリＸがアンインストールされれば不要となる。また、アプリＸがアップデートされた場合、このスナップショット＿ｃは不適切なものとなる。そこで、スナップショット＿ｃを作成時のアプリＸのバージョンを２．０の場合、スナップショット＿ｃの削除条件は「アプリＸのアンインストール。またはアプリＸのバージョンが２．０と異なるとき」とする。
【００５８】
ステップＳ９１０においてスナップショット＿ｃを作成後、機器を再起動して再度アプリＸを実行したとする。すると、ステップＳ９０８において状態に応じたスナップショット＿ｃがあるため、スナップショット管理手段３０６はスナップショット＿ｃを選択する（Ｓ９１１）。そして、ステップＳ５０８と同様に選択したスナップショット＿ｃを展開する（Ｓ９１２）。
【００５９】
以上、実行するプログラムに応じてスナップショット４０１を利用する方法について説明した。
【００６０】
（実施形態３）
スナップショット４０１を適用中かどうかでＪＩＴコンパイルの処理の動作を変える方法について、実施形態３として図１０、図１１を用いて説明する。図１０はＪＩＴコンパイルオプションの例を示す図である。図１１は仮想マシンの構成を示す図である。
【００６１】
仮想マシン２０２では、ＪＩＴコンパイルにおいてインライン展開する関数の大きさの上限を指定するオプション（ＭａｘＩｎｌｉｎｅＳｉｚｅ）を使用できる。また、ＪＩＴコンパイルするメソッドを選択する条件を指定するオプション（ＣｏｍｐｉｌｅＴｈｒｅｓｈｏｌｄ）を使用できる。これらのオプションによって、実行環境や実行対象プログラムに適したＪＩＴコンパイルを行える。インライン展開を積極的に行う、あるいはＪＩＴコンパイルするメソッドを増やすと、ＪＩＴコンパイル後のプログラムの動作はより高速になる。その一方で、ＪＩＴコンパイルの処理に時間がかかるようにもなる。以降、このようなＪＩＴコンパイルを、高レベルのＪＩＴコンパイルと記す。
【００６２】
一般的に、ＪＩＴコンパイルに時間をかけないように高レベルのＪＩＴコンパイルは避けられる。しかし、本発明では一度ＪＩＴコンパイルすればその結果をスナップショット４０１として利用できるため、高レベルなＪＩＴコンパイルを行いたい。
【００６３】
これを実現するためには、ＪＩＴコンパイルのオプションを、スナップショット適用時とスナップショット未適用時のそれぞれで設定できるようにすればよい。スナップショット管理テーブル８０１に適用できるスナップショット４０１がなければ、実行されるメソッドを高レベルにＪＩＴコンパイルしていく。ステップＳ９０９の条件を満たすと高レベルなＪＩＴコンパイルの結果がスナップショット４０１として作成され、次回からはＪＩＴコンパイルをせずに高速に機器が動作する。
【００６４】
具体的には、図１０に示すように、オプション名にスナップショット４０１を適用時用のｐｒｅｆｉｘを追加する。ｐｒｅｆｉｘは、”ＵｓｅＳｎａｐ＿”のような文字列でよい。例えばＣｏｍｐｉｌｅＴｈｒｅｓｈｏｌｄオプションについて、オプションの値が大きいほど、プログラムのメソッドはＪＩＴコンパイルされにくくなる。また、値が０の場合はＪＩＴコンパイルされない。また、図１１に示すように、仮想マシン２０２はＪＩＴコンパイル指示受信手段３０７を備える。ＪＩＴコンパイル指示受信手段３０７は、オプションを受け取り、ＪＩＴコンパイラの動作をスナップショット４０１の適用時と未適用時で変更する。
【００６５】
例として、仮想マシン２０２の実行時に、”ＣｏｍｐｉｌｅＴｈｒｅｓｈｏｌｄ＝１０，ＵｓｅＳｎａｐ＿ＣｏｍｐｉｌｅＴｈｒｅｓｈｏｌｄ＝０”というオプションを与えるとする。このオプションの場合、スナップショット４０１を適用していなければ多数のメソッドがネイティブコードに変換され、作成されるスナップショット４０１に含まれるようになる。作成したスナップショット４０１を適用していれば、スナップショット４０１に含まれないメソッドが実行されてもＪＩＴコンパイルが行われない。スナップショット４０１を適用中に実行されるプログラムは、すべてネイティブコード群４０２に対応するメソッドのみを実行することが理想である。しかし、スレッドの実行タイミングや機器に保存されたデータによっては、ネイティブコード群４０２に対応しないメソッドを少数だけ実行することもありえる。このようなときには少数のメソッドはＪＩＴコンパイルを行わないことで、機器全体の動作を高速化できる。
【００６６】
また、ＪＩＴコンパイル処理の遅延がとくに問題となるのは、ユーザが遅延を実感しやすい処理である機器の起動処理だけであることが多い。そこで、機器の起動処理中と起動完了後でＪＩＴコンパイルのオプションを変えることも有効となる。具体的には、図１２のように、ＪＩＴコンパイル用オプションを機器の起動処理中と起動完了後で異なるようにｐｒｅｆｉｘを設定する。
【００６７】
以上、スナップショット４０１を適用中かどうかでＪＩＴコンパイルの処理の動作を変える方法について説明した。
【００６８】
（実施形態４）
実施形態３ではスナップショット４０１を適用中かどうかで、ＪＩＴコンパイルの内容を変える方法を説明した。スナップショット４０１を作成するには高レベルなＪＩＴコンパイルを行いたいが、高レベルなＪＩＴコンパイルは処理に時間がかかり、機器の動作が遅くなるという問題がある。高レベルなＪＩＴコンパイルの時間を問題にならないようにするには、ＪＩＴコンパイルを非同期で行えばよい。非同期でＪＩＴコンパイルを行うには、スナップショット作成用のスレッドを仮想マシン２０２上で実行することが単純である。以降の説明では、ＪＩＴコンパイルだけでなくスナップショットの作成処理の全てを、スナップショット作成用スレッドで行うとする。
【００６９】
そこで、スナップショット４０１を作成するためのＪＩＴコンパイルを非同期で行う方法を、実施形態４として説明する。スナップショット４０１を作成するためのＪＩＴコンパイルのオプションのｐｒｅｆｉｘは、図１３に示すように”ＣｒｅａｔｅＳｎａｐ＿”とする。
【００７０】
はじめに、仮想マシン２０２の構成について図１４を用いて説明する。図１４は、仮想マシン２０２の構成を示す図である。図１４は図１１とほぼ同様であるが、新たにスナップショット作成用ＪＩＴコードキャッシュ３０８を備えている。スナップショット４０１を作成するためのＪＩＴコンパイルによって生成されるネイティブコードは、スナップショット作成用ＪＩＴコードキャッシュ３０８に格納される。ＪＩＴコードキャッシュ３０３はプログラムの実行時に参照するため、メモリのような高速の記憶装置１３である必要があった。しかし、スナップショット作成用ＪＩＴコードキャッシュ３０８は非同期に参照するため、ハードディスクのような低速の記憶装置１３でもよい。
【００７１】
次に、スナップショット４０１を作成する手順について図１５を用いて説明する。図１５はスナップショットの作成処理のフローチャートである。スナップショット４０１の作成を開始すると、すでにＪＩＴコードキャッシュ３０３に存在するネイティブコードだけでスナップショット４０１を作れるかを確認する（Ｓ１５０１）。図１３に示したＪＩＴコンパイルのオプションで、スナップショット未適用時、スナップショット適用時、スナップショット作成時の各オプションが同一であるとする。このときは、ＪＩＴコードキャッシュ３０３にあるネイティブコード群をそのままスナップショット４０１にすればよい。この場合、ステップＳ６０１と同様にＪＩＴコードキャッシュ３０３からネイティブコード群を取得する（Ｓ１５０２）。
【００７２】
ステップＳ１５０１において、ＪＩＴコードキャッシュ３０３のネイティブコードではスナップショット４０１が作れない場合、スナップショット管理手段３０６は実行プログラム監視手段３０５から実行したプログラムの履歴を取得する（Ｓ１５０３）。そして、ＪＩＴコンパイルの対象となるメソッドを選択する（Ｓ１５０４）。選択の方法としては、ＪＩＴコンパイラ３０２からＪＩＴコンパイルの履歴を取得し、最後にＪＩＴコンパイルが頻発しはじめたメソッドの実行から最も新しい実行履歴のメソッドまでを選択することが単純である。
【００７３】
そして、スナップショット管理手段３０６は、スナップショット作成用ＪＩＴコードキャッシュ３０８に、”ＣｒｅａｔｅＳｎａｐ＿”で始まるオプション値でＪＩＴコンパイルしたネイティブコードを生成する（Ｓ１５０５）。生成が終わると、スナップショット管理手段３０６は、スナップショット作成用ＪＩＴコードキャッシュ３０８からネイティブコード群を取得する（Ｓ１５０６）。
【００７４】
ステップＳ１５０２、またはステップＳ１５０６でネイティブコード群を取得すると、ステップＳ６０２と同様に、４０３を作成する（Ｓ１５０７）。また、ステップＳ６０３と同様に適用開始条件を設定し（Ｓ１５０８）、ステップＳ６０４と同様に適用停止条件を設定する（Ｓ１５０９）。
【００７５】
そして、ステップＳ６０５と同様に既存のスナップショットの更新が必要かを判定する（Ｓ１５１０）。更新が必要であればステップＳ６０６と同様に更新を行う（Ｓ１５１１）。更新が必要でなければ、ステップＳ６０７と同様に作成したスナップショット４０１をスナップショット管理テーブル８０１に追加する（Ｓ１５１２）。
【００７６】
以上、スナップショット４０１を作成するためのＪＩＴコンパイルを非同期で行う方法を説明した。
【００７７】
（他の実施形態）
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア（プログラム）を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ（またはＣＰＵやＭＰＵ等）がプログラムを読み出して実行する処理である。
【図１】
2019152911.tif 000003
【図２】
2019152911.tif 000004
【図３】
2019152911.tif 000005
【図４】
2019152911.tif 000006
【図５】
2019152911.tif 000007
【図６】
2019152911.tif 000008
【図７】
2019152911.tif 000009
【図８】
2019152911.tif 000010
【図９】
2019152911.tif 000011
【図１０】
2019152911.tif 000012
【図１１】
2019152911.tif 000013
【図１２】
2019152911.tif 000014
【図１３】
2019152911.tif 000015
【図１４】
2019152911.tif 000016
【図１５】
2019152911.tif 000017