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 ..
私たちは同様の問題に直面しました。残念ながら、クラスはヒープ内ではなくネイティブメモリ内にあるため、ヒープダンプは役に立ちません。ロードされたクラスのトラブルシューティングを行うには、JVM設定でこれらを有効にします。
-XX:+PrintGCDetails -XX:+TraceClassUnloading -XX:+TraceClassLoading
私たちの場合、問題はJAXBContext.newInstanceがシングルトンではないことでした。
幸運、アルバート
圧縮されたoopと圧縮されたクラスポインターを使用すると、必要なポインターマングリングにより、クラスの使用可能なスペースが制限されます。あなたのケースでは1GB。
これは多くのクラスであるため、アプリケーションの何かが多くのクラスを作成していて、それらを解放していないことを示している可能性があります。アプリケーションのリロードは多分?
アプリケーションがクラスに必要なだけのメモリを必要とすることが確かな場合は、-XX:CompressedClassSpaceSize=...
を介して制限を増やすか、-XX:-UseCompressedClassPointers
を介して圧縮クラスポインターを無効にしてみてください。
デフォルトでは、圧縮クラススペース+圧縮ヒープ(+オーバーヘッド)は32GBを超えることができないことに注意してください。ただし、AIUIでは、オブジェクトの配置を変更すると、その制限がさらに緩和される可能性があります。
それ以外の場合は、ヒープダンプを取得して、ロードされたクラスの保持内容を分析する必要があります。