来自周志明《深入理解Java虚拟机》
基本的概念
G1收集器是当今收集器技术发展的最前沿成果之一。
G1是一个面向服务端应用的垃圾回收器
G1具有的特点
并行与并发:使用多个CPU来缩短STW停顿的时间
分代收集:G1不像其他的收集器需要其他的收集器配合使用,它自己就可以独立的管理整个GC堆
空间整合:两种算法(标记整理与复制算法)
可预测的停顿:能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,同理就是可以设置最大停顿时间。
GC的运作过程:
初始标记:速度快,收集所有GC与root根相关的对象。
并发标记:Tracing过程
最终标记:独占式,弥补之前并发所新产生的垃圾对象。
筛选标记:没有包含的垃圾对象,放入队列,也决定哪些对象可以进行混合GC.
G1的原理:
G1将整个Java堆划分为多个大小相等的独立区域(Resign),避免了很多GC操作整个Java堆或整个年代的进行,对于新生代和老年代不再是物理隔离,他们都是一部分(不需要连续)的集合,
Resign的理解
它的大小是2的倍数,1MB-3MB之间。可以设置,在使用时候,所有的Resign有一样的大小
CSet包含一系列的Resign,每个Resin有一个Rset。RSet包含了相应Resign里面指针的位置集合在Rset占1%-2%,
开始G1会从可用Resign队列里面挑选出Resign并设置为Eden Resign,当一个Eden Resign填满了,在从队列里面挑选一个,所有的都满的时候,一个年轻代GC收集开始执行,年轻代GC结束后,G1会评估对象是否到45%这个阈值。
l 对于老年代:当老年代空间耗尽的时候,它会启动失败保护应急机制----收集压缩老年代。
l 对于大对象:指的是大小超过Resign的50%,(1);G1会选择一组连续的Resign,(2)Full GC,压缩Java堆,它放在老年去以外,单独区域独立管理,因为大对象太大,移动不便,所以只要判断它是否包含引用。
l 对于年轻代,年轻代回收过程中,幸存下来的对象都有自己信息,会存在一张表里面。
G1的底层结构
每一个Resign都有自己关联的RS,RS的结构是hash表,表里面的数据是Card Table(堆中每512byte映射在Card Byte的1byte),相当于存储的是存活对象的指针。
当Resign中的数据发生变化时候,反映到Card table中的一个或者多个card上,RS通过 描内部的Card Table得到Resign中内存使用的情况和存活对象。