【JVM】G1垃圾收集器深刻分析

1、和CMS对比

  G1 CMS
设计原则 首先收集尽量多的垃圾(Garbage First) 尽量少而块地执行GC,以停顿时间为目标
垃圾回收时机  启发式算法,在老年代找出具备高收集收益的分区进行收集  内存耗尽(新生代)或者快耗尽(老年代)
 内存划分 将内存划分为一个个相等大小的内存分区(Region),每一个区域均可能有四种状态:E(eden)、S(Survial)、O(old)、空闲  分为新生代和老年代2块连续的内存空间
 是否产生垃圾碎片
将一组或多组区域(称为回收集 (CSet))中的存活对象以增量、并行的方式复制到不一样的新区域来实现压缩,从而减小堆碎片
采用标记删除,会产生碎片 

2、技术细节

一、G1有一个及其重要的特性:软实时(soft real-time)。所谓的实时垃圾回收,是指在要求的时间内完成垃圾回收。“软实时”则是指,用户能够指定垃圾回收时间的限时,G1会努力在这个时限内完成垃圾回收,可是G1并不担保每次都能在这个时限内完成垃圾回收。经过设定一个合理的目标,可让达到90%以上的垃圾回收时间都在这个时限内。算法

二、动态调节年轻代和总堆的比例。 并发

G1能够根据用户设置的暂停时间目标自动调全年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;

整个年轻代内存会在初始空间-XX:G1NewSizePercent(默认整堆5%)与最大空间-XX:G1MaxNewSizePercent(默认60%)之间动态变化,
且由参数目标暂停时间-XX:MaxGCPauseMillis(默认200ms)、须要扩缩容的大小以及分区的已记忆集合(RSet)计算获得。
固然,G1依然能够设置固定的年轻代大小(参数-XX:NewRatio、-Xmn),但同时暂停目标将失去意义。线程

3、垃圾回收过程

一、YGC

在Eden充满时触发,在回收以后全部以前属于Eden的区块全变成空白。而后把剩余的存活对象移动到S区。设计

不少状况下,S区的对象会有部分晋升到Old区,另外若是S区已满、Eden存活的对象会直接晋升到Old区,这种状况下Old的空间就会涨对象

这个过程会对年轻代的对象有一个短暂的停顿内存

二、并发标记阶段

G1并发标记周期能够分红几个阶段、其中有些须要暂停应用线程。有些是后台并行处理,不须要暂停应用io

  1. 初始标记。须要暂停应用线程这个阶段会暂停全部应用线程。部分缘由是这个过程会执行一次YGC
  2. 并发扫描。后台线程并行处理,不会暂停应用
  3. 并发标记。在root扫描完成后,G1进入了一个并发标记阶段。这个阶段也是彻底后台进行的
  4. 并发标记阶段是能够被打断的,好比这个过程当中发生了YGC就会。这个阶段以后会有一个二次标记阶段和清理阶段。这两个阶段一样会暂停应用线程,但时间很短。接下来还有额外的一次并发清理阶段

三、混合GC

接下来G1执行一系列的混合GC。这个时期由于会同时进行YGC和清理上面已标记为X的区域,因此称之为混合阶段。table

每次混合GC只是清理一部分的O区内存,整个GC会一直持续到几乎全部的标记区域垃圾对象都被回收,这个阶段完了以后G1会从新回到正常的YGC阶段。周期性的,当O区内存占用达到必定数量以后G1又会开启一次新的并行GC阶段.后台

四、FullGC

若是对象内存分配速度过快,mixed gc来不及回收,致使老年代被填满,就会触发 一次full gc,G1的full gc算法就是单线程执行的serial old gc,会致使异常长时间的暂停时间,须要进行不断的调优,尽量的避免full gc.垃圾回收

相关文章
相关标签/搜索