(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023157618
(43)【公開日】2023-10-26
(54)【発明の名称】情報処理プログラム、情報処理方法及び情報処理装置
(51)【国際特許分類】
G06F 9/445 20180101AFI20231019BHJP
G06F 12/0875 20160101ALI20231019BHJP
【FI】
G06F9/445 130
G06F12/0875 100
G06F9/445 150
【審査請求】未請求
【請求項の数】6
【出願形態】OL
(21)【出願番号】P 2022067639
(22)【出願日】2022-04-15
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】▲高▼栗 和久
(72)【発明者】
【氏名】木村 幸浩
(72)【発明者】
【氏名】矢野 公規
(72)【発明者】
【氏名】桐山 卓弥
(72)【発明者】
【氏名】永田 治人
(72)【発明者】
【氏名】小形 俊貴
(72)【発明者】
【氏名】笠井 輝美
(72)【発明者】
【氏名】数村 憲治
【テーマコード(参考)】
5B205
5B376
【Fターム(参考)】
5B205MM02
5B205UU45
5B205VV03
5B376AC11
5B376EA11
5B376EA23
5B376FA25
(57)【要約】 (修正有)
【課題】情報処理装置の処理性能の劣化を軽減する情報処理装置、情報処理方法及び情報処理プログラムを提供する。
【解決手段】情報処理装置は、複数のメソッドのコードが格納されたコードキャッシュ201において他のコードを格納するための空き容量が不足する場合、削除対象外リスト204を参照して、複数のメソッドのうち削除対象外リストに示されるメソッドを除く他のメソッドの中から選択される第1メソッドの第1コードをコードキャッシュから削除するコードキャッシュフラッシング実行部14と、所定期間毎に第1メソッドの実行時間を計測し、所定期間のうち第1コードがコードキャッシュから削除される前の期間と後の期間との夫々における第1メソッドの実行時間及び第1コードを削除した後の一定時間内に第1コードがコードキャッシュに記憶される回数を基に、第1メソッドを削除対象外リストに登録するサンプリングデータ分析部15と、を備える。
【選択図】
図3
【特許請求の範囲】
【請求項1】
複数のメソッドのコードが格納されたキャッシュにおいて他のコードを格納するための空き容量が不足する場合、削除対象外リストを参照して、前記複数のメソッドのうち前記削除対象外リストに示されるメソッドを除く他のメソッドの中から選択される第1メソッドの第1コードを前記キャッシュから削除し、
所定期間毎に前記第1メソッドの実行時間を計測し、
前記所定期間のうち前記第1コードが前記キャッシュから削除される前の期間と後の期間とのそれぞれにおける前記第1メソッドの実行時間、及び、前記第1コードを削除した後の一定時間内に前記第1コードが前記キャッシュに記憶される回数を基に、前記第1メソッドを前記削除対象外リストに登録する
処理をコンピュータに実行させることを特徴とする情報処理プログラム。
【請求項2】
前記前の期間における前記第1メソッドの実行時間に対する前記後の期間における前記第1メソッドの実行時間の増加率が第1閾値以上の場合に、前記前の期間における前記第1メソッドの実行時間及び前記第1コードを削除した後の一定時間内に前記第1コードが前記キャッシュに記憶される回数に応じて、前記第1コードを示す情報を前記削除対象外リストに登録することを特徴とする請求項1に記載の情報処理プログラム。
【請求項3】
前記前の期間における前記第1メソッドの実行時間が第2閾値以上であり、且つ、前記第1コードを削除した後の一定期間内に前記第1コードが前記キャッシュに記憶された事象の発生回数が第3閾値以上の場合に、前記第1コードを示す情報を前記削除対象外リストに登録することを特徴とする請求項2に記載の情報処理プログラム。
【請求項4】
各前記所定期間において特定間隔でCPU(Central Processing Unit)が実行するメソッドを抽出して各メソッドの抽出回数を算出することで前記第1メソッドの抽出回数を取得し、取得した前記第1メソッドの抽出回数を前記第1メソッドの前記実行時間とすることを特徴とする請求項1に記載の情報処理プログラム。
【請求項5】
情報処理装置に、
複数のメソッドのコードが格納されたキャッシュにおいて他のコードを格納するための空き容量が不足する場合、削除対象外リストを参照して、前記複数のメソッドのうち前記削除対象外リストに示されるメソッドを除く他のメソッドの中から選択される第1メソッドの第1コードを前記キャッシュから削除し、
所定期間毎に前記第1メソッドの実行時間を計測し、
前記所定期間のうち前記第1コードが前記キャッシュから削除される前の期間と後の期間とのそれぞれにおける前記第1メソッドの実行時間、及び、前記第1コードを削除した後の一定時間内に前記第1コードが前記キャッシュに記憶される回数を基に、前記第1メソッドを前記削除対象外リストに登録する
処理を実行させることを特徴とする情報処理方法。
【請求項6】
複数のメソッドのコードが格納されたキャッシュにおいて他のコードを格納するための空き容量が不足する場合、削除対象外リストを参照して、前記複数のメソッドのうち前記削除対象外リストに示されるメソッドを除く他のメソッドの中から選択される第1メソッドの第1コードを前記キャッシュから削除する削除部と、
所定期間毎に前記第1メソッドの実行時間を計測し、前記所定期間のうち前記第1コードが前記キャッシュから削除される前の期間と後の期間とのそれぞれにおける前記第1メソッドの実行時間、及び、前記第1コードを削除した後の一定時間内に前記第1コードが前記キャッシュに記憶される回数を基に、前記第1メソッドを前記削除対象外リストに登録する分析部と
を備えたことを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理プログラム、情報処理方法及び情報処理装置に関する。
【背景技術】
【0002】
Javaプログラムは、プログラムとOS(Operating System)の橋渡し役を担うソフトウェアであるJavaVM(Virtual Machine)により実行されることで動作する。JavaVMは、Javaプログラムであるアプリケーションを実行するときに、インタプリタによりバイトコードを1命令ずつ解釈しての実行する場合と、動的コンパイラでネイティブコードに変換してから実行する場合がある。
【0003】
ネイティブコードは、動的コンパイラによって生成され、作成されたネイティブコードはJavaプロセスで使用されるメモリ上に格納される。この、ネイティブコードを格納する、Javaプロセスで使用されるメモリ上の領域は、「コードキャッシュ」と呼ばれる。なお、コードキャッシュは単に「キャッシュ」とも呼ばれることがある。
【0004】
ネイティブコードは、動的に生成されるため徐々に増加する。そこで、コードキャッシュが無制限にメモリを使用しないようにするため、コードキャッシュとして使用可能な領域の大きさには上限が設けられる。コードキャッシュとして使用可能な領域に上限を設けた場合、大規模なシステムを長時間運用している環境ではコードキャッシュが不足することが考えられる。そのような状況では動的コンパイラが動作できず、スループットの悪化やレスポンス時間の遅延などの性能劣化が発生するおそれがある。
【0005】
この問題への対応として、コードキャッシュが不足した時に、コードキャッシュの空き領域を確保することを目的として、一部のネイティブコードを削除するコードキャッシュフラッシング(Code Cache Flushing)という技術がある。コードキャッシュフラッシングによりコードキャッシュに空きができる場合は動的コンパイル処理が再開するが、コードキャッシュフラッシングにより削除されたコードは、再びネイティブコードに変換されるまでインタプリタで実行される。
【0006】
コードキャッシュフラッシングにより、性能上重要となるJavaメソッドが一旦インタプリタによる実行に戻った場合、再び動的コンパイラがネイティブコードに変換されるまでの間は性能が低下する場合がある。
【0007】
また、アプリケーションの性能が劣化した場合に、コードキャッシュ領域不足やコードキャッシュフラッシングの影響を受けているかを正確に判断することは困難である。従来は、コードキャッシュの使用サイズのデータを常時採取して、性能劣化した時刻との対応をとることで、コードキャッシュ不足の影響の可能性を探ることが行われている。ただし、この方法では、インタプリタに戻ったメソッドと性能劣化との関係を特定することは困難である。
【0008】
なお、再コンパイルの無駄を減らす技術として、コードキャッシュから関数を消去する処理において、アプリケーション毎に重要性を定義し、重要性が高いネイティブコードが長期間コードキャッシュに残るように制御する技術が提案されている。
【先行技術文献】
【特許文献】
【0009】
【発明の概要】
【発明が解決しようとする課題】
【0010】
従来のコードキャッシュフラッシングでは、動的コンパイルされた時期が古いネイティブコードから順にコードキャッシュから削除される。これは、新しくコンパイルされたネイティブコードは、直近で頻繁に動いた実績があるため、古いコードを削除するという考えに基づく。
【0011】
しかしながら、アプリケーションによっては、性能上重要なメソッドが古い時期にコンパイルされて、長期間にわたり使用される場合も存在する。このような場合、従来のコードキャッシュフラッシングでは、性能上重要なメソッドにも関わらず削除される可能性があり、それによりJavaVMの性能劣化が発生するおそれがある。この場合、再コンパイルによって性能劣化は解消されることも考えられるが、次々と新しいメソッドがコンパイルされるアプリケーションでは、再コンパイルされた性能上重要なメソッドがすぐに再び古いメソッドとなる。そして、性能上重要なメソッドが再びコードキャッシュフラッシングの対象になることで性能劣化を引き起こすことが繰り返される。
【0012】
アプリケーション毎にその重要度とキャッシュ優先度とがあらかじめテーブルで定義されており、この定義にしたがって、残すネイティブコードを決定する場合、静的な情報を使用するため、実際の動作に即して削除するネイティブコードを決定することは難しい。そのため、コンピュータの処理性能の劣化を軽減することは困難である。
【0013】
開示の技術は、上記に鑑みてなされたものであって、情報処理装置の処理性能の劣化を軽減する情報処理プログラム、情報処理方法及び情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【0014】
本願の開示する情報処理プログラム、情報処理方法及び情報処理装置の一つの態様において、複数のメソッドのコードが格納されたキャッシュにおいて他のコードを格納するための空き容量が不足する場合、削除対象外リストを参照して、前記複数のメソッドのうち前記削除対象外リストに示されるメソッドを除く他のメソッドの中から選択される第1メソッドの第1コードを前記キャッシュから削除し、所定期間毎に計測された前記第1メソッドの実行時間を基に、前記所定期間のうち前記第1コードが前記キャッシュから削除される前の期間と後の期間とのそれぞれにおける前記第1メソッドの実行時間、及び、前記第1コードを削除した後の一定時間内に前記第1コードが前記キャッシュに記憶される回数を基に、前記第1メソッドを前記削除対象外リストに登録する。
【発明の効果】
【0015】
1つの側面では、本発明は、情報処理装置の処理性能の劣化を軽減することができる。
【図面の簡単な説明】
【0016】
【
図1】
図1は、情報処理装置の一例を示すハードウェア構成図である。
【
図2】
図2は、情報処理装置におけるソフトウェアの一例を示すシステム構成図である。
【
図3】
図3は、情報処理装置の一例を示すブロック図である。
【
図4】
図4は、候補メソッドリストの一例を示す図である。
【
図5】
図5は、累積パフォーマンスカウンタの一例を示す図である。
【
図6】
図6は、区間パフォーマンスカウンタテーブルの一例を示す図である。
【
図7】
図7は、X時点及びY時点累積パフォーマンスカウンタの一例を示す図である。
【
図8】
図8は、区間パフォーマンスカウンタテーブルの生成の一例を説明するための図である。
【
図9】
図9は、コードキャッシュフラッシング通知を受信した場合の区間パフォーマンスカウンタの算出の一例を説明するための図である。
【
図11】
図11は、再コンパイルリストの一例を示す図である。
【
図12】
図12は、フラッシングメソッドリストの一例を示す図である。
【
図14】
図14は、コンパイラスレッドの一例を示すフローチャートである。
【
図15】
図15は、メソッドサンプリング処理の一例を示すフローチャートである。
【
図16】
図16は、サンプリングデータ分析処理の一例を示すフローチャートである。
【
図17】
図17は、コードキャッシュフラッシング処理の一例を示すフローチャートである。
【発明を実施するための形態】
【0017】
以下に、本願の開示する情報処理プログラム、情報処理方法及び情報処理装置の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理プログラム、情報処理方法及び情報処理装置が限定されるものではない。
【実施例0018】
図1は、情報処理装置の一例を示すハードウェア構成図である。
図1に示すように、本実施例に係る情報処理装置1は、CPU(Central Processing Unit)2、メモリ3及びデータ格納装置4を有する。
【0019】
データ格納装置4は、補助記憶装置である。データ格納装置4は、例えば、HDD(Hard Disk Drive)やSSD(Solid State Drive)である。データ格納装置4は、OS、JavaVMのプログラム及びJavaプログラムなどを含む各種プログラムを格納する。また、データ格納装置4は、演算結果などのデータを格納する。
【0020】
メモリ3は、主記憶装置である。メモリ3は、例えば、DRAM(Dynamic Random Access Memory)である。
【0021】
CPU2は、バスを介してメモリ3及びデータ格納装置4に接続される。CPU2は、データ格納装置4から各種プログラムを読み出して、メモリ上に展開して各種のプロセスを生成して実行する。例えば、CPU2は、OSを動作させ、さらに、OS上でJavaVMを動作させる。そして、CPU2は、JavaVMを用いてJavaプログラムを実行する。
【0022】
図2は、情報処理装置におけるソフトウェアの一例を示すシステム構成図である。
図2に記載した各ソフトウェアの機能は、CPU2により実現される。
【0023】
CPU2は、OS5を動作させる。さらに、CPU2は、OS5の上でJavaVMを動作させる。JavaVMでは、モジュール10が動作する。モジュール10は、例えば、dll(dynamic link library)ファイルやso(shared object)ファイルなどが実行されることで動作する。また、JavaVMには、Javaプロセスで使用されるプロセスメモリ20が割り当てられる。プロセスメモリ20は、例えば、
図1におけるメモリ3の一部の領域である。
【0024】
モジュール10は、プロセスメモリ20の中にJavaプログラムのネイティブコードを格納するためのコードキャッシュ201を確保する。モジュール10は、Javaプログラムを実行する。
【0025】
例えば、モジュール10は、Javaプログラムをインタプリタで実行する。そして、モジュール10は、インタプリタで実行した各メソッドについて、ネイティブコードへの変換を行なうか否かを判定する。ネイティブコードへの変換を行なうと決定した場合、モジュール10は、対象のメソッドについてコンパイルを行い、生成したネイティブコードをコードキャッシュ201に格納する。その後、モジュール10は、コードキャッシュ201に格納されたネイティブコードを用いてそのメソッドを実行する。
【0026】
さらに、モジュール10は、OS5からの指示を受けて、定期的にメソッドサンプリングを実行する。モジュール10は、メソッドサンプリングを行うことで、プログラムが実行された期間における定期的な評価区間毎の各メソッドの実行回数を表すサンプリングデータ6を取得する。また、モジュール10は、コードフラッシング発生時には、実行中のメソッドサンプリングを停止して、その時点から新たな評価区間毎のメソッドサンプリングを開始する。そして、モジュール10は、サンプリングデータ6を基にプロセスメモリ20におけるコードキャッシュ201に格納されたネイティブコードの中から削除対象外とするネイティブコードを決定する。そのうえで、モジュール10は、ら削除対象外としたネイティブコード以外を対象としてコードフラッシングを行う。その後、モジュール10は、ネイティブコードが削除されたメソッドについてインタプリタでの実行に戻す。
【0027】
また、モジュール10は、サンプリングデータ6の分析結果やコードキャッシュフラッシングの結果などをバイナリ形式ファイル8又はテキスト形式ログファイル7として
図1に示したデータ格納装置4などに格納する。
【0028】
可視化ツール9は、OS5の上で動作するアプリケーションである。可視化ツール9は、バイナリ形式ファイル8やテキスト形式ログファイル7を取得して、サンプリングデータ6の分析結果やコードキャッシュフラッシングの結果などを可視化する可視化情報を生成する。その後、可視化ツール9は、生成した可視化情報をモニタなどに表示させて、利用者にサンプリングデータ6の分析結果やコードキャッシュフラッシングの結果などを通知する。
【0029】
図3は、情報処理装置の一例を示すブロック図である。以下に、モジュール10によるコンパイラスレッド、メソッドサンプリング処理及びサンプリリングデータ分析処理の詳細について説明する。コンパイラスレッドとは、コンパイル及びコードキャッシュフラッシングを含むコンパイルに関連する一連の処理である。
【0030】
図3に示すように、モジュール10は、プログラム実行部11、コンパイル実行部13、コードキャッシュフラッシング実行部14、サンプリングデータ分析部15及びメソッドサンプリング部16を有する。また、プロセスメモリ20は、候補メソッドリスト202、フラッシングメソッドリスト203、削除対象外リスト204、X時点累積パフォーマンスカウンタ205及びY時点累積パフォーマンスカウンタ206を格納する。また、プロセスメモリ20は、コードキャッシュフラッシング通知フラグ207及びフラッシング直後フラグ208を格納する。さらに、プロセスメモリ20は、区間パフォーマンスカウンタテーブル209、増加率テーブル210、閾値211、累積パフォーマンスカウンタ212及び再コンパイルリスト213を格納する。
【0031】
また、情報処理装置1は、プログラム格納部41及び結果格納部42を有する。プログラム格納部41及び結果格納部42は、例えば、
図1のデータ格納装置4により実現される。プログラム格納部41は、例えば、Javaプログラムを格納する。結果格納部42は、
図2におけるテキスト形式ログファイル7及びバイナリ形式ファイル8などを含むモジュール10が実行した各種処理の結果データを格納する。
【0032】
プログラム実行部11は、プログラム格納部41からプログラムを読み出す。そして、プログラム実行部11は、インタプリタによる実行又はネイティブコードからの実行のいずれかでプログラムに含まれる各メソッドを実行する。
【0033】
プログラム実行部11は、インタプリタ処理部12を有する。インタプリタでメソッドを実行する場合、インタプリタ処理部12は、対象のメソッドのバイトコードを1つずつ解釈して実行する。
【0034】
また、インタプリタ処理部12は、実行頻度などの所定の条件を満たしたメソッドを選択する。そして、インタプリタ処理部12は、選択したメソッドの翻訳依頼をコンパイル実行部13へ出力する。
【0035】
また、プログラム実行部11は、ネイティブコードからの実行でメソッドを実行する場合、コードキャッシュ201から対象のメソッドのネイティブコードを取得して実行する。
【0036】
コンパイル実行部13は、動的コンパイルを実行する。コンパイル実行部13は、メソッドの翻訳依頼をインタプリタ処理部12から受ける。そして、コンパイル実行部13は、翻訳依頼を受けたメソッドの情報をプログラム格納部41に格納されたJavaプログラムから取得する。
【0037】
次に、コンパイル実行部13は、取得したメソッドのネイティブコードを格納するのに十分な空きがコードキャッシュ201に存在するか否かを判定する。コードキャッシュ201に十分な空きが存在する場合、コンパイル実行部13は、各ネイティブコードについての読み出し回数などに基づく予め決められたコードキャッシュフラッシングの条件を満たしているか否かを判定する。コードキャッシュフラッシングの条件を満たしていなければ、コンパイル実行部13は、コンパイル処理を実行して取得したメソッドを翻訳してネイティブコードを生成する。そして、コンパイル実行部13は、コードキャッシュ201に生成したネイティブコードを格納する。
【0038】
これに対して、コードキャッシュ201に十分な空きが存在しない場合又はコードキャッシュフラッシングの条件を満たしている場合、コンパイル実行部13は、コードキャッシュフラッシングの実行をコードキャッシュフラッシング実行部14に依頼する。
【0039】
この際、コンパイル実行部13は、コードキャッシュフラッシングの対象候補とする候補メソッドを選択する。例えば、コンパイル実行部13は、動的コンパイルされた時期が古いネイティブコードから順にコードキャッシュ201に空きを確保するために十分な数の候補メソッドを選択する。そして、コンパイル実行部13は、選択した候補メソッドの一覧である候補メソッドリスト202を生成する。
【0040】
図4は、候補メソッドリストの一例を示す図である。例えば、コンパイル実行部13は、
図4に示すように各候補メソッドのメソッド識別子として各候補メソッドの名前を候補メソッドリスト202に登録する。ここで、
図4の紙面に向かって左側の番号は候補メソッドリスト202における各メソッドに割り当てられた通し番号である。その後、コンパイル実行部13は、候補メソッドリスト202をプロセスメモリ20に格納する。
【0041】
図1に戻って説明を続ける。メソッドサンプリング部16は、定期的な特定間隔でプログラム実行部11が実行するメソッドについてメソッドサンプリングを実行する。メソッドサンプリング部16は、その時点でプログラム実行部11が実行中のメソッドを抽出することでメソッドサンプリングを行う。メソッドサンプリングによる各メソッドの抽出回数は、パフォーマンスカウンタとして表される。特定間隔でのサンプリング時に抽出されたメソッドは、そのタイミングで実行されているメソッドである。すなわち、抽出回数は各メソッドの実行時間にあたるといえる。
【0042】
メソッドサンプリング部16は、例えば数100ミリ秒といった性能に影響のない程度の短い間隔で継続的にメソッドサンプリリングを実行する。これにより、メソッドサンプリング部16は、プログラムの実行中の特定間隔での各メソッドの抽出回数を表すサンプリングデータ6を取得する。そして、メソッドサンプリング部16は、メソッド毎にサンプリングデータ6を累積パフォーマンスカウンタ212に加算する。
【0043】
図5は、累積パフォーマンスカウンタの一例を示す図である。累積パフォーマンスカウンタ212は、メソッドの名前と対応付けられたカウンタを有する。累積パフォーマンスカウンタ212における各カウンタの値は、各メソッドが抽出された回数の累積数を表す。
【0044】
メソッドサンプリング部16は、
図5に示すようにメソッドサンプリングを継続的に実行して、定期的に累積パフォーマンスカウンタ212の値を更新する。
図5においてメソッドサンプリングから延びる矢印が、メソッドサンプリング部16による特定間隔での累積パフォーマンスカウンタ212の更新を表す。メソッドサンプリング部16は、javaプログラムのプロセスの終了又はサンプリングの停止指示を受けるまで、定期的なメソッドサンプリングを繰り返す。
【0045】
図3に戻って説明を続ける。サンプリングデータ分析部15は、サンプリングデータ6を用いて、例えば10秒間といった予め決められた評価区間での各メソッドについてのパフォーマンスカウンタの値の変化を監視する。この評価区間の時間が、「所定期間」の一例にあたる。そして、サンプリングデータ分析部15は、コードキャッシュフラッシング直前の10秒間と及び直後の10秒間とのパフォーマンスカウンタの値の変化を用いてメソッド毎の実行時間の変化を評価する。すなわち、サンプリングデータ分析部15は、メソッドの実行に消費したCPU時間ではなく、メソッドサンプリングから得られるパフォーマンスカウンタの値を用いて各メソッドの実行時間を評価する。ここで、メソッドサンプリングにより得られたパフォーマンスカウンタの所定間隔での値はその間にメソッドが消費したCPU時間と等価に評価でき、且つ、メソッドサンプリングは消費したCPU時間の計測に比べて軽い負荷で実行可能である。ただし、負荷が重くなることを許容可能であれば、サンプリングデータ分析部15は、消費したCPU時間を用いてメソッドの実行時間を評価してもよく、より正確に実行時間を評価することが可能となる。
【0046】
サンプリングデータ分析部15は、コードキャッシュフラッシングにより削除されたメソッドについて、コードキャッシュフラッシングの前の期間と後の期間とでパフォーマンスカウンタの値が大きく増えた場合に、実行時間が延びたと判定する。そして、サンプリングデータ分析部15は、実行時間が延びたメソッドについて、ネイティブコードの実行からインタプリタへの実行に切り替わることによりCPU2の処理性能の劣化への影響が大きいメソッドと判定する。すなわち、サンプリングデータ分析部15は、コードキャッシュフラッシングの前の期間と後の期間とでパフォーマンスカウンタの値の変化をCPU2の処理性能へ各メソッドの影響度とする。さらに、サンプリングデータ分析部15は、各メソッドについて再コンパイルの発生回数及び実行されている期間を算出して、発生回数が多く且つ実行されている期間が長いメソッドは重要なメソッドと判定する。すなわち、サンプリングデータ分析部15は、再コンパイルの発生回数及び実行されている期間により各メソッドの重要度を判定する。そして、サンプリングデータ分析部15は、影響度及び重要度が所定の条件を満たすメソッドをコードキャッシュフラッシングによる削除対象から外す。以下に、サンプリングデータ分析部15の動作の詳細について説明する。ここでは、評価区間を10秒間として説明する。
【0047】
サンプリングデータ分析部15は、10秒間隔で以下の処理を繰り返す。サンプリングデータ分析部15は、
図6に示す区間パフォーマンスカウンタテーブル209の最後に、今回の評価区間にあたる新たな列を追加する。
図6は、区間パフォーマンスカウンタテーブルの一例を示す図である。
【0048】
図6に示す区間パフォーマンスカウンタテーブル209の紙面に向かって最上段の列は、各評価区間に連番で割り振られた区間パフォーマンスカウンタテーブル209における番号にあたる。区間パフォーマンスカウンタテーブル209は、
図6に示すように、評価期間毎の各メソッドのカウンタの値が登録される。ここで、評価期間におけるカウンタの値とは、評価期間におけるカウンタの増加量である。また、区間パフォーマンスカウンタテーブル209は、評価区間毎にフラッシュ直後フラグが設定される。区間パフォーマンスカウンタテーブル209におけるフラッシュ直後のフラグは、Ture又はFalseとして設定される。フラッシュ直後のフラグは、Tureに設定された場合、その評価区間の直前にコードキャッシュフラッシングが実行されたことを表す。逆に、Falseの場合は、フラッシュ直後のフラグは、その評価区間の直前にコードキャッシュフラッシングが実行されていないことを表す。
【0049】
図3に戻って説明を続ける。サンプリングデータ分析部15は、新たに追加した列のフラッシュ直後のフラグをfalseに設定して、且つ、各メソッド識別子に対応するカウンタ値は0に設定して初期化する。
【0050】
次に、サンプリングデータ分析部15は、X時点累積パフォーマンスカウンタ205に登録されたメソッド識別子及びカウンタ値を全て削除する。X時点累積パフォーマンスカウンタ205は、評価区間における最初の累積パフォーマンスカウンタ212のカウンタ値を保持するカウンタである。
図7は、X時点及びY時点累積パフォーマンスカウンタの一例を示す図である。X時点累積パフォーマンスカウンタ205は、メソッド識別子とカウンタの値とが対応付けて登録される。
【0051】
次に、サンプリングデータ分析部15は、その時点での累積パフォーマンスカウンタ212に登録された各メソッドのメソッド識別子及びカウンタの値を取得する。そして、サンプリングデータ分析部15は、取得したメソッド識別子及びカウンタの値をX時点累積パフォーマンスカウンタ205に登録する。
【0052】
その後、サンプリングデータ分析部15は、X時点累積パフォーマンスカウンタ205の新規登録からの評価区間にあたる10秒間待機する。待機中の10秒間、サンプリングデータ分析部15は、コードキャッシュフラッシング通知フラグ207を監視して、コードキャッシュフラッシング実行部14からのコードキャッシュフラッシングの実行の通知を受けたか否かを判定する。
【0053】
ここで、コードキャッシュフラッシング通知フラグ207は、Ture又はFalseに設定されるフラグである。コードキャッシュフラッシング通知フラグ207は、Tureに設定された場合、コードキャッシュフラッシングが実行されたことを表す。逆に、Falseの場合は、コードキャッシュフラッシング通知フラグ207は、コードキャッシュフラッシングが実行されていないことを表す。コードキャッシュフラッシング通知フラグ207は、後述するようにコードキャッシュフラッシング実行部14によりコードキャッシュフラッシングの実行時にTureに設定され、サンプリングデータ分析部15により通知受信後にFalseに戻される。
【0054】
待機中の10秒間にコードキャッシュフラッシングの実行の通知を受けなければ、サンプリングデータ分析部15は、Y時点累積パフォーマンスカウンタ206に登録されたメソッド識別子及びカウンタ値を全て削除する。Y時点累積パフォーマンスカウンタ206は、評価区間における最後の累積パフォーマンスカウンタ212のカウンタ値を保持するカウンタである。Y時点累積パフォーマンスカウンタ206も、
図7に示すように、メソッド識別子とカウンタの値とが対応付けて登録される。
【0055】
次に、サンプリングデータ分析部15は、その時点での累積パフォーマンスカウンタ212に登録された各メソッドのメソッド識別子及びカウンタの値を取得する。そして、サンプリングデータ分析部15は、取得したメソッド識別子及びカウンタの値をY時点累積パフォーマンスカウンタ206に登録する。
【0056】
評価区間毎に、サンプリングデータ分析部15は、X時点累積パフォーマンスカウンタ205及びY時点累積パフォーマンスカウンタ206を用いて、各メソッドの評価区間に置けるカウンタの値を区間パフォーマンスカウンタテーブル209に登録する。
図8は、区間パフォーマンスカウンタテーブルの生成の一例を説明するための図である。以下に、区間パフォーマンスカウンタテーブル209の生成の詳細について説明する。
【0057】
サンプリングデータ分析部15は、
図8におけるX時点でX時点累積パフォーマンスカウンタ205を生成し、その10秒後のY時点でY時点累積パフォーマンスカウンタ206を生成する。次に、サンプリングデータ分析部15は、Y時点累積パフォーマンスカウンタ206の全てのメソッド識別子のカウンタの値から、X時点累積パフォーマンスカウンタ205の同じメソッド識別子のカウンタの値を減算する。これにより、サンプリングデータ分析部15は、評価区間101における各メソッドの区間パフォーマンスカウンタの値を算出する。そして、サンプリングデータ分析部15は、減算結果として得られる各メソッド識別子に対応する区間パフォーマンスカウンタの値をまとめて区間パフォーマンスカウンタテーブル209の最後の列に設定する。また、サンプリングデータ分析部15は、フラッシュ直後フラグをFalseに設定したまま維持する。
【0058】
ここで、減算時にX時点累積パフォーマンスカウンタ205に対応するメソッド識別子が無い場合、サンプリングデータ分析部15は、0を減算する。Y時点累積パフォーマンスカウンタ206にメソッド識別子が存在しないメソッドについては、サンプリングデータ分析部15は、区間パフォーマンスカウンタの値が不定を示す情報を区間パフォーマンスカウンタテーブル209に登録する。また、区間パフォーマンスカウンタテーブル209に登録されていないメソッド識別子については、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の最後に、そのメソッド識別子にあたる新たな行を追加して区間パフォーマンスカウンタの値を登録する。
【0059】
その後、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209に記録した情報をテキスト形式ログファイル7又はバイナリ形式ファイル8として出力して、結果格納部42に格納する。
【0060】
一方、待機中の10秒間にコードキャッシュフラッシングの実行の通知を受けた場合、サンプリングデータ分析部15は、コードキャッシュフラッシング通知フラグ207をFalseに設定する。さらに、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の新たに追加した行のフラッシュ直後のフラグをTrueに設定する。その後、サンプリングデータ分析部15は、その時点から始まる新たな評価区間についての区間パフォーマンスカウンタの値の算出を行う。
【0061】
図9は、コードキャッシュフラッシング通知を受信した場合の区間パフォーマンスカウンタの算出の一例を説明するための図である。
図9においてメソッドサンプリングから延びる矢印の先には、その時点で算出される区間パフォーマンスカウンタの番号を記載した。区間パフォーマンスカウンタの番号は、区間パフォーマンスカウンタテーブル209に登録される区間パフォーマンスカウンタ毎の通し番号である。ここでは、サンプリングデータ分析部15は、n-2~n+2番までの区間パフォーマンスカウンタの値を算出する。
図9は、サンプリングデータ分析部15が、時刻T1でコードキャッシュフラッシング通知を受けた場合を示す。
【0062】
サンプリングデータ分析部15は、n-2番,n-1番,n番の区間パフォーマンスカウンタを順に算出して、区間パフォーマンスカウンタテーブル209に登録していく。n番の区間パフォーマンスカウンタは、評価区間102におけるカウンタ値を有する。そして、時刻T1にコードキャッシュフラッシング通知を受けると、サンプリングデータ分析部15は、評価区間102の直後から開始した区間パフォーマンスカウンタのカウンタ値の算出を中止して、時刻T1から新たな評価区間103を開始する。そして、サンプリングデータ分析部15は、T1から10秒後にn+1番の区間パフォーマンスカウンタの値を算出する。続けて、サンプリングデータ分析部15は、10秒毎にn+2番以降の区間パフォーマンスカウンタのカウンタ値の算出を繰り返す。
【0063】
本実施例では、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の評価区間の情報が4列未満の場合、4列以上蓄積されるまで各メソッド識別子に対応するカウンタ値の追加を繰り返す。評価区間の情報が4列以上存在する場合、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209における各メソッドの区間パフォーマンスカウンタの増加率を以下の方法で算出する。
【0064】
詳しくは、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の最後の列の区間パフォーマンスカウンタの値を今回の区間パフォーマンスカウンタの値として取得する。さらに、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の最後から4番目の列から最後から2番目の列までの各メソッドの区間パフォーマンスカウンタの値の平均を算出し、過去の区間パフォーマンスカウンタの値とする。そして、サンプリングデータ分析部15は、今回の区間パフォーマンスカウンタの値を過去の区間パフォーマンスカウンタの値で除算して区間パフォーマンスカウンタの増加率を算出する。ここで、過去3回の区間パフォーマンスカウンタの値の平均値が0の場合、サンプリングデータ分析部15は、そのメソッドのパフォーマンスカウンタの増加率を「1」とする。
【0065】
図10は、増加率テーブルの一例を示す図である。サンプリングデータ分析部15は、各メソッドについて、過去の区間パフォーマンスカウンタの値、今回の区間パフォーマンスカウンタの値及び区間パフォーマンスカウンタの増加率を登録した増加率テーブル210を生成する。ここで、本実施例では、過去3回の平均値を過去の区間パフォーマンスカウンタの値としたが、過去の区間パフォーマンスカウンタの値は、それまでの区間パフォーマンスカウンタの値の傾向を表せれば他の値を用いることも可能である。例えば、サンプリングデータ分析部15は、過去の区間パフォーマンスカウンタの値として、3回以上の平均値を用いてもよいし、1つ前の区間パフォーマンスカウンタのカウンタ値をもちいてもよい。
【0066】
その後、サンプリングデータ分析部15は、各メソッドの区間パフォーマンスカウンタの増加率をテキスト形式ログファイル7又はバイナリ形式ファイル8として出力して、結果格納部42に格納する。他にも、サンプリングデータ分析部15は、増加率テーブル210をテキスト形式ログファイル7又はバイナリ形式ファイル8として出力して、結果格納部42に格納してもよい。
【0067】
図3に戻って説明を続ける。次に、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の最後の行のフラッシング直後のフラグがTrueか否かを判定する。フラッシング直後フラグ208がFalseの場合、サンプリングデータ分析部15は、コードキャッシュフラッシングが実行されていないと判定して、今回の評価区間におけるサンプリングデータ6の分析を終了する。
【0068】
これに対して、フラッシング直後フラグ208がTrueの場合、サンプリングデータ分析部15は、コードキャッシュフラッシングが実行されたと判定する。そして、サンプリングデータ分析部15は、コードキャッシュフラッシング後の10秒間にコンパイルされた全てのメソッドの情報をコンパイル実行部13から取得する。さらに、サンプリングデータ分析部15は、直前のコードキャッシュフラッシングにより削除されたメソッドをフラッシングメソッドリスト203から取得する。そして、サンプリングデータ分析部15は、削除された各メソッドがコードキャッシュフラッシング後の10秒間に再コンパイルされたか否かを確認する。
【0069】
そして、サンプリングデータ分析部15は、削除されたメソッドのうちコードキャッシュフラッシング後の10秒間に再コンパイルされたメソッドを特定して、プロセスメモリ20に格納された再コンパイルリスト213を更新する。
図11は、再コンパイルリストの一例を示す図である。再コンパイルリスト213は、各メソッドについて、コードキャッシュフラッシングにより削除された後の10秒間での再コンパイルが発生した回数である再コンパイル経験数を表す。再コンパイルリスト213は、
図11の紙面に向かって左端の番号は、再コンパイルリスト213における各メソッドに割り当てられた通し番号である。すなわち、再コンパイル経験数は、第1コードを削除した後の一定時間内に当該第1コードがコードキャッシュ201に記憶された事象の発生回数である。ここで、本実施例では、再コンパイル経験数の対象として、コードキャッシュフラッシング後の評価区間と同じ10秒間に再コンパイルされたことを条件としたが、この一定時間は評価区間の時間と異なってもよい。例えば、サンプリングデータ分析部15は、評価区間の時間より短い時間のうちに再コンパイルされたことを条件として、再コンパイル経験数を算出してもよい。
【0070】
詳しくは、サンプリングデータ分析部15は、コードキャッシュフラッシングで削除された後の10秒間に再コンパイルされたメソッドとして特定したメソッドの再コンパイルリスト213における再コンパイル経験数を1つインクリメントする。また、特定したメソッドのメソッド識別子が再コンパイルリスト213に登録されていない場合、サンプリングデータ分析部15は、再コンパイルリスト213に新たに列を追加する。そして、サンプリングデータ分析部15は、追加した行に特定したメソッドのメソッド識別子を登録して、再コンパイル経験数を1に設定する。
【0071】
その後、サンプリングデータ分析部15は、再コンパイルリスト213に登録された各メソッドの再コンパイル経験数をテキスト形式ログファイル7又はバイナリ形式ファイル8として出力して、結果格納部42に格納する。
【0072】
図3に戻って説明を続ける。次に、サンプリングデータ分析部15は、増加率テーブル210から1つずつメソッドを選択して以下の削除対象外メソッド判定処理を繰り返す。以下に、削除対象外メソッド判定処理の詳細について説明する。
【0073】
サンプリングデータ分析部15は、プロセスメモリ20に予め格納された閾値211に含まれる影響度閾値、常時実行閾値及び非効率閾値を取得する。
【0074】
影響度閾値は、そのメソッドについてコードキャッシュフラッシング後のインタプリタ実行により実行時間が延びた可能性を判定するための閾値である。影響度閾値は、各メソッドのコードキャッシュフラッシングが情報処理装置1の処理性能の劣化に与える影響度の判定に用いられる。影響度閾値は、増加率に対応する値であり、例えば、
図10に示す増加率テーブル210が得られるような運用の場合には「2」とすることができる。この影響度閾値が、「第1閾値」の一例にあたる。
【0075】
常時実行閾値は、実行中のプログラムにおいて重要考えられる程度の長い期間にわたってそのメソッドの実行が繰り返されているか否かを判定するための閾値である。非効率閾値は、そのメソッドについてコードキャッシュフラッシングによる再コンパイル回数が多く非効率であることを判定するための閾値である。常時実行閾値及び非効率閾値は、javaプログラムの実行における各メソッドの重要度の判定に用いられる。常時実行閾値は、区間パフォーマンスカウンタの値に対応する値であり、例えば、
図10に示す増加率テーブル210が得られるような運用の場合には「1000」とすることができる。また、非効率閾値は、再コンパイル経験数に対応する値であり、例えば、
図11に示す再コンパイルリスト213が得られるような運用の場合には「10」とすることができる。この常時実行閾値が「第2閾値」の一例にあたり、非効率閾値が「第3閾値」の一例にあたる。
【0076】
サンプリングデータ分析部15は、選択したメソッドの過去の区間パフォーマンスカウンタの値及び区間パフォーマンスカウンタの増加率を増加率テーブル210から取得する。さらに、サンプリングデータ分析部15は、選択したメソッドの再コンパイル経験数を再コンパイルリスト213から取得する。
【0077】
また、サンプリングデータ分析部15は、選択したメソッドの今回フラッシングのフラグの情報をフラッシングメソッドリスト203から取得する。
図12は、フラッシングメソッドリストの一例を示す図である。フラッシングメソッドリスト203は、直前のコードキャッシュフラッシングで削除されたメソッドであるか否かを示すリストである。フラッシングメソッドリスト203は、
図12に示すように、メソッド毎にフラッシング回数及び今回フラッシングのフラグが登録される。今回フラッシングのフラグは、Falseの場合には直前のコードキャッシュフラッシングで削除されなかったメソッドを表し、Trueの場合には直前のコードキャッシュフラッシングで削除されたメソッドを表す。また、
図12のフラッシングメソッドリスト203の紙面に向かって左端は、フラッシングメソッドリスト203において各メソッドに割り当てられた通し番号である。フラッシングメソッドリスト203は、後述するように、コードキャッシュフラッシング実行部14により生成される。
【0078】
そして、サンプリングデータ分析部15は、選択したメソッドの今回フラッシングのフラグがTureの場合、以下の判定を行う。サンプリングデータ分析部15は、区間パフォーマンスカウンタの増加率が影響度閾値以上であるか否かを判定する。次に、サンプリングデータ分析部15は、過去の区間パフォーマンスカウンタの値が常時実行閾値以上であるかを判定する。さらに、サンプリングデータ分析部15は、再コンパイル経験数が非効率閾値以上か否かを判定する。各値が影響度閾値以上かつ常時実行閾値以上かつ非効率閾値以上の場合、サンプリングデータ分析部15は、選択したメソッドがフラッシング対象外条件を満たすと判定する。そして、サンプリングデータ分析部15は、フラッシング対象外条件を満たすメソッドを、コードキャッシュフラッシュにおける削除対象外リスト204に登録する。
【0079】
図13は、削除対象外リストの一例を示す図である。
図13に示すように、サンプリングデータ分析部15は、コードフラッシングにおける削除対象外としたメソッドのメソッド識別子を削除対象外リスト204に登録する。
【0080】
すなわち、サンプリングデータ分析部15は、以下のフラッシング対象外条件を満たすメソッドを削除対象外リスト204に登録する。第1の条件は、前の期間における第1メソッドの実行時間に対する後の期間における第1メソッドの実行時間の増加率が第1閾値以上という条件である。また、第2の条件は、前の期間における第1メソッドの実行時間が第2閾値以上という条件である。第3の条件は、第1コードを削除した後の一定期間内に第1コードがコードキャッシュ201に記憶された事象の発生回数が第3閾値以上合という条件である。
【0081】
図3に戻って説明を続ける。サンプリングデータ分析部15は、増加率テーブル210に登録された全てのメソッドについて削除対象外メソッド判定処理を繰り返す。その後、サンプリングデータ分析部15は、削除対象外リスト204に登録された各メソッドの情報をテキスト形式ログファイル7又はバイナリ形式ファイル8として出力して、結果格納部42に格納する。さらに、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209における今回の評価区間のフラッシング直後のフラグをFalseに設定する。
【0082】
このサンプリングデータ分析部15が、「分析部」の一例にあたる。すなわち、サンプリングデータ分析部15は、所定期間毎に計測された第1メソッドの実行時間を基に、所定期間のうち第1コードがコードキャッシュ201から削除される前の期間と後の期間とのそれぞれにおける第1メソッドの実行時間、及び、第1コードを削除した後の一定時間内に第1コードがキャッシュに記憶される回数を基に、第1メソッドを削除対象外リスト204に登録する。
【0083】
コードキャッシュフラッシング実行部14は、コードキャッシュフラッシングの実行の依頼をコンパイル実行部13から受ける。そして、コードキャッシュフラッシング実行部14は、フラッシングメソッドリスト203における今回フラッシングの情報を全てFalseに設定する。次に、コードキャッシュフラッシング実行部14は、候補メソッドリスト202をプロセスメモリ20から取得する。さらに、コードキャッシュフラッシング実行部14は、削除対象外リスト204をプロセスメモリ20から取得する。
【0084】
次に、コードキャッシュフラッシング実行部14は、候補メソッドリスト202に登録された各候補メソッドが削除対象外リスト204に登録されているかを判定する。そして、コードキャッシュフラッシング実行部14は、候補メソッドリスト202に登録された候補メソッドのうち削除対象外リスト204に登録されていない候補メソッドをコードキャッシュ201から削除する。
【0085】
その後、コードキャッシュフラッシング実行部14は、プロセスメモリ20に格納された
図12に示したフラッシングメソッドリスト203を更新する。具体的には、削除したメソッドのうちフラッシングメソッドリスト203に未登録のものがある場合、コードキャッシュフラッシング実行部14は、フラッシングメソッドリスト203にそのメソッドのメソッド識別子を追加する。そして、コードキャッシュフラッシング実行部14は、追加したメソッド識別子に対応するフラッシング回数を「1」に設定し、今回フラッシングフラグをTrueに設定する。また、削除したメソッドのうちフラッシングメソッドリスト203に既に登録されているものについては、コードキャッシュフラッシング実行部14は、メソッド識別子に対応するフラッシング回数を1つインクリメントする。さらに、コードキャッシュフラッシング実行部14は、今回フラッシングフラグをTrueに設定する。
【0086】
その後、コードキャッシュフラッシング実行部14は、コードキャッシュフラッシング通知フラグ207をTrueに設定する。これにより、コードキャッシュフラッシング実行部14は、コードキャッシュフラッシングの実行をサンプリングデータ分析部15に通知する。さらに、コードキャッシュフラッシング実行部14は、フラッシングメソッドリスト203をテキスト形式ログファイル7又はバイナリ形式ファイル8として出力して、結果格納部42に格納する。
【0087】
また、コードキャッシュフラッシング実行部14は、コードキャッシュフラッシング後のコードキャッシュ201のフラグメント状態の分析を実行して、フラグメントの状態を確認する。そして、コードキャッシュフラッシング実行部14は、コードキャッシュ201のフラグメント状態の情報をテキスト形式ログファイル7又はバイナリ形式ファイル8として出力して、結果格納部42に格納する。
【0088】
このコードキャッシュフラッシング実行部14が、「削除部」の一例にあたる。すなわち、コードキャッシュフラッシング実行部14は、複数のメソッドのコードが格納されたキャッシュにおいて他のコードを格納するための空き容量が不足する場合、削除対象外リスト204を参照して、複数のメソッドのうち削除対象外リスト204に示されるメソッドを除く他のメソッドの中から選択される第1メソッドの第1コードをコードキャッシュ201から削除する。
【0089】
図14は、コンパイラスレッドの一例を示すフローチャートである。次に、
図14を参照して、情報処理装置1によるコンパイラスレッドにおける処理の流れを説明する。
【0090】
インタプリタ処理部12は、所定の条件を満たしたメソッドを選択する。そして、インタプリタ処理部12は、選択したメソッドの翻訳依頼をコンパイル実行部13へ出力する。コンパイル実行部13は、メソッドの翻訳依頼をインタプリタ処理部12から受ける。そして、コンパイル実行部13は、翻訳依頼を受けたメソッドをプログラム格納部41に格納されたjavaプログラムから取り出す(ステップS1)。
【0091】
次に、コンパイル実行部13は、取得したメソッドのコードキャッシュ201の領域が不足するか否かを判定する(ステップS2)。
【0092】
コードキャッシュ201の領域が不足しない場合(ステップS2:否定)、コンパイル実行部13は、予め決められたコードキャッシュフラッシングの条件を満たしているか否かを判定する(ステップS3)。
【0093】
コードキャッシュフラッシングの条件を満たしていない場合(ステップS3:否定)、コンパイル実行部13は、コンパイル処理を実行して取得したメソッドを翻訳してネイティブコードを生成する。そして、コンパイル実行部13は、コードキャッシュ201に生成したネイティブコードを格納する(ステップS4)。
【0094】
これに対して、コードキャッシュ201が不足する場合(ステップS2:肯定)又はコードキャッシュフラッシングの条件を満たしている場合(ステップS3:肯定)、コンパイル実行部13は、以下の処理を実行する。すなわち、コンパイル実行部13は、コードキャッシュフラッシングの実行をコードキャッシュフラッシング実行部14に依頼する。また、コンパイル実行部13は、コードキャッシュフラッシングの対象候補とする候補メソッドを選択する。そして、コンパイル実行部13は、選択した候補メソッドの一覧である候補メソッドリスト202を生成する。コードキャッシュフラッシング実行部14は、コードキャッシュフラッシングの実行の依頼を受けて、削除対象外リスト204に基づいたコードキャッシュフラッシングを実行する(ステップS5)。
【0095】
コードキャッシュフラッシングの実行後、コードキャッシュフラッシング実行部14は、フラッシングメソッドリスト203を作成する。また、コードキャッシュフラッシング実行部14は、コードキャッシュフラッシング後のコードキャッシュ201のフラグメント状態の分析を実行する(ステップS6)。
【0096】
その後、コードキャッシュフラッシング実行部14は、コードキャッシュフラッシング通知フラグ207を用いて、コードキャッシュフラッシングの実行をサンプリングデータ分析部15に通知する(ステップS7)。
【0097】
図15は、メソッドサンプリング処理の一例を示すフローチャートである。次に、
図15を参照して、メソッドサンプリング部16によるメソッドサンプリング処理の流れを説明する。
【0098】
メソッドサンプリング部16は、CPU2が実行中のメソッドについてメソッドサンプリングを実行する(ステップS101)。
【0099】
次に、メソッドサンプリング部16は、メソッド毎にサンプリングデータ6を累積パフォーマンスカウンタ212に加算する(ステップS102)。
【0100】
次に、メソッドサンプリング部16は、特定間隔であるサンプリング間隔待機する(ステップS103)。
【0101】
次に、メソッドサンプリング部16は、javaプログラムのプロセスが終了した又はサンプリング停止指示を受信したか否かを判定する(ステップS104)。javaプログラムのプロセスが終了しておらず、且つ、サンプリング停止指示を受信していない場合(ステップS104:否定)、メソッドサンプリング部16は、ステップS101へ戻る。
【0102】
これに対して、javaプログラムのプロセスが終了した、又は、サンプリング停止指示を受信した場合(ステップS104:肯定)、メソッドサンプリング部16は、メソッドサンプリング処理を終了する。
【0103】
図16は、サンプリングデータ分析処理の一例を示すフローチャートである。次に、
図16を参照して、サンプリングデータ分析部15によるサンプリングデータ分析処理の流れを説明する。ここでは、区間パフォーマンスカウンタの算出間隔が10秒の場合を例に説明する。
【0104】
サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の最後に、今回の評価区間にあたる新たな列を追加する。サンプリングデータ分析部15は、新たに追加した列のフラッシュ直後のフラグをFalseに設定して、且つ、各メソッド識別子に対応するカウンタ値は0に設定して初期化する。次に、サンプリングデータ分析部15は、X時点累積パフォーマンスカウンタ205に登録されたメソッド識別子及びカウンタの値を全て削除する。次に、サンプリングデータ分析部15は、その時点での累積パフォーマンスカウンタ212に登録された各メソッドのメソッド識別子及びカウンタの値を取得する。そして、サンプリングデータ分析部15は、取得したメソッド識別子及びカウンタの値をX時点累積パフォーマンスカウンタ205に登録して、X時点累積パフォーマンスカウンタ205を更新する(ステップS201)。
【0105】
その後、サンプリングデータ分析部15は、X時点累積パフォーマンスカウンタ205を更新してから評価区間にあたる10秒間待機する。その間、サンプリングデータ分析部15は、コードキャッシュフラッシング通知フラグ207を監視して、待機中の10秒間に、コードキャッシュフラッシング実行部14からのコードキャッシュフラッシングの通知を受けたか否かを判定する(ステップS202)。
【0106】
待機中にコードキャッシュフラッシングの通知を受けた場合(ステップS202:肯定)、サンプリングデータ分析部15は、コードキャッシュフラッシング通知フラグ207をFalseに設定する(ステップS203)。
【0107】
さらに、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の新たに追加した行のフラッシュ直後のフラグをTrueに設定する(ステップS204)。その後、サンプリングデータ分析部15は、ステップS201へ戻る。
【0108】
これに対して、コードキャッシュフラッシング通知を受信しない場合(ステップS202:否定)、サンプリングデータ分析部15は、評価区間の時間である10秒が経過したか否かを判定する(ステップS205)。評価区間の時間が経過していない場合(ステップS205:否定)、サンプリングデータ分析部15は、ステップS202へ戻る。
【0109】
これに対して、コードキャッシュフラッシング通知を受信せずに評価区間の時間が経過した場合(ステップS205:肯定)、サンプリングデータ分析部15は、Y時点累積パフォーマンスカウンタ206に登録されたメソッド識別子及びカウンタの値を全て削除する。次に、サンプリングデータ分析部15は、その時点での累積パフォーマンスカウンタ212に登録された各メソッドのメソッド識別子及びカウンタの値を取得する。そして、サンプリングデータ分析部15は、取得したメソッド識別子及びカウンタの値をY時点累積パフォーマンスカウンタ206に登録して、Y時点累積パフォーマンスカウンタ206を更新する(ステップS206)。
【0110】
次に、サンプリングデータ分析部15は、Y時点累積パフォーマンスカウンタ206の全てのメソッド識別子のカウンタの値から、X時点累積パフォーマンスカウンタ205の同じメソッド識別子のカウンタの値を減算する。これにより、サンプリングデータ分析部15は、評価区間101における区間パフォーマンスカウンタの値を算出する。そして、サンプリングデータ分析部15は、減算結果として得られる各メソッド識別子に対応する区間パフォーマンスカウンタの値をまとめて区間パフォーマンスカウンタテーブル209の最後の列に登録する(ステップS207)。
【0111】
次に、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の最後の列のカウンタ値を今回の区間パフォーマンスカウンタの値として取得する。さらに、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の最後から4番目の列から最後から2番目の列までの各メソッドの区間パフォーマンスカウンタの値の平均を算出し、過去の区間パフォーマンスカウンタの値とする。そして、サンプリングデータ分析部15は、今回の区間パフォーマンスカウンタの値を過去の区間パフォーマンスカウンタの値で除算して区間パフォーマンスカウンタの増加率を算出する(ステップS208)。そして、サンプリングデータ分析部15は、各メソッドについて、過去の区間パフォーマンスカウンタの増加率、今回の区間パフォーマンスカウンタの値及び区間パフォーマンスカウンタの増加率を登録した増加率テーブル210を生成する。
【0112】
次に、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209の最後の行のフラッシング直後のフラグがTrueか否かを判定する(ステップS209)。フラッシング直後フラグ208がFalseの場合(ステップS209:否定)、サンプリングデータ分析部15は、ステップS214へ進む。
【0113】
これに対して、フラッシング直後フラグ208がTrueの場合(ステップS209:肯定)、サンプリングデータ分析部15は、コードキャッシュフラッシング後の10秒間にコンパイルされた全てのメソッドの情報をコンパイル実行部13から取得する。さらに、サンプリングデータ分析部15は、直前のコードキャッシュフラッシングにより削除されたメソッドをフラッシングメソッドリスト203から取得する。そして、サンプリングデータ分析部15は、コードキャッシュフラッシング後の10秒間に削除された各メソッドが再コンパイルされたか否かを確認する。次に、サンプリングデータ分析部15は、再コンパイルリスト213を更新する(ステップS210)。
【0114】
次に、サンプリングデータ分析部15は、増加率テーブル210に登録された各メソッドの過去の区間パフォーマンスカウンタの値及び区間パフォーマンスカウンタの増加率を増加率テーブル210から取得する。さらに、サンプリングデータ分析部15は、各メソッドの再コンパイル経験数を再コンパイルリスト213から取得する。また、サンプリングデータ分析部15は、各メソッドの今回フラッシングのフラグの情報をフラッシングメソッドリスト203から取得する。そして、サンプリングデータ分析部15は、フラッシング対象外条件を満たすメソッドが存在するか否かを判定する(ステップS211)。フラッシング対象外条件は、今回フラッシングのフラグがTureであり、区間パフォーマンスカウンタの増加率が影響度閾値以上、過去の区間パフォーマンスカウンタの値が常時実行閾値以上、且つ、再コンパイル経験数が非効率閾値以上のメソッドである。
【0115】
フラッシング対象外条件を満たすメソッドが存在しない場合(ステップS211:否定)、サンプリングデータ分析部15は、ステップS213へ進む。
【0116】
これに対して、フラッシング対象外条件を満たすメソッドが存在する場合(ステップS211:肯定)、サンプリングデータ分析部15は、該当メソッドをコードキャッシュフラッシュの削除対象外リスト204に追加する(ステップS212)。
【0117】
その後、サンプリングデータ分析部15は、区間パフォーマンスカウンタテーブル209における今回の評価区間のフラッシング直後のフラグをFalseに設定する(ステップS213)。
【0118】
その後、サンプリングデータ分析部15は、javaプログラムのプロセスが終了した又はサンプリング停止指示を受信したか否かを判定する(ステップS214)。javaプログラムのプロセスが終了しておらず、且つ、サンプリング停止指示を受信していない場合(ステップS214:否定)、サンプリングデータ分析部15は、ステップS201へ戻る。
【0119】
これに対して、javaプログラムのプロセスが終了した、又は、サンプリング停止指示を受信した場合(ステップS214:肯定)、サンプリングデータ分析部15は、サンプリングデータ分析処理を終了する。
【0120】
図17は、コードキャッシュフラッシング処理の一例を示すフローチャートである。次に、
図17を参照して、コードキャッシュフラッシング実行部14によるコードキャッシュフラッシング処理の流れを説明する。
図17のフローで示した処理は、
図14のフローにおけるステップS5で実行される処理の一例にあたる。
【0121】
コードキャッシュフラッシング実行部14は、コードキャッシュフラッシングの実行の依頼をコンパイル実行部13から受ける。そして、コードキャッシュフラッシング実行部14は、フラッシングメソッドリスト203における今回フラッシングの情報を全てFalseに設定する(ステップS301)。
【0122】
次に、コードキャッシュフラッシング実行部14は、候補メソッドリスト202をプロセスメモリ20から取得する。さらに、コードキャッシュフラッシング実行部14は、削除対象外リスト204をプロセスメモリ20から取得する(ステップS302)。
【0123】
次に、コードキャッシュフラッシング実行部14は、候補メソッドリスト202の中から1つのメソッド識別子を選択する(ステップS303)。
【0124】
次に、コードキャッシュフラッシング実行部14は、選択したメソッド識別子が削除対象外リスト204に存在するか否かを判定する(ステップS304)。
【0125】
選択したメソッド識別子が削除対象外リスト204に存在する場合(ステップS304:肯定)、コードキャッシュフラッシング実行部14は、ステップS307へ進む。
【0126】
一方、選択したメソッド識別子が削除対象外リスト204に存在しない場合(ステップS304:否定)、コードキャッシュフラッシング実行部14は、選択したメソッド識別子を有するメソッドをコードキャッシュ201から削除する(ステップS305)。
【0127】
その後、削除したメソッドのうちフラッシングメソッドリスト203に未登録のものがある場合、コードキャッシュフラッシング実行部14は、フラッシングメソッドリスト203にそのメソッドのメソッド識別子を追加する。そして、コードキャッシュフラッシング実行部14は、追加したメソッド識別子に対応するフラッシング回数を「1」に設定し、今回フラッシングフラグをTrueに設定する。また、削除したメソッドのうちフラッシングメソッドリスト203に既に登録されているものについては、コードキャッシュフラッシング実行部14は、メソッド識別子に対応するフラッシング回数を1つインクリメントする。さらに、コードキャッシュフラッシング実行部14は、今回フラッシングのフラグをTrueに設定する。これにより、コードキャッシュフラッシング実行部14は、プロセスメモリ20に格納されたフラッシングメソッドリスト203を更新する(ステップS306)。
【0128】
その後、コードキャッシュフラッシング実行部14は、候補メソッドリスト202の全てのメソッド識別子の選択が完了したか否かを判定する(ステップS307)。未選択のメソッド識別子が残っている場合(ステップS307:否定)、コードキャッシュフラッシング実行部14は、ステップS303へ戻る。
【0129】
これに対して、候補メソッドリスト202の全てのメソッド識別子の選択が完了した場合(ステップS307:肯定)、コードキャッシュフラッシング実行部14は、コードキャッシュフラッシング通知フラグ207をTrueに設定する(ステップS308)。
【0130】
以上に説明したように、本実施例に係る情報処理装置は、ネイティブコードでの実行時間がインタプリタでの実行時間に比べて影響度閾値以上の差があるメソッドは、処理性能に影響が大きいメソッドと判定する。また、情報処理装置は、長時間にわたり実行され且つコードキャッシュフラッシングによる削除後直ぐに再コンパイルされることが多いメソッドは重要なメソッドと判定する。そして、情報処理装置は、処理性能に影響が大きく且つ重要なメソッドをフラッシング対象外のメソッドとして除外してコードキャッシュフラッシングを実行する。これにより、コードキャッシュフラッシングが原因で性能上重要且つ影響が大きいメソッドがインタプリタに戻ることを帽子することで、情報処理装置のプログラム実行における性能劣化を軽減することが可能となる。また、性能トラブルが発生した場合に、コードキャッシュ不足及びコードキャッシュフラッシングのえいきょうをメソッドの実行状況レベルで分析することができ、適切なコードキャッシュサイズのチューにングが可能となる。それにより、大規模なシステムを安定して長時間運用することが可能となる。
【0131】
また、コードキャッシュフラッシングには、コードキャッシュのフラグメント化が発生するという問題がある。コードキャッシュは、領域のコンパクションが難しく、フラグメントが起きやすいといった特性を有する。例えば、特定のネイティブコードのアドレスが別のネイティブコード中に埋め込まれている場合に、コンパクションによりその特定のネイティブコードのアドレスが変更されると、そのアドレスを参照する箇所全ての書き直しが発生する。このように、コンパクションを行うことによる処理の増加を考慮すると、コードキャッシュに対して容易にコンパクションを行うことは難しくなる。この場合、削除されたコードが格納されていた領域は再利用可能であるが、その後作成されたネイティブコードのサイズが連続した空きサイズより大きいと、そのネイティブコードを格納することが困難となり、事実上、コードキャッシュ領域が不足した状態になる。コードキャッシュが不足した場合、ネイティブコードへの変換が適切に行われなくなり、コンピュータの処理性能の劣化が発生するおそれがある。
【0132】
これに対して、本実施例に係る情報処理装置は、コードキャッシュフラッシングの際にコードキャッシュのフラグメント化の状況を分析する。これにより、コードキャッシュのフラグメント化がコードキャッシュ不足の原因になっているか否かを容易に判定することが可能となる。
【0133】
また、従来は、性能上重要なメソッドの削除やフラグメント化によるコードキャッシュ領域の不足が発生した場合、それがアプリケーションの性能に影響しているかを判定することが困難であった。例えば、従来のメソッドサンプリングでは、CPU上で実行中のコードを定期的に調べて、メソッド毎に実行回数がカウントされる。メソッドサンプリングを実行した場合、カウントが多いメソッドがCPUを多く使用していたと判定される。一般的に、メソッドサンプリングは、アプリケーション実行でCPUを多く使用するメソッドを特定して、そのメソッドを改善するときに使われる。性能上重要なメソッドの削除やフラグメント化によるコードキャッシュ領域の不足によるアプリケーションへの影響を判定する方法として、このようなメソッドサンプリングやそれを利用したツールを用いた、実行頻度の高いメソッドの特定及び可視化が考えらえる。
【0134】
しかし、メソッドサンプリングは特定の期間にアプリケーションが実行したメソッドのサンプリングを収集することはできるが、コードキャッシュ不足やコードキャッシュフラッシングとの関係を分析することは困難である。つまり、既存のメソッドサンプリングでは、性能上重要なメソッドの削除やフラグメント化によるコードキャッシュ領域の不足が発生によるアプリケーションの動作性能への影響を分析することは困難であった。
【0135】
これに対して、本実施例に係る情報処理装置は、各メソッドのCPUの使用時間に代えて、メソッドサンプリングで得られるサンプリングデータの数を用いて各メソッドの実行時間を評価する。これにより、本実施例に係る情報処理装置は、メソッドサンプリングにより、性能上重要且つ影響が大きいメソッドの削除やフラグメント化によるコードキャッシュ領域の不足が発生によるアプリケーションの動作性能への影響を分析することが可能となる。また、メソッドの実行状況の把握のための処理負荷を軽減することが可能となる。