Web アプリケーションを何度も再デプロイした後、PermGen がメモリ不足になるため、クラス ローダー リークの影響を受ける Web アプリケーションがあります。
Google とウェブ上の何人かの親切な人から、このような問題を調査する方法は、プロファイラーでメモリ ダンプを開き、問題のあるクラス ローダーを見つけ、このローダーにつながる GC ルート パスを確認することであると教えてくれました。Yourkit を使用すると、 Drools の CompositeClassLoader によるリークを見つけることができ、回避することさえできました。おもう。
しかし、修正を適用した後も、再デプロイ後にクラス ローダーが GC されていないことがわかります。Yourkit にローダーへのパスを尋ねると、文字通り何百ものパスが表示されます。これが私が調査しなければならないリークの数だとは言わないでください!
(最初の 2 つのパスは Drools からのパスです。修正前にスナップショットを撮りました。苦情を避けるために、会社のパッケージ名も隠しました。)
さらに紛らわしいのは、新しいタブを開くコマンドPaths from GC roots ( ) を使用した場合よりも、タブPaths to loader ( ) を使用した場合と同じパスが得られないことです。Alt+3Ctrl+P
だから私は理解したい:
- この「ローダーへのパス」タブは正確には何を示していますか? このクラスローダーへの参照を持つクラスのリスト? では、[クラス リスト] タブとの違いは何ですか? そして、マージされたパスとは何ですか? Paths to loaderとPaths from GC rootsの違いは何ですか? これらのタブが何を示しているのかを正確に理解するのに苦労しています.Yourkitのドキュメントには、「ローダータブへのパスはローダーへのパスを示しています.」以上のことは書かれていません.
- より一般的には、この量のデータで犯人を見つけるにはどうすればよいですか?
Yourkit について言及しているのは、これは私が使用しているものであり、特に何かがある場合に備えて (少なくとも他のプロファイリング タスクでは) よく知っているためですが、これは他のメモリ ダンプ アナライザーとほとんど同じであると思います。私が持っている Yourkit のバージョンは 8.0 です。