web-dev-qa-db-ja.com

JBossでPermGenOutOfMemoryErrorの原因は何ですか?

JBossのPermGenOutOfMemoryErrorの根本的な原因は何ですか?

開発環境でJBossAS 4.2.2を実行していますが、これはWebアプリケーションを何度も再デプロイした後に発生します。

Christian Vest Hansenのブログ多くのに役立つJVMオプションを提供しますが、問題を完全には解決しません:

-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=128m
8
Peter Hilton

すでに述べたように、おそらくクラスローダーのリークが発生しています。何らかの理由で、クラスがアンロードされていません。これは2つの理由で発生する可能性があります

  • 上記のクラスのオブジェクトはまだヒープ上に存在するか、オブジェクトは常にクラスを参照するか、または
  • クラスローダーはどこかで参照されますが、何らかの理由で、クラスローダーはクラスを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からのメタデータオブジェクトなど)を探す必要があるようです。

5
falstro