Java開発の問題解決を助ける(2)
プロファイラでメモリリークとパフォーマンス問題を解決


プロファイラでパフォーマンスの問題を解決

 では実際にプロファイラを使用してパフォーマンスの問題を解決してみましょう。先ほどメモリリークを解決するために使用したサンプルプログラム(sample.zip)を使用します。設定方法は前述の「開発環境とプロファイラの準備」を参照してください。

時間のかかっている処理を特定する

 メニューの[Profile]から[Profile Main Project]を選び、プロファイル対象のメインクラスを選択してください。プロファイリングタスクを選択する画面が出てきますが、今度は[Analyze Performance]を使用します。プログラムのどの部分に原因があるかがよく分かっていない場合にはプログラム全体を検査の対象としますので、デフォルトで選択されている[Entire Application]が選択されていることを確認して実行します。

画面6 「Entire Application」が選択されていることを確認して実行

 プロファイル結果は、メモリリークを探したときと同じようにメニューの[Window]にある[Profiling]メニューの[Live Results]を選択することで取得することができます。Live Resultsでは各メソッドの呼び出し回数や合計処理時間が表示されています。これにより、どの部分で特に時間がかかっているかを把握することができます。

画面7 メソッドごとの合計処理時間・呼び出し回数の一覧

 プロファイル結果が表示されている画面にあるアイコン[Take Snapshot of Collected Results]をクリックしてスナップショットを取得すると、それぞれのメソッドが呼び出されたスタックトレースを取得することができます。また、メソッドを選択して右クリックメニューから[Show Back Traces]を選べばそのメソッドを使用している呼び出し元をたどることもできます。

画面8 メソッドの呼び出し元一覧

 このように時間のかかっている処理が特定できることによって、処理をチューニングしたり、呼び出し元をたどることで修正の影響度を判断することができます。今回のサンプルプログラムでは、WordCountクラスのgetCountメソッド33行目にわざとパフォーマンスボトルネックとなるコードを書いていました。

リスト WordCount.java
26:    /**
27:     * 出現数を取得します.
28:     * @param 出現数
29:     */
30:    public int getCount(){
31:        // ここではプロファイラの使い方を学ぶためにわざと待ち処理しています。
32:        try {
33:            Thread.sleep(10);
34:        } catch(InterruptedException e){
35:            e.printStackTrace();
36:        }
37:        return count;
38:    }

 このようにプロファイラ・ツールはメモリリーク問題の解決や、パフォーマンスボトルネック問題の解決に大きな力となります。プロファイラ・ツールは今回紹介した以外にもさまざまな統計情報が取得できます。このような情報の読み方や使い方は実際に使って手を動かしてみないとなかなか身に付かないものです。実際に問題が発生したときに使いこなせるようにぜひ手を動かしてマスターしてください。

3/3  

 INDEX

第2回 Java開発の問題解決を助ける
  Page1
メモリリーク(メモリの無駄遣い)を探せ!
プロファイラを使ってみよう
  Page2
メモリの無駄を作っている部分を特定する
パフォーマンスボトルネックを探せ!
  Page3
プロファイラでパフォーマンスの問題を解決









Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間