38

私はいくつかの興味深い動作をする J2EE アプリケーションを持っています...ヒープは適切に動作しているようで、時間の経過とともにガベージ コレクションで期待どおりに拡大および縮小します。ヒープの全体的な長期的な拡張はそれほど大きくありません。ただし、メタスペースは、MaxMetaspace に到達して OOME に遭遇するまで、1 時間あたり約 20 Mb で着実に成長し続けます。並列ガベージ コレクタと G1 ガベージ コレクタ (jdk1.8.0_40) の両方を試しました。

アプリケーションは実行中に再デプロイされないため、典型的なクラスローダー リークではないようです。このリークの原因を追跡する方法について提案がある人はいますか?

4

2 に答える 2

7

java.lang.OutOfMemoryError: Metaspace の主な原因は次のとおりです。

  • クラスが多すぎるか、
  • 大きすぎるクラスがメタスペースにロードされています。

問題を再現したい場合は、次のコード スニペットを使用します。

public class Metaspace {
static javassist.ClassPool cp = javassist.ClassPool.getDefault();

public static void main(String[] args) throws Exception {
    for (int i = 0; ; i++) { 
        Class c = cp.makeClass("eu.plumbr.demo.Generated" + i).toClass();
    }
  }
}

これらの生成されたクラス定義はすべて、最終的にメタスペースを消費します。

Maven リポジトリの Javaassist 。

OOME の詳細については、こちらを参照してください。

于 2015-08-12T13:05:10.507 に答える
7

ヒープ ダンプを実行し、Eclipse MATで分析します。ロードしたクラスを見てください。予期しないもの、特にクラスの重複がないかどうかを確認してください。また、クラスローダー エクスプローラーも備えています。

編集: 理論的には、常にプロキシを生成している可能性もあります。

于 2015-08-18T08:42:49.197 に答える