質問: jbossでpermgenoutofmemoryerrorの原因は何ですか? jbossのpermgenoutofmemoryerrorの根本的な原因は何ですか?開発環境でjbossas 4.2.2を実行していますが、これはwebアプリケーションを何度も再デプロイした後に発生します。 christian vest hansenのブログ 多くのに役立つjvmオプションを提供しますが、問題を完全には解決しません:-xx:+useconcmarksweepgc -xx:+cmspermgensweepingenabled -xx:+cmsclassunloadingenabled -xx:maxpermsize=128m
回答: すでに述べたように、おそらくクラスローダーのリークが発生しています。何らかの理由で、クラスがアンロードされていません。これは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からのメタデータオブジェクトなど)を探す必要があるようです。