web-dev-qa-db-ja.com

PermGenの内容を分析する方法は?

PermGenのダンプを取得して、なぜそれがいっぱいになっているのかを確認したいと思います。これを分析する方法はありますか? log4j、Tomcat Webアプリのリロードなどの一般的な容疑者についてはすでに知っていますが、アプリケーションにもカスタムプロキシ生成コードがいくつかあり、内部を調べたいだけです。

これはどういうわけか可能ですか?

25
Daniel

PermGenは通常、文字列リテラルプールとロードされたクラスで構成されます。問題の一部、つまり文字列リテラルプールに答えるために、実行中のJVMの文字列リテラルプールを出力するユーティリティを作成しました。ここで入手できます:

https://github.com/puneetlakhina/javautils/blob/master/src/com/blogspot/sahyog/PrintStringTable.Java

これは、jmapツールによってpermgen統計を出力するために使用されるクラスである PermStat に基づいています。

26
Puneet

フラグを使用できます。

-XX:+TraceClassLoading -XX:+TraceClassUnloading

永続世代からロード/アンロードされるときに、クラスのIDを出力します。 -XX:+PrintGCDetailsを追加すると、permgenのサイズを追跡することもできます。

フラグがSun以外のJVMでサポートされているかどうかわからないことに注意してください。

PermGenのメモリ不足エラーのもう1つの疑いは、 文字列インターン です。コード内で文字列をインターンする場所を確認してください。

18
Eyal Schneider

jmap -permgen法案に適合しますか?

Java http://Java.Sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html#gby のトラブルシューティングガイドを参照してください。 ==

4
Dilum Ranatunga

ロードされたすべてのクラスのリストを取得したい場合は、jconsoleを使用できます。 [クラス]タブをクリックしてから、[詳細出力]をクリックします。これにより、stdoutにロードされた各クラスが出力されます。これは、JAXBプロキシクラスの問題を追跡するのに非常に役立つことがわかりました。

jconsoleをアプリケーションにアタッチするには、-Dcom.Sun.management.jmxremoteコマンドラインオプションを使用してアプリケーションを起動する必要がある場合があります。

4
mtpettyp