JVMでは、permgen領域が使われていることを私は知っていますクラス定義を保管する。私のTomcatでは、permgenの現在のメモリ使用量は100MB近くになっていることがわかりました。Tomcatのアプリケーションを使用している人がいなくても、時間とともに増加しているようです。 私の質問は:
それはpermgenが決してガベージコレクションされないというのは本当ですか、私はそこで使用されるメモリが成長し続けているという意味ですか?
permgemがガベージコレクトされるのはいつですか?
「CMSPermGenSweepingEnabled」および「CMSClassUnloadingEnabled」とはどういう意味ですか?
私のpermgemの最大サイズは256で、来週はOutMemoryExceptionを出したくありません。
正確で文書化された回答のみをお願いします。
私はTomcat 7、Java 7を使用しています。私は並列配置技術を多用しています。そして、アンデプロイを行い、週に数回再デプロイします。 私は決して文字列のメソッドintern()を使用しない
回答:
回答№1は2実際には、Permgenがガベージコレクトされることは決してありません。これには、アプリケーションによってロードされ、次の場合に収集されるクラスが含まれます。 クラスローダーはゴミを集めます通常、再配置シナリオで使用します。
これらのJVMフラグを使用して、クラスがいつpermgenにロードされ、いつpermgenからアンロードされるかを確認できます。
-XX:+TraceClassLoading -XX:+TraceClassUnloading
どのクラスがロードされているかを確認するには、このフラグを使用します。
-verbose:class
アプリケーションがリフレクションを多用する場合は、これも原因となる可能性があります。これを見てください。 回答、使用しようとする visualvm ヒープ・ダンプを取るために、lieという名前のクラスを探します sun.reflect.GeneratedMethodAccessor11
.
ガベージコレクションのフラグについてはこれを参照してください。 回答しかし、permgenリークを修正するための最善の策は、どのクラスが作成されているのか、そしてなぜいくつかのツール/ログを使用するのかを調べることです。