ソフトウェア工学研究の日々

ソフトウェア工学の学術研究を紹介しています。ソフトウェア開発に関する調査と実験が大好きです。

Java プログラムのリアルタイムプロファイラの開発

プログラムの実行に時間がかかる、一瞬動きが止まって見えるといった、実行速度に関する問題が生じることがあります。そんなときに使えるのがプロファイラと呼ばれるツールで、Java の場合は Oracle JDK に標準で付いてくる hprof がよく知られていると思います。プロファイラを使うと、プログラムのどの部分の実行にどれだけ時間がかかっているか、計測することができます。

普通のプロファイラは、プログラムの実行が終了するまで計測を続け、最終的にどこに一番時間がかかっていたかを表示しますが、一瞬だけ動きが止まるといったような一時的な挙動は調べることができません。私たちの研究室では、 Java プログラムの実行中に起きたことをリアルタイムに可視化すると、プログラムの挙動の理解が容易になるのではと考え、2017年度の修士論文として、ツールを開発しました。

github.com

Heijo と名付けられたこのツールは、Java のパッケージおよびクラスを土台として、直近の1秒間のうちメソッドが実行されていた時間の割合を四角い棒(建物)の高さとして可視化するという可視化を採用しました。この可視化方法自体は Code City という名前で知られる既存研究に基づくものです。以下の動画は、上記プロジェクトページに動作例として掲載しているものです(音量にはご注意ください)。

www.youtube.comこの動画では、左側で Mario Like と名付けられたゲームが動作しており、右側にその実行を可視化しています。常時 2つ、青い棒が立ち上がっているので、2つのスレッドが動いているのが分かります。動画開始から14秒あたりのところで、ゲームの動きが一瞬だけ動きが止まるという動作が起き、右側の可視化結果でも、1本の棒が縮んでなくなり、代わりに別の棒が伸びてきます。つまり、特定のメソッドに多くの時間を費やしてしまいその結果プログラムの動きが停止してしまったことが分かります。Android アプリの監視バージョンも作成し、色々な用途を探索した結果を修士論文としました。

技術的には、Java プログラムの各メソッドの先頭と末尾、メソッド呼び出し命令の前後に、現在どのメソッドの実行を開始・終了したかを報告するような処理を行うよう、プログラムをロードするタイミングでバイトコードの書き換えを行っています。これにより、実行オーバーヘッドを(デバッガのステップ実行などと比べると)小さく抑えながら情報を収集し、可視化のエンジンにデータを送信しています。ソフトウェアの詳しい紹介はソフトウェア科学会の論文誌「コンピュータソフトウェア」に掲載の予定です(本記事執筆時点ではまだ公開されていません)。