jdk版本<=9 包含上述垃圾收集器,根据分代理论基础可分为新生代+老年代。
G1的出现打破了以往分代理论的思考,通过化繁为简的方式实现低延迟。
新生代收集器
Serial
早期版本新生代垃圾收集器
特点
收集算法:标记-复制 线程协作:单线程 应用领域:客户端、内存有限
ParNew
继承Serial思路,拓展为并行处理
特点
收集算法:标记-复制 线程协作:多个GC线程并行处理 应用领域:主要结合CMS使用,低延迟
PS
继承ParNew,关注点为可控吞吐量【用户线程占据CPU时间/所有线程占据CPU总时间】
特点
收集算法:标记-复制 线程协作:多GC线程并行处理 更新点:通过添加参数-XX:+UseAdaptiveSizePolicy实现将内存管理寄托于虚拟机。实现自动管理内存。
老年代收集器
Serial Old
早期作为老年代收集器,同Serial配合使用,同时也可作为CMS分配对象失败时的后备收集器
特点
收集算法:标记-整理 线程协作:单线程处理
CMS
CMS的出现是第一次尝试追求低延迟,以及后面的G1都是在追求低延迟。可以说G1作为CMS的覆盖者。
特点
收集算法:标记-清除 收集流程:初始标记-并发标记-最终标记-并发回收,初始标记+最终标记需要暂停用户线程,确保一致性。 收集算法优点:快速 收集算法缺点:产生大量浮动垃圾,分配连续大对象时易产生full gc
PO
PO的产生是为了搭配PS,ps出现时只能跟Serial Old搭配,吞吐量在老年代不能搭配,故产生了PO
特点
收集算法:标记-整理 线程协作:并发处理
区域收集器【打破常规】
G1【Garbage First】
正如前文提到,G1也属于低延迟目标的实现者,创造它不仅是一种思维上的突破,更作为CMS的替换者,两者在处理流程上有很大的相似之处。
特点
回收算法:标记-整理 思维突破: 不在区分新生代、老年代,而是将内存划分成一个个Region区域,区域大小在1-32MB【2的幂次方】之间,可理解为新生代、幸存区,当Region区域中对象内存大于一半时可将其认为是Humgongous Region【老年代】 收集流程: 初始标记-并发标记-最终标记-筛选回收,除了并发标记,其余都是暂停用户线程,GC并发处理,归根结底跟回收算法有关。 如何实现低延迟 计算每个Region中回收效率,内部维护一个优先队列,每次回收指定时间内的Region。 缺点 内存占用相对较大,每个Region内部维护一个记忆集用来获取脏数据【GC标记之后,又失去存活条件】
低延迟收集器CMS、G1对比
CMS G1
关系: 先驱 后代
可达性分析: 增量更新 原始快照
可达性分析问题
并发对象扫描时对象消失问题,当下列两个条件同时发生 1、赋值器插入一条或多条从黑色对象到白色对象的新引用【增量更新破坏原理】 2、赋值器删除量全部从灰色对象到改白色对象的新引用【原始快照破话原理】
|