G1 收集器jdk1.7 正式使用 替换CMS方案
特点:
并行:多个GC线程同时工作
并发:与应用程序交替执行
分代GC:兼顾新生代 和 老年代
空间整理:每次GC之后都会复制对象。进行空间整理,减少空间碎片
可预见性:缩小了回收范围,从而可控全局停顿
G1收集过程:
新生代GC:eden 区清空,收集部分survivor区数据。
并发标记周期(为了降低一次停顿时间)
初始标记(进行一次新生代GC)
根区域扫描(不会停顿,不能被新生代GC中断)扫描survivor 和 老年代区域
并发标记:(可以被新生代GC中断)扫描整个堆对象
重新标记:引起全局停顿 为了纠正 在并发标记时候应用线程对标记结果产生的影响
独占清理:引起停顿 计算各个区域存活对象和比例
并发清理:根据独占清理计算结果,回收那些不含存活对象的区域(少量对象被回收)
混合收集: 既回收正常年轻代GC,又选取一些被标记的老年代区域进行回收(标记为G区域进行回收)。 大部分垃圾回收在这个阶段
必要时进行FULL GC: 混合GC和新生代GC 空间不足,都会引发full gc。
相关的一些参数
-XX:+UseG1GC 打开G1收集器
-XX:MaxGCPauseMillis 目标最大停顿时间 (通过调整堆大小和新生代和老年代比例来达到目标)
-XX:ParallelGCThreads 设置并发回收时 GC线程的数量
-XX:InitiatingHeapOccupancyPercent 设置堆使用率达到多少 并发标记周期的执行
过大容易引起Full GC ,因为会导致并发周期标记迟迟得不到执行 过小容易使得并发周期频繁发生,抢占cpu.