PermGenのダンプを取得して、なぜそれがいっぱいになっているのかを確認したいと思います。これを分析する方法はありますか?log4j、tomcat webappのリロードなどの一般的な容疑者についてはすでに知っていますが、アプリケーションにもカスタムプロキシ生成コードがあり、内部を調べたいだけです。
これはどういうわけか可能ですか?
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つの疑いは、文字列のインターンです。コード内で文字列をインターンする場所を確認してください。
ロードされたすべてのクラスのリストを取得したい場合は、を使用できますjconsole
。[クラス]タブをクリックしてから、[詳細出力]をクリックします。これにより、にロードされる各クラスが出力されstdout
ます。これは、JAXBプロキシクラスの問題を追跡するのに非常に役立つことがわかりました。
-Dcom.sun.management.jmxremote
アプリケーションに接続するには、コマンドラインオプションを使用してアプリケーションを起動する必要がある場合がありますjconsole
。
jmap -permgen
法案に適合しますか?
Javaのトラブルシューティングガイド http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html#gbyuuを参照してください。