G1收集器
G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备对个处理器以及大容量内存的机器。可以极高概率满足GC停顿时间要求,还有高吞吐量性能的特性。
G1把java堆划分成为多个大小相等的独立区域(Region),JVM最多可以有2048个Region。一个region的大小是堆大小除以2048,如果堆的大小是4096M,region的大小是2M,当然也可以使用参数“-XX:G1HeapRegionSize”手动指定region的大小,但是还是推荐默认的计算方式。
G1还是保留了年轻代和老年代的概念,但不再是物理隔离了,他们都属于region。默认年轻代堆内存的占比是5%,比如堆的大小是4096M,那么年轻代就占据200M左右的内存,对应大概是100个region,可以通过“-XX:G1NewSizePercent”来设置新生代初始的占比,在系统运行中,jvm会不停的给年轻代增加跟多的region,但是最多新生代的占比不会超过60%,也可以使用“-XX:G1MaxNewSizePercent”进行调整。年轻代中Eden和Survivor对应的region也是默认的8:1:1,如果年轻代有1000个region,eden区对应800个,s0对应100个 ,s1对应100个。一个region的区域功能可能会动态变化的。
G1垃圾收集器对应对象什么时候会进入老年代,和之前原则一样,唯一不同的是大对象的处理,G1有专门分配大对象的region叫Humongous区,而不是让大对象直接进入老年代的region。在G1中,大对象的判断条件是,如果这个对象的大小超过了一个region的50%,就会放入到Humongous中,如果一个大对象太大,就会放入对个region中。这样可以节约老年代的空间,避免老年代不够进行GC的开销。FULLGC的时候处理收集年轻代和老年代之外,也会收集Humongous区域。
G1垃圾收集器的过程
1.初始标记(STW):暂停所有的其它线程,并记录下gcroots直接能引用的对象,速度很快;
2.并发标记:和cms的并发标记一样。
3.最终标记:和CMS的重新标记一样。
4.筛选回收:筛选回收阶段要先对各个region的回收价值和成本进行排序,根据用户所期望的GC停顿时间(-XX:MaxGCPauseMillis)来制定回收计划。如果本次垃圾回收只能停顿200ms,那么通过回收成本计算得知,可能回收600个region就是200ms,那么就会只回收600个region,就算有多余的region也不就行回收了。不管是年轻代还是老年代,回收算法都是复制算法,G1采用复制算法回收几乎不会有太多的内存碎片。可能因为G1并发垃圾回收太复杂了,暂时没有实现并发回收。
G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的region(这也可能是他名字的由来),这种使用region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限时间内尽可能提高收集的效率。
G1的特点
1,。并行和并发:G1能充分利用cpu、多核,使用多个cpu来缩短stw停顿时间。G1仍然可以通过并发的方式让java程序继续执行。
2.分代收集:G1可以不需要其它收集器配合就可以独立管理整个GC堆,但是还保留了分代的概念
3.空间整合:G1从整体来看是基于"标记整理"算法,从局部上来看是基于复制算法实现的。
4.可预测的停顿:这是G1相对于cms的另一个大优势,降低停顿时间是G1和cms共同关注的点,G1可以建立可预测的停顿时间模型,让使用者明确指定在一个长度为M毫秒的时间片段内完成垃圾收集。
用户指定期望的停顿时间是G1收集器很强大的一个功能。但是期望值也不能定的太低,默认停顿时间是200ms,如果调的太低,很有可能导致垃圾慢慢堆积,最终占满堆引发full gc,性能会很低,一般设置100-300ms都很正常。
G1垃圾收集分类
1.YoungGC:
YoungGC不一定是Eden满了就触发,会先计算Eden区回收的大概时间,如果远小于参数-XX:MaxGCPauseMills的值,那么就继续增加年轻代的region,继续给新对象存放。直到时间接近设置的暂停时间的值,就会触发YoungGC.
2.MixedGC
如果老年的的堆占有率达到参数-XX:InitiatingHeapOccupancyPercent设定的值则会触发,回收所有的young和部分old以及大对象区,如果在复制的过程中没有足够的空region能承载拷贝对象,就会触发一次fullgc
3.full GC
停止系统程序,使用单线程,进行标记、清理和压缩整理,可以空闲出来一批Region来供下一次MixedGC使用,fullgc非常耗时。
G1使用的场景:1.50%以上的 堆被存活对象占用。2.对象分配和晋升的速度变化很大。3.垃圾回收时间很长。4.堆内存超过8G。5.停顿时间控制在500ms内的。