G1 | CMS | |
设计原则 | 首先收集尽量多的垃圾(Garbage First) | 尽量少而块地执行GC,以停顿时间为目标 |
垃圾回收时机 | 启发式算法,在老年代找出具备高收集收益的分区进行收集 | 内存耗尽(新生代)或者快耗尽(老年代) |
内存划分 | 将内存划分为一个个相等大小的内存分区(Region),每一个区域均可能有四种状态:E(eden)、S(Survial)、O(old)、空闲 | 分为新生代和老年代2块连续的内存空间 |
是否产生垃圾碎片 | 将一组或多组区域(称为回收集 (CSet))中的存活对象以增量、并行的方式复制到不一样的新区域来实现压缩,从而减小堆碎片 |
采用标记删除,会产生碎片 |
一、G1有一个及其重要的特性:软实时(soft real-time)。所谓的实时垃圾回收,是指在要求的时间内完成垃圾回收。“软实时”则是指,用户能够指定垃圾回收时间的限时,G1会努力在这个时限内完成垃圾回收,可是G1并不担保每次都能在这个时限内完成垃圾回收。经过设定一个合理的目标,可让达到90%以上的垃圾回收时间都在这个时限内。算法
二、动态调节年轻代和总堆的比例。 并发
整个年轻代内存会在初始空间-XX:G1NewSizePercent(默认整堆5%)与最大空间-XX:G1MaxNewSizePercent(默认60%)之间动态变化,
且由参数目标暂停时间-XX:MaxGCPauseMillis(默认200ms)、须要扩缩容的大小以及分区的已记忆集合(RSet)计算获得。
固然,G1依然能够设置固定的年轻代大小(参数-XX:NewRatio、-Xmn),但同时暂停目标将失去意义。线程
在Eden充满时触发,在回收以后全部以前属于Eden的区块全变成空白。而后把剩余的存活对象移动到S区。设计
不少状况下,S区的对象会有部分晋升到Old区,另外若是S区已满、Eden存活的对象会直接晋升到Old区,这种状况下Old的空间就会涨对象
这个过程会对年轻代的对象有一个短暂的停顿内存
G1并发标记周期能够分红几个阶段、其中有些须要暂停应用线程。有些是后台并行处理,不须要暂停应用io
接下来G1执行一系列的混合GC。这个时期由于会同时进行YGC和清理上面已标记为X的区域,因此称之为混合阶段。table
每次混合GC只是清理一部分的O区内存,整个GC会一直持续到几乎全部的标记区域垃圾对象都被回收,这个阶段完了以后G1会从新回到正常的YGC阶段。周期性的,当O区内存占用达到必定数量以后G1又会开启一次新的并行GC阶段.后台
若是对象内存分配速度过快,mixed gc来不及回收,致使老年代被填满,就会触发 一次full gc,G1的full gc算法就是单线程执行的serial old gc,会致使异常长时间的暂停时间,须要进行不断的调优,尽量的避免full gc.垃圾回收