PermGenのダンプを取得して、なぜそれがいっぱいになっているのかを確認したいと思います。これを分析する方法はありますか? log4j、Tomcat Webアプリのリロードなどの一般的な容疑者についてはすでに知っていますが、アプリケーションにもカスタムプロキシ生成コードがいくつかあり、内部を調べたいだけです。
これはどういうわけか可能ですか?
PermGenは通常、文字列リテラルプールとロードされたクラスで構成されます。問題の一部、つまり文字列リテラルプールに答えるために、実行中のJVMの文字列リテラルプールを出力するユーティリティを作成しました。ここで入手できます:
https://github.com/puneetlakhina/javautils/blob/master/src/com/blogspot/sahyog/PrintStringTable.Java
これは、jmapツールによってpermgen統計を出力するために使用されるクラスである PermStat に基づいています。
フラグを使用できます。
-XX:+TraceClassLoading -XX:+TraceClassUnloading
永続世代からロード/アンロードされるときに、クラスのIDを出力します。 -XX:+PrintGCDetails
を追加すると、permgenのサイズを追跡することもできます。
フラグがSun以外のJVMでサポートされているかどうかわからないことに注意してください。
PermGenのメモリ不足エラーのもう1つの疑いは、 文字列インターン です。コード内で文字列をインターンする場所を確認してください。
jmap -permgen
法案に適合しますか?
Java http://Java.Sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html#gby のトラブルシューティングガイドを参照してください。 ==
ロードされたすべてのクラスのリストを取得したい場合は、jconsole
を使用できます。 [クラス]タブをクリックしてから、[詳細出力]をクリックします。これにより、stdout
にロードされた各クラスが出力されます。これは、JAXBプロキシクラスの問題を追跡するのに非常に役立つことがわかりました。
jconsole
をアプリケーションにアタッチするには、-Dcom.Sun.management.jmxremote
コマンドラインオプションを使用してアプリケーションを起動する必要がある場合があります。