PR

今月も引き続きVisualVMについて解説していきます。

前回はVisualVMを使ったプロファイル,特にCPUプロファイルを使用してパフォーマンスチューニングを行いました。今回は前回取りあげなかったMemoryプロファイルを使ってみましょう。

Memoryプロファイルを用いて,ヒープ使用量のチューニングができます。しかし,ここではMemoryプロファイルを使用して,メモリーリークの原因を探ってみましょう。

使用するサンプルは前回と同じくマンデルブロ集合を描画するアプリケーションです。

前回,このアプリケーションのパフォーマンスチューニングを行い,処理時間の短縮化を図りました。その結果,筆者のPCで約38秒から,約3秒に高速化することができました。

しかし,もうちょっと高速化することもできそうです。前回示したチューニング後のプロファイル結果をもう一度図1に示します。

図1●チューニング後のプロファイル結果
図1●チューニング後のプロファイル結果
[画像のクリックで拡大表示]

図1から,doInBackgroundメソッドの中でjavax.swing.SwingWorkerクラスのpublishメソッドをコールしている時間が長いことがわかります。

publishメソッドはSwingのイベントディスパッチスレッドとは別のスレッドでの処理途中結果を,イベントディスパッチスレッドに渡すために使用します。

MandelbrotWorkerクラスはマンデルブロ集合の各点を計算すると,そのつどpublishメソッドをコールしています。このためコール回数が多くなってしまいます。そこで,複数の点の計算を行ってから,まとめてpublishメソッドで値を引き渡すように変更しました。

また,MandelbrotWorkerクラスはSwingWorkerクラスの処理とConcurrencyUtilitiesを使用した並列処理の両方を記述していたので,2つのクラスに分割しました。

サンプルのソース (こちらからダウンロードできます)
Mandelbrot.java
MandelbrotPanel.java
MandelbrotWorker.java
TaskManager.java
Point.java

Concurrency Utilitiesを使用して並列処理を行っているのがTaskManagerクラスです。

ソースの変更後,処理時間の測定を行った所,1691ミリ秒となりました。前回の結果が2926ミリ秒でしたから,約1秒のパフォーマンス向上が実現できました。

ところが,どうやらこの変更でメモリーリークのバグを作り込んでしまったようです。