这个错误是cms专有错误,并发清楚线程和工作线程同时工作,清理出来年老代的空间不足以存放由新生代晋升导年老代的对象
从而导致年老代垃圾回收变成了Serial Old,从而暂停应用程序,停顿时间过长
现象:
(concurrent mode failure): 1048576K->185976K(1048576K), 1.4906868 secs] 1520447K->185976K(1520448K), [Metaspace: 140571K->140571K(1183744K)], 1.4909291 secs] [Times: user=1.96 sys=0.00, real=1.49 secs]
Heap after GC invocations=27553 (full 48):
par new generation total 471872K, used 0K [0x00000000a0000000, 0x00000000c0000000, 0x00000000c0000000)
eden space 429456K, 0% used [0x00000000a0000000, 0x00000000a0000000, 0x00000000b99a0000)
from space 51413K, 0% used [0x00000000bccd0000, 0x00000000bccd0000, 0x00000000c0000000)
to space 52416K, 0% used [0x00000000b99a0000, 0x00000000b99a0000, 0x00000000bccd0000)
concurrent mark-sweep generation total 1048476K, used 183976K [0x00000000c0000000, 0x0000000100000000, 0x0000000100000000)
Metaspace used 140571K, capacity 152156K, committed 152836K, reserved 1183744K
class space used 15971K, capacity 18769K, committed 18896K, reserved 1048576K
}
可能原因:1 年轻代产生大对象直接放入年老代,- XX:PretenureSizeThreshold = <字节大小>(默认为0,即不直接在年老代创对象,且该参数只对serial 和parallel new收集器有效)所以一般要检查代码,避免创建大量的大对象
2 cms触发太晚(一般默认值,不会这个原因造成) -XX:CMSInitiatingOccupancyFraction=N调小
3 内存碎片太多,
-XX:+UseCMSCompactAtFullCollection (空间碎片整理)
-XX:CMSFullGCsBeforeCompaction=n
4 检查年轻代年老代比例是否合适
晋升阈值过小,可以根据对象大小或年纪来调(一般默认即可);
Survivor,Eden年轻代过小,导致晋升速率提高