2015-05-28 24 views
10

我們在java-8-oracle上運行。java.lang.OutOfMemoryError:壓縮類空間

六個月前我們搬到了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 .. 
+0

憑藉其-Xms和XMX交換機你啓動JVM?我建議您使用visualvm或類似工具來更好地查看和了​​解您的JVM大小的設置方式。或者使用Eclipse Memory Analyzer。暫時您可以嘗試使用-XX:CompressedClassSpaceSize來增加壓縮類空間。爲了更好地分析問題,您應該將JVM設置爲OOME上的堆轉儲。 – Marged

+0

在什麼時間段後,你會看到這個例外?你有沒有嘗試增加CompressedClassSpace?即g:-XX:CompressedClassSpaceSize = 1g?如果您再次看到問題,但經過較長時間後,您似乎有某種內存泄漏。 –

+0

@DavidG - 第一次在2天前遇到的服務器之一(我們沒有部署新版本)。 重新啓動服務器,並在12小時後只在其中一臺服務器上再次看到它。 壓力負荷dosnt幫助重現。壓縮大小保持幾乎相同,並且不接近默認的1G。 – user1236097

回答

5

隨着壓縮糟糕和壓縮類指針的類的可用空間受到限制,由於必要的指針截斷。 1GB在你的情況。

這是很多類,所以這可能表示應用程序中的某些內容正在創建大量類並且從不釋放它們。應用程序重裝也許?

如果您確定您的應用程序只需要很多類的內存,您可以嘗試通過-XX:CompressedClassSpaceSize=...來衝突限制或通過-XX:-UseCompressedClassPointers禁用壓縮類指針。

請注意,默認情況下,壓縮類空間+壓縮堆(+一些開銷)不能超過32GB。雖然,AIUI,更改對象對齊可以進一步提高該限制。

否則,你應該採取堆轉儲和分析什麼握住加載的類。

+0

您可以在jstat日誌中看到CCSU是1048576.0,CCSU是11339.1。 – user1236097

+1

可能是碎片?我不認爲課堂空間變得緊湊。雖然這樣一個巨大的因素很奇怪,即使它是分散的。另外,我認爲你已經排除了一列,仍然存在差異。 – the8472

+0

您可以運行這個,看看是否我錯列: 回聲「S0C S1C S0U S1U EC歐盟OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT \ n 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「|列-t – user1236097

7

我們遇到過類似的問題。不幸的是,堆轉儲不會幫助你,因爲這些類不在堆中,而是在本地內存中。讓這些在你的JVM設置來解決加載的類:

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

在我們的情況下,問題是JAXBContext.newInstance不是單身。

祝你好運, 阿爾伯特