JBossのPermGenOutOfMemoryErrorの根本的な原因は何ですか?
開発環境でJBossAS 4.2.2を実行していますが、これはWebアプリケーションを何度も再デプロイした後に発生します。
Christian Vest Hansenのブログ多くのに役立つJVMオプションを提供しますが、問題を完全には解決しません:
-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=128m
すでに述べたように、おそらくクラスローダーのリークが発生しています。何らかの理由で、クラスがアンロードされていません。これは2つの理由で発生する可能性があります
この問題に対する包括的な解決策はありません。根本原因を見つけるのに役立つツールの1つは、 Eclipse Memory Analyzer Tool です。これは、JVMからのヒープダンプに適用できます(-XX:+ HeapDumpOnOutOfMemoryErrorを使用してOOMでヒープダンプを有効にできます)。オプション)。おそらく、WebアプリからJava.lang.Classオブジェクトを探し始めて、それらが存続している理由を確認します。残念ながら、PermGenは通常JVMヒープダンプの一部ではないため、ヒープの残りの部分で相関するアーティファクトを見つけることしかできません(間違いがない限り、クラスオブジェクトはPermGenに保存されません。実際のバイトコードのみが保存されます。私が間違っている場合は私を訂正してください)。
HTH。
編集:
Dave Cheneyはコメントで、Java.lang.Class-objectsは確かにPermGenの一部であり、通常のホットスポットヒープダンプには含まれていないことを示唆しています。この情報をヒープダンプに書き込むJVMがない限り、別のアプローチが必要になります。オブジェクトのインスタンスを探すことはできますが、クラス/クラスローダーをリークしている場合(残念ながら両方ともお互いを暗示しています)、他の兆候(JBossからのメタデータオブジェクトなど)を探す必要があるようです。