web-dev-qa-db-ja.com

java.lang.OutOfMemoryError:圧縮されたクラススペース

Java-8-Oracleで実行しています。

6か月前にJava8に移行しました。

過去数日間、私たちは時々OOMEを取得しており、問題を特定または再現することができませんでした。

サーバー(Tomcat)への呼び出しを実行すると、スタックトレースで次のエラーが発生します。

Java.lang.OutOfMemoryError: Compressed class space

サーバーを再起動すると問題が解決します。他のサーバーへの同じ呼び出しが機能し、同じサーバーへの別のタイプの別の呼び出しも機能します。

Gc.logを見ると、次のことがわかります。

2015-05-27T16:05:42.991+0000: 98774.440: [Full GC (Last ditch collection) 98774.440: [CMS: 575745K->575330K(3495936K), 0.8687777 secs] 575745K->575330K(4107008K), [Metaspace: 97940K->97940K(1396736K)], 0.8696093 secs] [Times: user=0.95 sys=0.00, real=0.88 secs]
2015-05-27T16:05:55.486+0000: 98786.935: [Full GC (Metadata GC Threshold) 98786.935: [CMS: 573414K->578735K(3495936K), 0.9372859 secs] 925046K->578735K(4107008K), [Metaspace: 99428K->99428K(1396736K)], 0.9386626 secs] [Times: user=1.01 sys=0.00, real=0.94 secs]

jstat -gcは次を返します:

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
87296.0 87296.0  0.0   3151.4 523776.0 148284.4 3495936.0   574868.5  1395640.0 98066.3 1048576.0 11339.1  12165  636.851  223   116.957  

753.808

Jstatログまたはgcログのどちらにもメモリの問題はありません。

jmap -clstatsを実行しようとするとハングします:

Attaching to process ID 5110, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02
finding class loader instances ..
15
user1236097

私たちは同様の問題に直面しました。残念ながら、クラスはヒープ内ではなくネイティブメモリ内にあるため、ヒープダンプは役に立ちません。ロードされたクラスのトラブルシューティングを行うには、JVM設定でこれらを有効にします。

-XX:+PrintGCDetails -XX:+TraceClassUnloading -XX:+TraceClassLoading

私たちの場合、問題はJAXBContext.newInstanceがシングルトンではないことでした。

幸運、アルバート

11
Albert

圧縮されたoopと圧縮されたクラスポインターを使用すると、必要なポインターマングリングにより、クラスの使用可能なスペースが制限されます。あなたのケースでは1GB。

これは多くのクラスであるため、アプリケーションの何かが多くのクラスを作成していて、それらを解放していないことを示している可能性があります。アプリケーションのリロードは多分?

アプリケーションがクラスに必要なだけのメモリを必要とすることが確かな場合は、-XX:CompressedClassSpaceSize=...を介して制限を増やすか、-XX:-UseCompressedClassPointersを介して圧縮クラスポインターを無効にしてみてください。

デフォルトでは、圧縮クラススペース+圧縮ヒープ(+オーバーヘッド)は32GBを超えることができないことに注意してください。ただし、AIUIでは、オブジェクトの配置を変更すると、その制限がさらに緩和される可能性があります。

それ以外の場合は、ヒープダンプを取得して、ロードされたクラスの保持内容を分析する必要があります。

7
the8472