我們在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 ..
憑藉其-Xms和XMX交換機你啓動JVM?我建議您使用visualvm或類似工具來更好地查看和了解您的JVM大小的設置方式。或者使用Eclipse Memory Analyzer。暫時您可以嘗試使用-XX:CompressedClassSpaceSize來增加壓縮類空間。爲了更好地分析問題,您應該將JVM設置爲OOME上的堆轉儲。 – Marged
在什麼時間段後,你會看到這個例外?你有沒有嘗試增加CompressedClassSpace?即g:-XX:CompressedClassSpaceSize = 1g?如果您再次看到問題,但經過較長時間後,您似乎有某種內存泄漏。 –
@DavidG - 第一次在2天前遇到的服務器之一(我們沒有部署新版本)。 重新啓動服務器,並在12小時後只在其中一臺服務器上再次看到它。 壓力負荷dosnt幫助重現。壓縮大小保持幾乎相同,並且不接近默認的1G。 – user1236097