串行收集器(Serial收集器)
单线程的收集器,年轻代采用标记复制、老年代采用标记整理的算法,全程STW
并行收集器(Parallel Scavenge)
Serial收集器的多线程版本,可以根据-XX修改线程数量,非必要不修改,年轻代用的是标记复制算法,老年代用的是标记整理算法,收集全程STW
ParNew收集器
l逻辑与并行的Parallel收集器一样,区别在于可以和CMS配合使用,ParNew作用于年轻代,Parallel可以作用于年轻代与老年代
CMS收集器
初始标记
标记GCRoots元对象直接能引用的对象,短时间STW
并发标记
根据GCRoots所引用的对象,遍历整个对象图,整个过程时长较长,但是不会STW
重新标记
这个步骤是为了修复并发标记中,所产生变化的对象,主要是用的三色算法,会STW
并发清理
与用户线程同步进行,如果有新增的对象会被标记为黑色。采用的是标记清理算法
问题
无法处理浮动垃圾,只能留在下一次GC进行回收
会和服务抢占资源,对CPU资源比较敏感
利用的是标记清理算法,会有垃圾碎片,但是可以配置几次GC后执行一次标记整理
在这次fullGC没执行完成的清空下,又开始了下一次GC,这时CMS会转变为Serial收集器进行回收,全程STW单线程收集。
垃圾收集算法
标记清理
标记非垃圾对象,其余的全部回收,会产生大量空间碎片
标记整理
和标记清理前期算法一致,但是标记完成后不会直接清理,而是将存活对象已到一端移动,完成后将未移动的直接清理
标记复制
将内存分为两部分,其中一部分使用完成后,将存活的对象复制到空闲的一部分,另外一部分之前清理