有些资料中,为区别parallel collector ,将应用与gc并发成为并行,在接下来的文章中,仍称为并发。
—XX:useConcMarkSweepGC,可以用于minor gc和major gc
cms在gc时,也会有两次短暂停,垃圾收集线程与应用线程并发
并发失败:
如果无法及时清理内存和分配内存,也会暂停整个应用。
OutOfMemoryException:
如果超过98%的时间用来gc,但每次恢复内存不足2%,会抛出该异常。与parallel collector不同,
98%时间的统计并不包括‘并发收集’的时间,只计算停止应用线程来收集垃圾的时间
浮动垃圾:
gc线程与应用线程并发,会导致一部分对象在被标记为活对象之后,在本次gc结束前,成为了死对象。这些死对象就是所谓浮动垃圾,在下一次gc时会被清理。因此建议,为浮动垃圾多分配20%的老年代。
暂停:
cms在一个major垃圾收集周期中,会暂停两次,两次都是对根引用直接可达的对象进行标记,因为是应用线程与gc 线程并发,所以,标记两次,以确保正确。
并发阶段:
在两次暂停之间,生成了可达对象(这次包括了非直接可达对象)的图,第二次暂停后,开始清除垃圾。
生成图和清除垃圾都是与应用并发的,此时,应用不会停止,但是吞吐量会下降。
并发收集:
串行垃圾收集器在老年代满了之后,暂停引用开始major gc。cms则会预估垃圾回收和老年代即将填满的时间,在老年代装满之前开始major gc。cms如果因为并发失败引发的暂停开销会比串行收集器的暂停开销更大。
-XX:CMSInitiatingOccupancyFraction=
<N>:指定老年代占用多大比例时,开始并发gc
暂停:
cms在major gc会有两次暂停,mark和remark。minor gc也会有短暂停,minor gc和major gc并发进行,为了避免两次暂停重合成一次长暂停,cms会把remark暂停安排在两次minor gc之间。
增长模式在1.8被废弃