首页  

java GC之 CMS 和 G1     所属分类 java 浏览量 1461
CMS(Concurrent Mark Sweep)

标记-清除

初始标记(CMS initial mark) 只是标记一下GC Roots能直接关联到的对象,速度很快 
并发标记(CMS concurrent mark 进行GC Roots Tracing,在整个过程中耗时最长。
重新标记(CMS remark) 修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记,停顿时间一般比初始标记阶段稍长一些,但远比并发标记的时间短。
并发清除(CMS concurrent sweep)

并发标记 耗时最长


整个过程中耗时最长的并发标记和并发清除过程GC线程都可以与用户线程一起工作

并发收集、低停顿
并发低停顿收集器(Concurrent Low Pause Collector)。

CMS缺点

对CPU资源非常敏感  默认回收线程数(CPU数量+3)/4
无法处理浮动垃圾(Floating Garbage) 可能出现 Concurrent Mode Failure 
并发清理阶段用户线程还在运行,会有新的垃圾不断产生,需要预留足够的内存空间给用户线程使用
标记-清除算法导致空间碎片  导致大对象无法分配  


G1
Garbage-First

并行与并发
分代收集 
空间整合  从整体来看基于 标记-整理, 从局部(两个Region之间)上来看基于复制 ,不会产生内存碎片
可预测的停顿 

将整个Java堆划分为多个大小相等的独立区域(Region)
新生代和老年代不再是物理隔离的
都是一部分Region(不需要连续)的集合。

G1跟踪各个Region里面的垃圾堆积的价值大小
后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(Garbage-First名称的来由)

使用Region划分内存空间 有优先级的区域回收方式
保证在有限的时间内可以获取尽可能高的收集效率


避免全堆扫描 Remembered Set
为每个Region维护一个与之对应的Remembered Set

对Reference类型的数据进行写操作   Write Barrier
检查Reference引用的对象是否处于不同的Region之中
通过CardTable把相关引用信息记录到被引用对象所属的Region的Remembered Set之中

GC时  在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗漏。

初始标记(Initial Marking) 
仅仅标记GC Roots 能直接关联到的对象,并修改TAMS(Nest Top Mark Start),
让下一阶段用户程序并发运行时,能在正确的Region中创建对象,此阶段需要停顿线程,但耗时很短。

并发标记(Concurrent Marking) 
从GC Root 开始对堆中对象进行可达性分析,找到存活对象,耗时较长,可与用户程序并发执行。

最终标记(Final Marking) 
为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,
虚拟机将这段时间对象变化记录在线程的Remembered Set Logs里面,
最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set中,需要停顿线程,但是可并行执行。

筛选回收(Live Data Counting and Evacuation) 
首先对各个Region中的回收价值和成本进行排序,根据用户所期望的GC 停顿是时间来制定回收计划。
此阶段其实也可以做到与用户程序一起并发执行,因为只回收部分Region,时间可控,而且停顿用户线程将大幅度提高收集效率。


各类型回收期总结


收集器	串行、并行or并发	新生代/老年代	算法	目标	适用场景
Serial	            串行	新生代	复制算法	        响应速度优先	单CPU环境下的Client模式
Serial Old	        串行	老年代	标记-整理	        响应速度优先	单CPU环境下的Client模式、CMS的后备预案
ParNew	            并行	新生代	复制算法	        响应速度优先	多CPU环境时在Server模式下与CMS配合
Parallel Scavenge	并行	新生代	复制算法	        吞吐量优先	    在后台运算而不需要太多交互的任务
Parallel Old	    并行	老年代	标记-整理	        吞吐量优先	    在后台运算而不需要太多交互的任务
CMS	                并发	老年代	标记-清除	        响应速度优先	集中在互联网站或B/S系统服务端上的Java应用
G1	                并发	both	标记-整理+复制算法	响应速度优先	面向服务端应用,将来替换CMS


新生代 使用 复制算法

Serial  Serial Old   ParNew 应该都是 吞吐量优先

上一篇     下一篇
FileInputStream无法读取完整数据问题解决

Java GC种类及配置说明

LSM Tree 要点整理

统一运维监控平台相关资料整理

时间序列数据库要点整理

内核参数设置及优化