1

32 ビット JRockit R 28.2.4-14 を使用して実行されている Weblogic 10.3.5-Xmx1024m -Xms1024mは、Java EE EAR ファイルの 5 ~ 8 回の Undeploy-Redeploy サイクルの後、常にネイティブ メモリを使い果たします。

エラー メッセージと VisualVM に表示される内容によると、Java ヒープがいっぱいになったのではなく、使用可能なシステム メモリが不足しています。

java.lang.OutOfMemoryError: class allocation, 865324184 loaded, 464M footprint,
in check_alloc (src/jvm/model/classload/classalloc.c:215).

Attempting to allocate 1G bytes

There is insufficient native memory for the Java
Runtime Environment to continue.

Possible reasons:
  The system is out of physical RAM or swap space
  In 32 bit mode, the process size limit was hit
Possible solutions:
  Reduce memory load on the system
  Increase physical memory or swap space
  Check if swap backing store is full
  Use 64 bit Java on a 64 bit OS
  Decrease Java heap size (-Xmx/-Xms)
  Decrease number of Java threads
  Decrease Java thread stack sizes (-Xss)
  Disable compressed references (-XXcompressedRefs=false)

        at sun.misc.Unsafe.defineClass(Native Method)
        at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)
        at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)
        at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)
        at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:95)
        at sun.reflect.ReflectionFactory.newConstructorForSerialization(ReflectionFactory.java:313)
        at java.io.ObjectStreamClass.getSerializableConstructor(ObjectStreamClass.java:1322)

提案されている可能な解決策は理解していますが、アプリケーションが一度だけデプロイされればすべて問題ないため、アンデプロイ時にクラスが正しく解放されていないようです。アンデプロイ後のヒープ ダンプは、多くのクラスがメモリに残っていることを示しています。それらはガベージコレクションされるべきではありませんか?

GC ルートへのパスは Thread を示してい<JNI Local> java.lang.Thread @ 0x129ac778 JDWP Transport Listener: dt_socket Native Stack, Threadます。サーバーにトラフィックがなく、なぜこれがアクティブなままなのかわかりません。

4

3 に答える 3

2

このメモリリークは、perm-genスペースで発生する可能性があります(これは、Hotspot JVMでの呼び出し方法です)。JRockitには専用のPerm-Genスペースはありませんが、これには「通常の」ヒープスペースを使用します。ここで何が起こっているのかを理解するのに本当に役立つと思った次のサイトを見てください。

PermGenリークとは何ですか

PermGenの神話を破る

于 2012-07-27T06:42:05.297 に答える
0

ほとんどの場合、一部のクラスはクラスローダーを保持しているため、再デプロイ時にアプリケーション全体がリークします。クラスローダーに関するこの記事について読むことができます。

于 2012-07-30T07:37:56.347 に答える
0

Eclipse MATは、 PermGenリークのデバッグに非常に役立ちます。

私のアプローチは通常、次のようなものです。

  • アンデプロイ後にヒープ ダンプを実行する
  • あなたのアプリケーション クラスの 1 つを見つけます (実際にはどれでも問題ありません。すべてがリークする必要があります)。または、重複するクラスを表示します。
  • GC ルートへのパスを表示する

修正がどのように見えるかは、原因によって異なります。

于 2012-07-27T11:18:56.897 に答える