2009-08-19 6 views
1

現在、Java Webアプリケーションのプロファイルを作成しようとしています。 Eclipseと連携してNetbeans Profilerを使用しました。私のサーバー(Tomcat)はEclipseプラグインを介して実行されており、Netbeansプロファイラを使用してサーバーに動的に接続します。Java Web Appの出力をプロファイルして理解する方法

私は、ある時点でサーバがある環境でメモリ不足になった後に、主な問題があります。 1.大きなオブジェクトがメモリに残っていて、収集されずにメモリリークが発生します。または、 2.小さなオブジェクトが収集されずにメモリに割り当てられ続けます。

通常、2番目のものは見つけるのが難しいですが、1つの通常の症状は、時間に関係なくガベージコレクションを生き延びた生存者が増加し続けるということです。そして、それは私のWebアプリでは起こるようですが、実際には何の活動も行われていません。世代は例外なく一定の期間にわたって着実に増加します。私はガベージコレクションされていたはずのオブジェクトをどこかに再現していると思うようにしてください。

私はプロファイラでテストを実行しましたが、残念ながら私は実際にどのようにオブジェクトをピンポイントするのか分かりません。ガベージコレクションを数回行っても、特定のHASHMAPが世代数を増やしていたことに気付きました。

私は開始アプリケーションの次の数分で見たものの非常に簡単な概要を与える簡単なスクリーンショットを添付しています。

実際の記事などを指摘して、プロファイリングの意味を理解する方法と、私が犯人を捕まえるために行うべきことについて教えてくれたら、感謝します。

ご迷惑をおかけして申し訳ありません。

添付のスクリーンショットを見つけます。 alt text http://dl.getdropbox.com/u/1264228/Files/State.png

答えて

1

アプリケーションのメモリリークを検出する最も良い方法は、アプリケーションが使用されている間に定期的にメモリのスナップショットを取得し、その後にさまざまな種類のオブジェクトのオブジェクト数を詳しく調べることですアプリケーションによって管理されます。

ほとんどのメモリリークは、メモリ消費量が最も増加しているオブジェクトのグループをトレースできます。簡単に言えば、ΣMEM(オブジェクト)ではなく、ΔMEM(オブジェクト)を優先する必要があります。

リークの原因となるオブジェクトのセットを特定したら、オブジェクト割り当てトレースを使用して、リークの原因を特定する必要があります。

Netbeansでこれを行う方法については、Java Passionのチュートリアルを参照してください。

ドミネーターツリーを非常に便利に描写できるMATプラグインの機能をEclipseで見つけることができます。効率的な分析は、前提条件として、これらの知識を必要とするので

最後に、以下の用語のリストは、有用であろう:

1

私は一般的にちょうどリリースされていると周りに何を貼り付けるかもしれないもののパターンを見るために離れてheapdumpsそれぞれ数秒のカップルを取ります。

次に、疑わしいオブジェクトをドリルダウンし、そのオブジェクトへの参照を保持しているものを見つけます。多くの場合、適切に閉じられていないリソース、セッションオブジェクトの過度の使用、静的変数、一部のクラスローダーのリーク、メモリキャッシュ、または依然として参照されているリスト内のオブジェクトがあります。

何百、何千ものオブジェクトを通過して何が起こっているのかを解釈することは必ずしも容易ではありません。私はJavaPassionのこのcourseが初心者にとって非常に役立つことがわかりました。

関連する問題