5

初めてのアプリは正しく起動します。次に、webapp / *。warファイルを削除し、新しいバージョンの*.warを貼り付けます。Jettyは新しい戦争の展開を開始しますが、エラーjava.lang.OutOfMemoryError: PermGen spaceが発生します。エラーを修正/正しく再デプロイするようにJettyを構成するにはどうすればよいですか?

この解決策は私を助けません。
Jettyバージョン:jetty-7.4.3.v20110701

4

6 に答える 6

11

問題を回避するように構成する方法はおそらくありません。各 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 で提供されるクラス内で発生する可能性があるため、アプリケーション内で修正することはできません。独自のコードを変更するだけでは、問題を防ぐことはできません!

あなたのオプションは基本的に次のとおりです。

  • メモリ制限を増やし、エラー ストライクの頻度を減らす
  • リンクされたブログ投稿で詳しく説明されているようにコードを分析し、オブジェクトへの参照を格納するクラスの使用を避ける
于 2011-09-17T21:32:52.593 に答える
1

Jetty 7.6.6 以降の場合、これはhttp://www.eclipse.org/jetty/documentation/current/preventing-memory-leaks.htmlに役立つ場合があります。

を使用し、AppContextLeakPreventerpermgen スペースによる OOM エラーの解決に役立ちました

于 2014-10-17T14:09:58.837 に答える
0

私は HotSpot でも同じ問題を抱えていますが、Permanent Generation を持たない JRockit では問題は解消されました。今は無料なので、ぜひ試してみてください: https://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and

于 2012-02-17T14:42:56.567 に答える
0

将来の読者のために(この質問が尋ねられたときと比較して):

JDK 8では、Perm Gen Space がなくなりました (もうありません)。代わりに、マシンのネイティブ スペースから取得されるメタスペースが存在します。

Perm Gen Overflow の問題が発生した場合は、この説明削除プロセスに関するこのコメントを参照してください。

于 2014-03-13T08:50:04.307 に答える
0

パーマネント ジェネレーション リークによく似ています。アプリケーションがアンデプロイされた後、いくつかのクラスを残しておくと、この問題が発生します。Plumbrの最新バージョンを試すことができます。残っているクラスが見つかるかもしれません。

于 2012-07-17T09:04:36.887 に答える