(57)【要約】【課題】  コンパイル済みコードによるキャッシュ圧迫をより効率的に防止することを目的とする。【解決手段】  仮想マシンが実行するメソッドをコンパイルしてネイティブコードに変換する動的コンパイル手段と、前記ネイティブコードをデコンパイルするデコンパイル手段と、前記デコンパイル手段により行われたデコンパイルに関する情報を記録する記録手段と、前記デコンパイルに関する情報に基づき、前記デコンパイル手段によるデコンパイルを禁止する禁止手段と、を有することを特徴とする【選択図】  図２
2019133414.tif 000002
【特許請求の範囲】
【請求項１】
仮想マシンが実行するメソッドをコンパイルしてネイティブコードに変換する動的コンパイル手段と、
前記ネイティブコードをデコンパイルするデコンパイル手段と、
前記デコンパイル手段により行われたデコンパイルに関する情報を記録する記録手段と、
前記デコンパイルに関する情報に基づき、前記デコンパイル手段によるデコンパイルを禁止する禁止手段と、を有することを特徴とする情報処理装置。
【請求項２】
前記デコンパイルに関する情報は、前記デコンパイル手段により行われたデコンパイルの回数であり、
前記禁止手段は、対象のメソッドの前記デコンパイルの回数が所定の閾値を超えている場合は、前記対象のメソッドに対する前記デコンパイル手段によるデコンパイルを禁止することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記禁止手段により前記対象のメソッドに対する前記デコンパイル手段によるデコンパイルを禁止された後、前記対象のメソッドがデコンパイルの対象に選ばれた回数が所定の閾値を超えた場合、前記対象のメソッドに対する前記デコンパイル手段によるデコンパイルの禁止を解除する解除手段をさらに有することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記対象のメソッドを使用しているアプリケーションが停止または削除された場合、前記対象のメソッドに対する前記デコンパイル手段によるデコンパイルの禁止を解除する解除手段をさらに有することを特徴とする請求項２に記載の情報処理装置。
【請求項５】
前記解除手段により前記対象のメソッドのデコンパイルが解除された場合、
前記対象のメソッドの前記ネイティブコードを外部装置に送り、前記対象のメソッドをコンパイルする場合は、前記外部装置から前記ネイティブコードを取得する取得手段をさらに有することを特徴とする請求項４に記載の情報処理装置。
【請求項６】
前記デコンパイルに関する情報は、前記デコンパイル手段にデコンパイルが行われてから、前記コンパイル手段によりコンパイルが行われるまでの時間であり、
前記禁止手段は、対象のメソッドの前記時間の平均時間が所定の閾値よりも小さい場合、前記対象のメソッドに対する前記デコンパイル手段によるデコンパイルを禁止することを特徴とする請求項１に記載の情報処理装置。
【請求項７】
前記デコンパイルに関する情報は、前記コンパイル手段によりコンパイルが行われてから前記デコンパイル手段にデコンパイルが行われ、更に、前記コンパイル手段によりコンパイルが行われるまでの時間であり、
前記禁止手段は、対象のメソッドの前記時間の平均時間が所定の閾値よりも小さい場合、前記対象のメソッドに対する前記デコンパイル手段によるデコンパイルを禁止することを特徴とする請求項１に記載の情報処理装置。
【請求項８】
前記デコンパイルに関する情報は、前記コンパイル手段によりコンパイルが行われてから前記デコンパイル手段にデコンパイルが行われるまでの時間であり、
前記禁止手段は、対象のメソッドの前記時間の平均時間が所定の閾値よりも大きい場合、前記対象のメソッドに対する前記デコンパイル手段によるデコンパイルを禁止することを特徴とする請求項１に記載の情報処理装置。
【請求項９】
動的コンパイル手段が、仮想マシンが実行するメソッドをコンパイルしてネイティブコードに変換する動的コンパイル工程と、
デコンパイル手段が、前記ネイティブコードをデコンパイルするデコンパイル工程と、
記録手段が、前記デコンパイル工程で行われたデコンパイルに関する情報を記録する記録工程と、
禁止手段が、前記デコンパイルに関する情報に基づき、前記デコンパイル工程におけるデコンパイルを禁止する禁止工程と、を有することを特徴とする情報処理方法。
【請求項１０】
コンピュータを、
仮想マシンが実行するメソッドをコンパイルしてネイティブコードに変換する動的コンパイル手段と、
前記ネイティブコードをデコンパイルするデコンパイル手段と、
前記デコンパイル手段により行われたデコンパイルに関する情報を記録する記録手段と、
前記デコンパイルに関する情報に基づき、前記デコンパイル手段によるデコンパイルを禁止する禁止手段と、を有することを特徴とする情報処理装置として機能させるためのコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、仮想マシンが実行するメソッドをコンパイルする情報処理装置、情報処理方法およびコンピュータプログラムに関する。
【背景技術】
【０００２】
Ｊａｖａ（登録商標）仮想マシンのように、仮想マシンによって実行されるメソッドの処理を中間コードからネイティブコードに変換することで、メソッドの処理時間を高速化する動的コンパイラ技術がある。中間コードとは、Ｊａｖａにおけるバイトコードのことであり、仮想マシンを実行するマイクロプロセッサやＯＳに依存せず、仮想マシンが逐一解釈、実行可能な言語のことである。一方、ネイティブコードとは、マシン語など、プログラムを実行するマイクロプロセッサが直接解釈及び実行可能な言語のことである。通常、中間コードよりもネイティブコードのほうが高速に処理される。
【０００３】
このような動的コンパイラ技術では、コンパイルして変換したネイティブコード（コンパイル済みコード）を保存するためのコードキャッシュ領域が限られる。この限られたコードキャッシュ領域を効率的に使うため、コードキャッシュ領域の空きがどれくらいかを調べ、足りなくなるとあまり使われていないコンパイル済みコードに対してデコンパイル処理を行う。そしてコードキャッシュ領域からコンパイル済みコードが削除される。
【０００４】
特許文献１に開示の「コードを投機的に最適化するための方法」では、コンパイル済みコードを辞書に入れておき、辞書の内容に変化が検出された場合に、必要のなくなったコンパイル済みコードを無効化する。
【０００５】
特許文献２に開示の「仮想機械用プログラムのコンパイル対象指定方法」では、コンパイル対象から除外したいメソッドを、プログラムの階層構造を使って指定することを可能としている。これにより、コンパイルしたくないプログラム部分を容易に除外することができる。
【０００６】
特許文献３には、キー操作、描画等の特定の機能を有する部分プログラムがコンパイル済みのキャッシュ領域に格納されている場合に、削除対象にしないことが開示されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１３−２２８８４５号公報
【特許文献２】特開２００２−１６３１１５号公報
【特許文献３】特願２００２−２７８３０１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、特許文献１の方法においては、必要なくなったと判断された時点でコンパイル済みコードを無効化してしまうため、その後、無効化した部分が再び必要になった時に再度コンパイル処理を行わなければならない。
【０００９】
また、特許文献２の方法においては、コンパイルするかどうかの判断の方法であって、コードキャッシュ領域内のコンパイル済みコードをどのようにデコンパイルするかどうかの方法に関しては言及していない。また、特許文献３の方法においては、特定の機能の場合にデコンパイル処理を行わないことについて述べている。しかしながら、いずれの引用文献においても、コンパイル済みコードがキャッシュを圧迫してしまいことに対して、十分な対応がなされていなかった。
【００１０】
本発明は、上記課題を鑑みてなされたものであり、コンパイル済みコードによるキャッシュ圧迫をより効率的に防止することを目的とする。
【課題を解決するための手段】
【００１１】
上記課題を解決するために、本発明に係る情報処理装置は、仮想マシンが実行するメソッドをコンパイルしてネイティブコードに変換する動的コンパイル手段と、前記ネイティブコードをデコンパイルするデコンパイル手段と、前記デコンパイル手段により行われたデコンパイルに関する情報を記録する記録手段と、前記デコンパイルに関する情報に基づき、前記デコンパイル手段によるデコンパイルを禁止する禁止手段と、を有することを特徴とする。
【発明の効果】
【００１２】
本発明によれば、コンパイル済みコードによるキャッシュ圧迫をより効率的に防止することが出来る。
【図面の簡単な説明】
【００１３】
【図１】実施形態１に係るシステムの構成を示すブロック図
【図２】実施形態１の機能構成図
【図３】実施形態１のフローチャート
【図４】実施形態２の機能構成図
【図５】実施形態２のコンパイル処理のフローチャート
【図６】実施形態２のデコンパイル処理のフローチャート
【図７】実施形態２のコンパイル・デコンパイル時系列図
【図８】実施形態３のコンパイル処理のフローチャート
【図９】実施形態３のデコンパイル処理のフローチャート
【図１０】実施形態４のコンパイル時系列図
【図１１】実施形態４のコンパイル処理のフローチャート
【図１２】実施形態４のデコンパイル処理のフローチャート
【図１３】実施形態６の機能構成図
【図１４】実施形態６のフローチャート
【図１５】実施形態７のソフトウェア構成の一例を示す図
【発明を実施するための形態】
【００１４】
（実施形態１）
本実施形態の投影装置のハードウェア構成について、図１のブロック図を参照して説明する。図１における１００はデコンパイルの禁止装置全体を示す。デコンパイルの禁止装置は、一般的なコンピュータプログラムにより動作するパーソナルコンピュータ（情報処理装置）と同様の構成である。ＣＰＵ１０１はシステム制御部でありデコンパイルの禁止装置全体を制御する。ＲＯＭ１０２は変更を必要としないプログラムやパラメータを格納する読み取り専用のメモリである。ＲＡＭ１０３は外部装置などから供給されるプログラムやデータを一時記憶する書き換え可能なメモリである。１０４は、マウス、キーボードなど、各種データおよびコマンドの入力をおこなうための入力Ｉ／Ｆである。１０５は、デコンパイルの禁止装置に固定して設置されたハードディスクやメモリカード、あるいはデコンパイルの禁止装置から着脱可能なメモリカードやフレキシブルディスク、ＩＣカードなどの外部記憶部である。１０６は１０１〜１０５の各ユニットを通信可能に接続するシステムバスである。図２は、本発明の実施形態１に係るシステムの機能構成図である。また、図３は本発明の実施形態１に係るフローチャート図である。
【００１５】
次に、本実施形態におけるデコンパイルの禁止装置２００のソフトウェア構成の一例を、図２を用いて説明する。
【００１６】
デコンパイルの禁止装置２００は、本実施形態におけるデコンパイルの禁止装置である。デコンパイルの禁止装置２００を実行するプログラムは、ＲＯＭ１０２に格納されており、ＣＰＵ１０１によってＲＡＭ１０３上にプログラムが読み込まれ、実行される。
【００１７】
仮想マシンでは、よく使われるメソッドの中間コードが、動的コンパイラによって動的にコンパイル処理され、そのコンパイル済みコードがＲＡＭ１０３または外部記憶部１０５のコードキャッシュ領域に記録されていく。
【００１８】
コードキャッシュ不足判定部２０１は、コードキャッシュ領域には限りがあるため、もうこれ以上コンパイル結果を記録できないことを判定する処理を行う。まだコードキャッシュ領域に空きがあればコンパイル結果をＲＡＭ１０３または外部記憶部１０５に記録する。コードキャッシュ領域に空きがなければ、デコンパイルメソッド選択部２０２において、コードキャッシュ領域内に存在するコンパイルされたメソッドの中からデコンパイルするメソッドを選ぶ。デコンパイルするメソッドを選ぶ方法は、使われていないメソッドから選択される手法が一般的に使われる。
【００１９】
デコンパイル禁止情報読み込み部２０３は、ＲＡＭ１０３または外部記憶部１０５に記録されているメソッドに紐づいたデコンパイル禁止情報を読み込む。デコンパイル禁止判定部２０４は、デコンパイル禁止情報読み込み部２０３で読み込まれた情報からデコンパイル禁止であるかどうかを判定する。デコンパイル禁止であった場合には、デコンパイルメソッド選択部２０２に戻り次のデコンパイルするメソッドを選択する。デコンパイル禁止でなかった場合には、デコンパイル回数読み込み部２０５において、ＲＡＭ１０３または外部記憶部１０５に記録されているメソッドに紐づいたデコンパイル回数を読み込む。
【００２０】
デコンパイル回数判定部２０６は、デコンパイル回数読み込み部２０５で読み込まれたデコンパイル回数が、所定の閾値（Ｔｄ）を越えるかどうかを判定する。デコンパイル回数が、所定の閾値（Ｔｄ）を越えていれば、デコンパイル禁止情報付加部２０７の処理を行う。デコンパイル回数が、所定の閾値（Ｔｄ）を越えていなければ、デコンパイル処理部２０８でデコンパイル処理を行う。
【００２１】
デコンパイル禁止情報付加部２０７は、メソッドに紐づけてデコンパイル禁止であるというデコンパイル禁止情報を付加し、ＲＡＭ１０３または外部記憶部１０５に記録する。そして、デコンパイルメソッド選択部２０２に戻り、次のデコンパイルメソッドを選択する。
【００２２】
デコンパイル処理部２０８は、デコンパイル処理すなわち、コードキャッシュに記録されているコンパイルコードを削除してコードキャッシュ領域を空ける処理をおこなう。次に、デコンパイル回数記録部２０９に移る。
【００２３】
デコンパイル回数記録部２０９は、デコンパイル回数をＲＡＭ１０３または外部記憶部１０５に記録する。通常デコンパイル回数に１加算してから記録するが、デコンパイル回数を０にしてから記録することもある。そして、コードキャッシュ不足判定部２０１に戻る。
【００２４】
前記図１のＣＰＵ１０１がＲＯＭ１０２とＲＡＭ１０３に記憶されているプログラムを実行することで実現する図２のそれぞれの機能部の構成について、フローチャート図３を用いて説明する。図３の処理は、動的コンパイルによってメソッドがコンパイルされコードキャッシュ領域にコンパイル済み結果を保存しようとした時点をＳｔａｒｔとしている。
【００２５】
先ず、図３の処理Ｓ３０１で、図２のコードキャッシュ不足判定部２０１を用いて、コードキャッシュ領域が足りなくなったかどうかを判定する。コードキャッシュ領域が足りていれば、そのままコンパイル済み結果をコードキャッシュ領域に保存して終了する。処理Ｓ３０１でコードキャッシュ領域が足りないと判定された場合には、処理Ｓ３０２に移り、デコンパイルメソッド選択部２０２を用いて、使われなくなったメソッドをデコンパイル対象として選ぶ。次に、処理Ｓ３０３に移り、デコンパイル禁止情報読み込み部２０３を用いて、選ばれたメソッドに紐づいているデコンパイル禁止情報を取り出す。そして、処理Ｓ３０４に移り、デコンパイル禁止判定部２０４を用いて、選ばれたメソッドがデコンパイル禁止かどうかを判定する。処理Ｓ３０４において選ばれたメソッドがデコンパイル禁止であると判定された場合には、処理Ｓ３０８に移り、デコンパイルメソッド選択部２０２を用いて、他のメソッドをデコンパイル対象として選び、処理Ｓ３０３に戻る。処理Ｓ３０４で、選ばれたメソッドがデコンパイル禁止でないと判定された場合には、処理Ｓ３０５に移り、デコンパイル回数読み込み部２０５を用いて、メソッドに紐づいているデコンパイル回数を取り出す。次に、処理Ｓ３０６に移り、デコンパイル回数判定部２０６を用いて、デコンパイル回数が、所定の閾値（Ｔｄ）以上かを判定する。デコンパイル回数が、所定の閾値（Ｔｄ）を越えていた場合には、処理Ｓ３０７に移りデコンパイル禁止情報付加部２０７を用いて、そのメソッドをデコンパイル禁止にするためにデコンパイル禁止の情報をメソッドに紐づけて記録する。そして、処理Ｓ３０８に移り他のメソッドをデコンパイル対象として選び処理を続ける。処理Ｓ３０６で、デコンパイル回数が、所定の閾値（Ｔｄ）を越えていない場合には、処理Ｓ３０９に移る。処理Ｓ３０９では、デコンパイル処理部２０８を用いて、メソッドをデコンパイルしてコードキャッシュ領域からコンパイル結果を削除して、コードキャッシュ領域に空きを作る。次に、処理３１０に移り、デコンパイル回数記録部２０９を用いて、メソッドに紐づいているデコンパイル回数を１回加算して記録する。そして、処理Ｓ３０１に戻る。
【００２６】
以上のように、本実施形態では、デコンパイル禁止の情報をメソッドに紐づけて、デコンパイル時に取り出してデコンパイル禁止かどうかを判定してデコンパイル禁止である場合にデコンパイル禁止とした。他の方法として、動的コンパイラが、デコンパイルするかどうかが判断するメソッドがコードキャッシュ領域内に存在できる寿命をあらわす変数に大きな値を追加することでデコンパイル禁止としてもよい。
【００２７】
本実施形態により、メソッドのデコンパイルの繰り返しの数を記録しておき、その数が、所定の閾値を越えるものは、デコンパイル禁止とし、デコンパイル対象からはずし、デコンパイルされないようにする。これにより、一旦は、使われなくなりデコンパイルされるが、また使われるようになりコンパイルされるという処理を繰り返すメソッドが把握できる。そのようなメソッドをデコンパイル禁止とすることで、次に使われる時にコンパイル済みコードがコードキャッシュに残っているため、すぐにコンパイル済みコードを実行することができ高速な仮想マシンの動作が実現できる。そのため、無駄なデコンパイルとコンパイル処理を省くことができる。
【００２８】
（実施形態２）
メソッドがコンパイルされてから（間にデコンパイルがあり）再度コンパイルされるまでの平均時間が短い場合には、そのメソッドをデコンパイル禁止にする実施形態について説明する。
【００２９】
図１のＣＰＵ１０１がＲＯＭ１０２とＲＡＭ１０３に記憶されているプログラムを実行することで実現する図４のそれぞれの機能部の構成について、フローチャート図５を用いて説明する。説明中のメソッド毎に紐づけて保存されているコンパイルからコンパイルまでの平均時間Ｃｃ変数は最初０に初期化されている（Ｃｃ＝０）とする。
【００３０】
図５の処理は、動的コンパイルによって良く使われるメソッドをコンパイルしようとした時点をＳｔａｒｔとしている。先ず、図５のＳ５０１で、図４のコンパイルメソッド選択部４０１を用いて、よく使われるメソッドをコンパイル対象として選ぶ。次に、処理Ｓ５０２に移り、平均時間取得部４０２を用いて、メソッドに紐づけて保存されているコンパイルからコンパイルまでの平均時間Ｃｃを取得する（平均時間取得値を変数Ｃｃに代入）。次に処理Ｓ５０３に移り、図１のＣＰＵ１０１を用いて、取得した平均時間Ｃｃが０（初期状態）かどうかを判定する。平均時間Ｃｃが０ではない場合には処理Ｓ５０４に移り、取得した平均時間Ｃｃが、所定の閾値Ｔｃよりも小さいかどうかを判定する。平均時間Ｃｃが、所定の閾値Ｔｃよりも小さい場合には、処理Ｓ５０５に移り、デコンパイル禁止情報付加部４０４を用いて、そのメソッドをデコンパイル禁止にするために、デコンパイル禁止情報をメソッドに紐づけて記録する。そして、処理Ｓ５１１に移りメソッドをコンパイルし、処理を終了する。このように、Ｓ５０５でデコンパイル禁止にされたメソッドに関しては、Ｓ５１１でコンパイルされているため、コンパイル済みコードとなるのでコンパイル対象としては選ばれず、本コンパイル処理には来なくなる。
【００３１】
処理Ｓ５０４で、平均時間Ｃｃが、所定の閾値Ｔｃよりも大きいと判定された場合には、処理Ｓ５０６に移り、コンパイル時間取得部４０３を用いて、メソッドに紐づけて保存されている以前のコンパイル時間を取得する（その値を変数Ｃｔに代入）。次に、処理Ｓ５０７で、現在時刻から以前のコンパイル時間（Ｃｔ）を引き、コンパイルからコンパイルまでの時間を求めて、コンパイルからコンパイルまでの平均時間に足す。
【００３２】
Ｃｃ＝Ｃｃ＋（現在時刻−Ｃｔ）
そして、処理Ｓ５０８に移り、コンパイルからコンパイルまでの平均時間を算出する。
【００３３】
Ｃｃ＝Ｃｃ／２
そして、処理Ｓ５０９で、平均時間記録部４０５を用いて、コンパイルからコンパイルまでの平均時間（Ｃｃ）をメソッドに紐づけて保存する。さらに続いて、処理Ｓ５１０で、コンパイル時間記録部４０６を用いて、現在時刻をメソッドに紐づけてコンパイル時間（Ｃｔ）として保存する。そして処理Ｓ５１１において、コンパイル処理部４０７を用いて、メソッドをコンパイルし、処理を終了する。
【００３４】
処理Ｓ５０３において、平均時間Ｃｃが０であった場合には、処理Ｓ５１２において取得した平均時間Ｃｃに、所定の閾値Ｔｃを代入して（Ｃｃ＝Ｔｃ）初期値とする。そして、処理Ｓ５０９で平均時間Ｃｃをメソッドに紐づけて保存し、Ｓ５１０で現在時刻をコンパイル時間としてメソッドに紐づけて保存し、Ｓ５１１でメソッドをコンパイルする。これにより、最初のコンパイル時にメソッドに紐づけて保存する変数を初期化して保存してから、Ｓ５０１に戻る。
【００３５】
次に、デコンパイル時にメソッドにデコンパイル禁止情報がついている場合にデコンパイル対象として選ばれない処理のフローを図６のフローチャートを用いて説明する。
【００３６】
Ｓ６０１において、コードキャッシュ領域が足りなくなったかを判定して、足りなくなければ処理を終了する。足りない場合には処理Ｓ６０２に移り、使われなくなったメソッドをデコンパイル対象として選ぶ。次に処理Ｓ６０３に移り、対象として選ばれたメソッドに、デコンパイル禁止情報がついているかを判定する。デコンパイル禁止情報がついていれば、処理Ｓ６０４でそのメソッドをデコンパイルせずに他のメソッドをデコンパイル対象として選ぶ。そして、処理Ｓ６０３に戻り処理を繰り返す。Ｓ６０３でデコンパイル禁止フラグがついていなければ、処理Ｓ６０５に移り選ばれたメソッドをデコンパイルし、処理を終了する。
【００３７】
以上により、コンパイルされてから再度コンパイルされるまでの平均時間が短い場合にデコンパイル禁止にすることで、コンパイル済み結果をそのまま使えるため、無駄なデコンパイルとコンパイルを省くことが可能となる。
【００３８】
（実施形態３）
メソッドがデコンパイルからコンパイルまでの平均時間が短いメソッドをデコンパイル禁止にする実施形態について説明する。
【００３９】
図７は、あるメソッドのコンパイルとデコンパイルを行った時点を時間軸上にプロットして示している図である。図７（ａ）は、デコンパイルからコンパイルの時間が長い場合を表している。図７（ｂ）のようにデコンパイルからコンパイルの時間が短いものは、メソッドが使用されていなくデコンパイル対象になってデコンパイルされてしまったが、すぐによく使用されるようになりコンパイルされたことを表している。デコンパイルからコンパイルの時間が短い場合には、デコンパイル禁止にしておけば、コンパイル済み結果をそのまま使えて、無駄なデコンパイルとコンパイルを省くことが可能となる。
【００４０】
以下に図１のＣＰＵ１０１がＲＯＭ１０２とＲＡＭ１０３に記憶されているプログラムを実行することで実現する処理について、フローチャート図８と図９を用いて説明する。説明中の平均時間Ｄｃ変数は最初０に初期化されている（Ｄｃ＝０）とする。
【００４１】
図８の処理は、動的コンパイルによって良く使われるメソッドをコンパイルしようとした時点をＳｔａｒｔとしている。先ず、図８の処理Ｓ８０１で、メソッドに紐づけて保存されている以前のデコンパイル時間を取得する（その値を変数Ｃｔに代入）。次に処理Ｓ８０２に移り、現在時刻から以前のデコンパイル時間（Ｃｔ）を引き、デコンパイルからコンパイルまでの時間を求めて、デコンパイルからコンパイルまでの平均時間に足す。
【００４２】
Ｄｃ＝Ｄｃ＋（現在時刻−Ｃｔ）
デコンパイルからコンパイルまでの平均時間を算出する
Ｄｃ＝Ｄｃ／２
次に処理Ｓ８０４に移り、デコンパイルからコンパイルまでの平均時間（Ｄｃ）をメソッドに紐づけて保存する。そして、処理Ｓ８０５に移りメソッドをコンパイルして処理を終える。
【００４３】
次に、図９のフローチャートを用いてデコンパイル時の処理を説明する。
【００４４】
先ず処理Ｓ９０１で、使われなくなったメソッドをデコンパイル対象として選ぶ。次に、処理Ｓ９０２に移り、選ばれたメソッドに紐づいているデコンパイル禁止情報を取り出す。そして、処理Ｓ９０３に移り、選ばれたメソッドがデコンパイル禁止かどうかを判定する。処理Ｓ９０３において選ばれたメソッドがデコンパイル禁止であると判定された場合には、処理Ｓ９０４に移り、選ばれたメソッドはデコンパイルせずに、他のメソッドをデコンパイル対象として選び、処理Ｓ９０２に戻る。
【００４５】
処理Ｓ９０３において、選ばれたメソッドがデコンパイル禁止でなかった場合には、処理Ｓ９０５に移り、メソッドに紐づけて保存されている以前のデコンパイルからコンパイルまでの平均時間を取得する（その値を変数Ｄｃに代入）。次に、処理Ｓ９０６に移りメソッドに紐づけて保存されているデコンパイル〜コンパイル平均時間Ｄｃが０か（初めてのデコンパイルか）を判定する。処理Ｓ９０６で平均時間Ｄｃが０であると判定された場合には、処理Ｓ９０７に移り、デコンパイルからコンパイルまでの平均時間Ｄｃに、所定の閾値Ｔｃを代入する（Ｄｃ＝Ｔｃ）。
【００４６】
処理Ｓ９０８で、デコンパイルからコンパイルまでの平均時刻Ｄｃをメソッドに紐づけて保存する。そして、処理Ｓ９１１に移る。
【００４７】
処理Ｓ９０６で、平均時間Ｄｃが０でないと判定された場合には、処理Ｓ９０９に移る。処理Ｓ９０９では、メソッドに紐づけて保存されているデコンパイル〜コンパイル平均時間Ｄｃが所定の閾値Ｔｃより小さいかどうかを判定する。処理Ｓ９０９で平均時間Ｄｃが所定の閾値Ｔｃより小さいと判定された場合には、処理Ｓ９１０に移り、メソッドに紐づけてデコンパイル禁止であるというデコンパイル禁止情報を保存する。そして、処理Ｓ９０４に戻る。
【００４８】
処理Ｓ９０９において、平均時間Ｄｃが所定の閾値Ｔｃより大きいと判定された場合には、処理Ｓ９１１に移る。処理Ｓ９１１では、現在時刻をメソッドに紐づけて保存（その値を変数Ｃｔに保持）する。そして、処理Ｓ９１２に移り、メソッドをデコンパイルして、コンパイル結果を削除してコードキャッシュに空きを作り処理を終了する。
【００４９】
以上により、メソッドのデコンパイルからコンパイルの平均時間が短い場合に、デコンパイル禁止にすることで、コンパイル済み結果をそのまま使えるため、無駄なデコンパイルとコンパイルを省くことが可能となる。
【００５０】
（実施形態４）
メソッドがコンパイルされてからデコンパイルされるまでの平均時間が長いメソッドをデコンパイル禁止にする実施形態について説明する。
【００５１】
図１０は時間軸上で、あるメソッドのコンパイルとデコンパイルの発生個所をあらわしている。図１０（ａ）のように、コンパイルからデコンパイルの間の時間が短いということは、短い期間に、多くの処理が起こり多くのメソッドに対して頻繁にコンパイル処理が起こって、コードキャッシュが足りなっていることを表す。そしてその期間に、使われなかったメソッドがデコンパイルされたことをあらわす。この状況下では、すぐにコードキャッシュが足りなくなる状態なので、デコンパイル禁止フラグをつけて現在使われていないメソッドのコンパイル済み結果をコードキャッシュに残り続けさせるのはよくない。逆に、図１０（ｂ）のようにコンパイルからデコンパイルの時間が長いメソッドであれば、ゆるやかにコンパイル処理が起こっている状況下で、他のメソッドへの影響も少ない。また、それだけ長い間コードキャッシュに生存して使われているメソッドであったことを示しており、次に使われる可能性が高いと判断して、デコンパイル禁止とする。
【００５２】
次に、図１１のフローチャートを用いてコンパイル時の処理を説明する。説明中のメソッド毎に紐づけて保存されているコンパイルからデコンパイルまでの平均時間Ｃｄ変数は最初０に初期化されている（Ｃｄ＝０）とする。
【００５３】
コンパイルからデコンパイルまでの平均時間を算出するために、コンパイル時の処理では、先ず、処理Ｓ１１０１で、現在時刻をメソッドに紐づけて保存する。そして、処理Ｓ１１０２に移り、メソッドをコンパイルする。
【００５４】
次に、図１２のフローチャートを用いてデコンパイル時の処理を説明する。
【００５５】
先ず処理Ｓ１２０１で、使われなくなったメソッドをデコンパイル対象として選ぶ。次に、処理Ｓ１２０２に移り、選ばれたメソッドに紐づいているデコンパイル禁止情報を取り出す。そして、処理Ｓ１２０３に移り、選ばれたメソッドがデコンパイル禁止かどうかを判定する。処理Ｓ１２０３において選ばれたメソッドがデコンパイル禁止であると判定された場合には、処理Ｓ１２０４に移り、選ばれたメソッドはデコンパイルせずに、他のメソッドをデコンパイル対象として選び、処理Ｓ１２０２に戻る。
【００５６】
処理Ｓ１２０３において、選ばれたメソッドがデコンパイル禁止でなかった場合には、処理Ｓ１２０５に移り、メソッドに紐づけて保存されている以前のコンパイルからデコンパイルまでの平均時間を取得する（その値を変数Ｃｄに代入）。次に、処理Ｓ１２０６に移りメソッドに紐づけて保存されているコンパイルからデコンパイル平均時間Ｃｄが０か（初めてのデコンパイルか）を判定する。処理Ｓ１２０６で平均時間Ｃｄが０であると判定された場合には、処理Ｓ１２０７に移り、コンパイルからデコンパイルまでの平均時間Ｃｄに、所定の閾値Ｔｃを代入する（Ｃｄ＝Ｔｃ）。次に、Ｓ１２１３に移り、コンパイルからデコンパイルまでの平均時刻Ｃｄをメソッドに紐づけて保存する。
【００５７】
処理Ｓ１２０６で、平均時間Ｃｄが０でないと判定された場合には、処理Ｓ１２０８に移る。処理Ｓ１２０８では、メソッドに紐づけて保存されているコンパイルからデコンパイルまでの平均時間Ｃｄが所定の閾値Ｔｃより大きいかどうかを判定する。処理Ｓ１２０８で平均時間Ｃｄが所定の閾値Ｔｃより大きいと判定された場合には、処理Ｓ１２０９に移り、メソッドに紐づけてデコンパイル禁止であるというデコンパイル禁止情報を保存する。そして、処理Ｓ１２０４に戻る。
【００５８】
処理Ｓ１２０８において、平均時間Ｃｄが所定の閾値Ｔｃより小さいと判定された場合には、処理Ｓ１２１０に移る。処理Ｓ１２１０では、メソッドに紐づけて保存されている以前のコンパイル時間を取得する（その値を変数Ｃｔに代入する）。次に処理Ｓ１２１１に移り、現在時刻から以前のコンパイル時間（Ｃｔ）を引き、コンパイルからデコンパイルまでの時間を求めて、コンパイルからデコンパイルまでの平均時間に足す。
【００５９】
Ｃｄ＝Ｃｄ＋（現在時刻−Ｃｔ）
そして、処理Ｓ１２１２に移り、コンパイルからデコンパイルまでの平均時間を算出する。
【００６０】
Ｃｄ＝Ｃｄ／２
そして、処理Ｓ１２１３に移り、コンパイルからデコンパイルまでの平均時間（Ｃｄ）をメソッドに紐づけて保存する。そして、処理Ｓ１２１４に移り、メソッドをデコンパイルしてコンパイル結果を削除して、処理を終了する。
【００６１】
以上により、コンパイルされてからデコンパイルされるまでの平均時間が長いメソッドを、次に使われる可能性が高いと判断してデコンパイル禁止にすることで、無駄なデコンパイルとコンパイルを省くことが可能となる。
【００６２】
（実施形態５）
実施形態３は、「デコンパイルからコンパイルまでの平均時間が短いメソッドをデコンパイル禁止にする」方法であった。実施形態４は「コンパイルからデコンパイルまでの平均時間が長いメソッドをデコンパイル禁止にする」方法であった。両方の方法を組み合わせて、「デコンパイルからコンパイルまでの平均時間が短い」かつ「コンパイルからデコンパイルまでの平均時間が長い」メソッドをデコンパイル禁止にする。この方法で、より精度の高いデコンパイル禁止方法が実現できる。
【００６３】
さらには、それぞれの方法に、実施形態１の「デコンパイル回数が多いメソッドをデコンパイル禁止にする」方法を組み合わせることによっても、より精度の高いデコンパイル禁止方法が実現できる。また、実施形態２の「コンパイルからコンパイルまでの平均時間が短いメソッドをデコンパイル禁止にする」方法を組み合わせることによっても、より精度の高いデコンパイル禁止方法が実現できる。
【００６４】
（実施形態６）
デコンパイル禁止のメソッドが増えてしまうとコードキャッシュが足りなくなってしまう問題が発生する。そこで、デコンパイル禁止にしてコードキャッシュ領域の中にコンパイル済みコードを残しておいても、やはり使われないというメソッドを検出してデコンパイル禁止を解除する。デコンパイル禁止にした時点から、デコンパイル対象に選ばれる回数（デコンパイル対象選択回数）を記録しておき、デコンパイル対象選択回数が、所定の閾値を越えた場合には、デコンパイル禁止を解除する方法を説明する。
【００６５】
前記図１のＣＰＵ１０１がＲＯＭ１０２とＲＡＭ１０３に記憶されているプログラムを実行することで実現する図１３のそれぞれの機能部の構成について、フローチャート図１４を用いて説明する。
【００６６】
図１３の機能構成図は、本実施形態におけるデコンパイル禁止解除装置１３００のソフトウェア構成の一例である。また、図１３は、実施形態１で用いた図４の機能構成図に、デコンパイル禁止情報解除部１３１０を追加し、機能の流れを調整した図である。
【００６７】
図１４の処理は、動的コンパイルによってメソッドがコンパイルされコードキャッシュ領域にコンパイル済み結果を保存しようとした時点をＳｔａｒｔとしている。
【００６８】
図１４の処理Ｓ３０１からＳ３０３までは、実施形態１の説明と同様の処理を行う。処理Ｓ３０３で、選ばれたメソッドに紐づいているデコンパイル禁止情報を取り出した後、処理Ｓ３０５に移る（実施形態１とはＳ３０４とＳ３０５の呼びだす順番が違う）。処理Ｓ３０５では、図１３のデコンパイル回数読み込み部２０５を用いて、メソッドに紐づいているデコンパイル回数を取り出す。次に処理Ｓ３０４に移り、図１３のデコンパイル禁止判定部２０４を用いて、選ばれたメソッドがデコンパイル禁止かどうかを判定する。処理Ｓ３０４において選ばれたメソッドがデコンパイル禁止であると判定された場合には、処理Ｓ１４０１に移り、デコンパイル対象選択回数記録の処理を行う。デコンパイル対象選択回数記録は、デコンパイル回数記録部２０９を用いて、メソッドに紐づいているデコンパイル回数を１回加算してから記録する。次に処理Ｓ１４０２に移り、デコンパイル回数が、所定の閾値（Ｔｄ２）以上かどうかをデコンパイル回数判定部２０６を用いて判定する。処理Ｓ１４０２でデコンパイル回数が、所定の閾値（Ｔｄ２）より小さい場合には処理Ｓ３０８に移り、デコンパイルメソッド選択部２０２を用いて、他のメソッドをデコンパイル対象として選び、処理Ｓ３０３に処理を戻す。処理Ｓ１４０２でデコンパイル回数が、所定の閾値（Ｔｄ２）以上であった場合には処理Ｓ１４０３に移り、デコンパイル禁止情報解除部１３１０を用いて、デコンパイル禁止情報を解除する。次に、処理Ｓ１４０４に移り、デコンパイル回数記録部２０９を用いて、デコンパイル回数を０にしてからメソッドに紐づけて記録する。そして処理Ｓ３０８に処理を戻す。所定の閾値（Ｔｄ２）の値を調整することによって、メソッドのデコンパイル禁止状態を保ち、コードキャッシュ領域内にどれくらい残しておくかを調整することが可能である。所定の閾値（Ｔｄ２）の値が大きければ大きいほどメソッドがデコンパイルされない期間が長くなる。
【００６９】
処理Ｓ３０４において選ばれたメソッドがデコンパイル禁止でないと判定された場合には、処理Ｓ３０６に移り、デコンパイル回数判定部２０６を用いて、デコンパイル回数が、所定の閾値（Ｔｄ）以上かを判定する。処理Ｓ３０６でデコンパイル回数が、所定の閾値（Ｔｄ）を越えていたと判定された場合には、処理Ｓ３０７に移る。そして、デコンパイル禁止情報付加部２０７を用いて、そのメソッドをデコンパイル禁止にするために、デコンパイル禁止情報をメソッドに紐づけて記録する。そして、処理Ｓ１４０４に移り、デコンパイル回数記録部２０９を用いて、デコンパイル回数を０にしてからメソッドに紐づけて記録して、処理Ｓ３０８に処理を戻す。
【００７０】
処理Ｓ３０６でデコンパイル回数が、所定の閾値（Ｔｄ）を越えていないと判定された場合には、処理Ｓ３０９に移る。処理Ｓ３０９では、デコンパイル処理部２０８を用いて、メソッドをデコンパイルしてコードキャッシュ領域からコンパイル結果を削除して、コードキャッシュ領域に空きを作る。次に、処理３１０に移り、デコンパイル回数記録部２０９を用いて、メソッドに紐づいているデコンパイル回数を１回加算して記録する。そして、処理Ｓ３０１に戻る。
【００７１】
以上により、メソッドをデコンパイル禁止にした後も、メソッドのデコンパイル対象への選ばれ方を調査してデコンパイル禁止を解除する方法を持つことで、コードキャッシュ領域が足りなくなることを防ぐことが可能となる。
【００７２】
（実施形態７）
図１５の１５００は、１５０１の仮想マシン上に、１５０２のアプリケーションフレームワークが搭載されて、複数のアプリケーション（１５０３，１５０４，１５０５，…）が一つの仮想マシン上で動作するシステムである。アプリケーションフレームワークは、アプリケーションのインストール・アンインストール・起動・停止を行う。
【００７３】
アプリケーションが、アプリケーションフレームワークによってアンインストールや停止された場合には、アプリケーションが使用していたメソッドは必要なくなる。
【００７４】
今、アプリケーションが使用していたメソッドが、仮想マシン内の１５０６の動的コンパイラによってコンパイルされ、本発明の方式を用いてデコンパイル禁止手段１５０７によってデコンパイル禁止になっているとする。アプリケーションがアンインストールや停止されたことを検知した場合には、アプリケーションの使用していたメソッドのデコンパイル禁止をデコンパイル禁止解除手段１５０８によって解除する。このメソッド不使用検知によってデコンパイル禁止解除処理を行うことにより、使用されないメソッドがデコンパイル対象になるため、動的コンパイラ１５０６によってデコンパイルされる。これにより、コードキャッシュ領域を有効に使う事ができる。
【００７５】
（実施形態８）
実施形態６や７の方法を用いて、デコンパイル禁止を解除することが決定されたメソッドのコンパイル済みコードを図１の外部記憶部１０５にコードキャッシュ領域から移し、コードキャッシュ領域に空きを作る。
【００７６】
そして、そのメソッドがよく使われるようになった場合には、コンパイル処理の代わりに、外部記憶部１０５からコンパイル済みコードをコードキャッシュ領域内に戻すコードキャッシュ領域内移動処理を行う。これにより、再度コンパイルする必要がなくなる。これにより、デコンパイル禁止のメソッドが増えてしまうとコードキャッシュ領域が足りなくなることを防ぎつつ、余計なコンパイル処理を省くことが可能になる。
【００７７】
（他の実施形態）
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア（プログラム）を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ（またはＣＰＵやＭＰＵ等）がプログラムを読み出して実行する処理である。
【符号の説明】
【００７８】
２００  デコンパイル禁止装置
２０１  コードキャッシュ不足判定部
２０２  デコンパイルメソッド選択手段
２０３  デコンパイル禁止情報読み込み部
２０４  デコンパイル禁止判定部
２０５  デコンパイル回数読み込み部
２０６  デコンパイル回数判定部
２０７  デコンパイル禁止情報付加部
２０８  デコンパイル処理部
２０９  デコンパイル回数記録部
【図１】
2019133414.tif 000003
【図２】
2019133414.tif 000004
【図３】
2019133414.tif 000005
【図４】
2019133414.tif 000006
【図５】
2019133414.tif 000007
【図６】
2019133414.tif 000008
【図７】
2019133414.tif 000009
【図８】
2019133414.tif 000010
【図９】
2019133414.tif 000011
【図１０】
2019133414.tif 000012
【図１１】
2019133414.tif 000013
【図１２】
2019133414.tif 000014
【図１３】
2019133414.tif 000015
【図１４】
2019133414.tif 000016
【図１５】
2019133414.tif 000017