1、CMS垃圾收集器:old区的垃圾回收器
一般搭配使用的是:年轻代:ParNew,老年代:CMS
2、CMS特点:采用标记删除算法
a、初次标记:标记和GC Root直接引用的对象。STW
b、并发标记:标记老年代所有对象,根据可达性。会产生一个问题就是,并发标记没有STW,可能存在遗漏现象,比如一个线程标记了可用,另一个标记了不可用。那么就需要修正。
c、重新标记:修正并发标记产生的错误。STW
d、并发清理:采用标记清理算法。无STW
标记清理算法,会产生内存碎片,但省略了对象内存的移动成本,如果需要存储一个比较大的对象,发现内存中没有连续的内存,那么可能会触发一次GC。
3、G1垃圾收集器:
1.8的内存结构是连续,比如,新生代、老年代。连续。1.8之后使用G1垃圾回收时,堆内存不是连续的,而是一个个网格状,网格中标记了伊甸园区E,幸存区S,老年代O和未使用的空间。可能都不是连续的。
每一个块称之为一个region,一个region的大小是1-32m中的2的次幂,总region的大小大概是2000个。堆内存中存储对象的Region有一个自动调整策略,当一个对象的大小>0.5Region,<1Region,那么就直接存储在old区,在Region中标记为H,也就是超大对象。如果对象>1Region,那么就会申请多个H区,来存储这个对象。
Rset:再每一个Region中都存在一个Rset的地址引用,记录了其他Region引用当前Region。
Cset:本次GC需清理的Region集合。
4、G1垃圾回收器:覆盖再整个堆区:每次GC全堆进行 MixGC
年轻代:G1中对年轻代的收集:回收E区和Sf区,St区是没有标识的,也就是空的,根据复制算法将存活的对象复制到空闲的区域标识为St区。
老年代:回收
a、初次标记:标记所有GCRoot直接引用的对象,且还标记这些对象的Region,称之为Region Root。STW
b、然后扫描全Old区,看每一个Region中的Rset中是否包含Root Region。如果存在就标识。不存在的都是要被清理的。
c、并发标记:标记存在Root Region的引用对象,缩小了标记的范围。
d、重新标记:修正并发标记,采用的SATB算法,效率被CMS中的修正算法块。STW
e、清理:采用复制清理的算法,避免了产生内存碎片,选择垃圾较多的Region进行清除。清除不彻底,但是速度快。STW