初めてのアプリは正しく起動します。次に、webapp / *。warファイルを削除し、新しいバージョンの*.warを貼り付けます。Jettyは新しい戦争の展開を開始しますが、エラーjava.lang.OutOfMemoryError: PermGen space
が発生します。エラーを修正/正しく再デプロイするようにJettyを構成するにはどうすればよいですか?
この解決策は私を助けません。
Jettyバージョン:jetty-7.4.3.v20110701
初めてのアプリは正しく起動します。次に、webapp / *。warファイルを削除し、新しいバージョンの*.warを貼り付けます。Jettyは新しい戦争の展開を開始しますが、エラーjava.lang.OutOfMemoryError: PermGen space
が発生します。エラーを修正/正しく再デプロイするようにJettyを構成するにはどうすればよいですか?
この解決策は私を助けません。
Jettyバージョン:jetty-7.4.3.v20110701
問題を回避するように構成する方法はおそらくありません。各 JVM には、クラスのロードと静的データに使用される PermGen メモリ領域が 1 つあります。アプリケーションがアンデプロイされるたびに、クラスローダーを破棄し、すべてのクラスをロードする必要があります。クラスローダへの他の参照がまだ存在するためにこれが失敗すると、クラスローダとアプリケーション クラスのガベージ コレクションも失敗します。
ブログのエントリとそのフォローアップは、問題の考えられる原因を説明しています。アプリケーション コンテナーのコードが、いずれかのクラスへの参照を保持するクラスを使用する場合は常に、クラスのガベージ コレクションが防止されます。上記のブログ エントリの例はjava.util.logging.Level
コンストラクタです。
protected Level(String name, int value) {
this.name = name;
this.value = value;
synchronized (Level.class) {
known.add(this);
}
}
known
は の静的メンバーであることに注意してくださいjava.util.logging.Level
。コンストラクターは、作成されたすべてのインスタンスへの参照を格納します。Level
そのため、クラスがアプリケーションのコードからロードまたはインスタンス化されるとすぐに、ガベージ コレクションはクラスを削除できません。
この問題を解決するには、独自のコードで使用されているすべてのクラスを回避するか、コードからクラスへの参照が保持されないようにすることができます。どちらの問題も、Java で提供されるクラス内で発生する可能性があるため、アプリケーション内で修正することはできません。独自のコードを変更するだけでは、問題を防ぐことはできません!
あなたのオプションは基本的に次のとおりです。
Jetty 7.6.6 以降の場合、これはhttp://www.eclipse.org/jetty/documentation/current/preventing-memory-leaks.htmlに役立つ場合があります。
を使用し、AppContextLeakPreventer
permgen スペースによる OOM エラーの解決に役立ちました
私は HotSpot でも同じ問題を抱えていますが、Permanent Generation を持たない JRockit では問題は解消されました。今は無料なので、ぜひ試してみてください: https://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and
将来の読者のために(この質問が尋ねられたときと比較して):
JDK 8では、Perm Gen Space がなくなりました (もうありません)。代わりに、マシンのネイティブ スペースから取得されるメタスペースが存在します。
Perm Gen Overflow の問題が発生した場合は、この説明と削除プロセスに関するこのコメントを参照してください。
パーマネント ジェネレーション リークによく似ています。アプリケーションがアンデプロイされた後、いくつかのクラスを残しておくと、この問題が発生します。Plumbrの最新バージョンを試すことができます。残っているクラスが見つかるかもしれません。