JProfiler の使用

JProfiler を使用し、メモリーリークを解決する

ここでは、JProfiler を使用したメモリーリークの検証方法と、その可能性の高いソースを確認する方法を説明しています。

メモリーリークはオブジェクトと、使用されていないが他のオブジェクトに参照されているため、破棄できないアプリケーションにより作成されるオブジェクト コレクションによって発生します。この使用されていないオブジェクトの増加は、メモリーに停止をかけ、メモリーが欠如するため、アプリケーション稼働の効 率が下がります。

JProfiler を使用し、稼働中アプリケーション内部を検索することが出来ます。このため、アプリケーションが作成する全てのオブジェクトで発生していることや、それら が相互にどう関連しているかを確認することができ、メモリーリークのソースである可能性が高いオブジェクトやオブジェクト集合体を検索することができま す。
 

JProfiler のダウンロード

Jprofiler の評価コピーを JProfiler からダウンロードします。

JProfiler の設定

Jprofiler を起動後、JProfiler Quick Start ダイアログが表示されます。

 

1. “An application on a remote compute”  をクリックし、Next をクリックします。 
  注: この選択をすることで、ブラウザ、Nexaweb Studio またはコマンドラインから全ての種類のアプリケーションタイプを稼働することができます。

“Where is profiled application located?” ダイアログが表示されます。

2. On this computer をクリックし、Next をクリックします。
     “Choose JVM Version . . . “ ダイアログが表示されます。

3. システムで稼働している JVM バージョンを選択し、Next をクリックします。
     “Choose the port used for profiling connection” ダイアログが表示されます。

4. Next をクリックし、default をアクセプトします。
   “Choose whether to wait for the JProfiler GUI” ダイアログが表示されます。

5. Next をクリックし、default をアクセプトします。
“Perform required modifications” ダイアログが表示されます。

6. Java start command を修正し、Perform required modifications ダイアログで特定される構文を追加します。

Nexaweb Studio からアプリケーションをプロファイルするために、Nexaweb Studio 内でJava start コマンド構文を修正します。もしくは、Java Control Panel から修正します。

参照: To Modify the Java start command in Nexaweb Studio or
To Modify the Java start command from the Java Control Panel.

  Next をクリックします。
  “Finished” ダイアログが表示されます。

7. 今すぐにセッションを開始するかどうかを選び、Finish をクリックします。

Nexaweb Studio Java Start コマンドを修正する:

a. Nexaweb Studio で Windows > Preferences を選択する
     Preferences ダイアログが表示されます。

b. + をクリックし Java を展開させ、Installed JRE を選択する

c. Installed JRE  リストから Nexaweb Studio を選択しEdit をクリックする
     “Edit JRE”  ダイアログが表示されます。

d. Default VM Arguments 項目の JProfiler コマンド構文(“Perform required modifications” ダイアログで特定される) を選択する。

e. “Preferences” ダイアログが閉まるまで OK をクリックする。


Java コントロールパネルから Java start コマンドを修正する:

a. Program Files > Settings > Control Panel を選択する。
   Control Panel フォルダが開きます。

b. Java をダブルクリックする。
   Java Control Panel が開きます。

c. Java Tab をクリックする。

d. Java Applet Runtime Settings の View をクリックする。
   システムにインストールした JRE の Java ランタイム設定のリストが表示されます。

e. JRE の側の JavaRuntime Parameters 項目をクリックし、JProfiler Perform required modifications で特定された情報を入力する。
例えば、-agentlib:jprofilerti=port=8849 "-Xbootclasspath/a:C:\Program Files\jprofiler5\bin\agent.jar"を入力します。

f. OK をクリックし、”Java Runtime Settings dialog” をクローズする。

g. Apply とOK をクリックし、”Java Control Panel” をクローズする。

メモリーリークを検証する

Jprofiler によって、アプリケーションが稼働している間、メモリー使用のグラフを見ることができます。活動が上がったり下がったりする間、一定レベルに戻るのではな く、使用する全体のメモリー量が時間とともに増加しているかどうか決定することにより、アプリケーションがメモリーをリークしていないかどうか検証するこ とができます。

Jprofile を使用し、メモリーリークを確認するためには、次のステップに従います :

1. JProfiler を設定後、セッション開始を選んだ場合、”Session Startup” ダイアログが表示されます。

または、Session > Open Session を選択します。”Open Session” ダイアログが表示されます。

“Remote application on local host” を選択し、Open をクリックします。”Session Startup” ダイアログが表示されます。

: JProfilerの評価コピーを使用する場合、評価ダイアログが表示されます。
   Evaluate をクリックし、”Session Startup”  ダイアログを表示開始します。

2. OK をクリックします。
   “Connection status” ダイアログが表示されます。

3. プロファイルしたいアプリケーションを開始します。

4. Jprofiler の左側の VM Telemetry Views をクリックします。
  その後、下の Memory タブをクリックします。

5. Jprofiler でアプリケーションを使用し、パフォーマンスを見ることができます。
  次のグラフはメモリーリークが付いたアプリケーションを表示しています。

メモリーリークソースを確認する

1.   をクリックすると、JVM がオブジェクトの収集を始めます。

2. Memory Views をクリックします。

3. view をフィルターし、Nexaweb のオブジェクトのみを表示します。フィルターに com.nexaweb を入力し、Return キーを押します。

4. View > Mark Current Values を選択します。
 これにより、Jprofiler がアプリケーションの全てのクラスとそれぞれのinstance数を記憶します。

それに加え、Memory view Difference column を追加します。

5.   をクリックすると JVM がオブジェクトの収集を始めます。

6. アプリケーションを使用し、Difference column で変化する値を確認します。
      Difference column で Jprofiler が 0 と記録するオブジェクトは、メモリーリークのソースとして除外することができます

7. Difference column に値の入ったオブジェクトを選択し、 をクリックします。
     Jprofile は現在のスナップショットを捨てる様促すダイアログを表示し、すでに選択されている場合、OK をクリックします。
      JProfiler はスナップショットのオプションを選択するよう促すダイアログを表示します。

8. Remove weakly referenced objects をチェックし、OK をクリックします。

9. オブジェクトをダブルクリックします。
     “New Object Set” ダイアログが表示されます。

10. References をクリック後、OK をクリックします。
   Jprofiler が Reference グラフを表示します。

11. オブジェクトを右クリックし、”Show Paths to GC Root” を選択します。
   “Path to GC Roots” オプションダイアログが表示されます。

12. Single root をクリックし、OK をクリックします。
これによりオブジェクトにはリリースしないメモリーの永続オブジェクトである GC root オブジェクトからのリンクを配置し表示します。 

“GC root” は黄色で表示されます。

13. 選択されたオブジェクトから GC root へのパスに従い、 コレクションを探し、次のような [] のついたタイトルが表示されます :

コレクションは通常、配列またはハッシュ表です。アプリケーションがコレクションにオブジェクトを配置し、コレクションを記憶していないため、だいたいこれらによってメモリーリークが発生します。しかし、コレクションが参照されるため、破棄することが出来ません。

Referenced object collection 確認後、メモリーリークを解決するために、ソースコードにこのオブジェクトを配置し、それで何が発生するのかを分析します。