在使用cms垃圾收集器时可能会看到:
产生这种报错的原因有两个
1.年轻代提升太快,老年代的处理速度跟不上新生代的提升速度
解决办法:
①.调大新生代空间 -Xmn
②.加大新生代晋升的阈值 -XX:MaxTenuringThreshold
2.老年代碎片过多
解决办法:
①.调到老年代的比例 –XX:NewRatio 调大
②.设置老年代占用比,进行压缩
-XX:CMSInitiatingOccupancyFraction=80(默认是 68)
-XX:+UseCMSInitiatingOccupancyOnly
当老年代碎片过多时,这个过程注意cms的性能会比较差,退化成只有一个线程来收集垃圾,耗时可能有几秒或十几秒。
一个Survivor 区不能容纳eden和另外一个survivor里面的存活对象,多余的对象进入老年代,这样就会导致老年代里面的存放大量的短暂存活的对象,
而我们知道,如果老年代里面没有可用空间就会发生full gc,这样就造成扫描整个堆,造成提升失败(promotion failed)。
解决办法:增加survivor
①.增加年轻代的大小 -Xmn
②.调整survivor和eden的比例 -XX:SurvivorRatio 默认是8 , 各占比 s0:s1 :eden =1:1:8 , 减小这个值也就加大了survivor。