25

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

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

4

4 に答える 4

26

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

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

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

于 2011-10-02T11:40:56.923 に答える
18

フラグを使用できます。

-XX:+TraceClassLoading -XX:+TraceClassUnloading

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

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

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

于 2010-05-16T08:18:53.867 に答える
4

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

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

于 2010-05-16T17:47:54.627 に答える
4

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

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

于 2010-05-17T00:01:23.420 に答える