JVM垃圾收集器【Serial、ParNew、PS、CMS、Serial Old、PO、G1】总结

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、赋值器删除量全部从灰色对象到改白色对象的新引用【原始快照破话原理】

你可能感兴趣的:(Java,java,经验分享,面试)