垃圾收集器3-G1收集器

G1收集器是当今收集器技术发展最前沿的成果之一,与其他收集器相比,G1收集器具备一下特点:

G1收集器将Java堆划分为多个大小相等的独立区域(Region)。它之所以能建立可预测的停顿时间模型,是因为它可以有计划的避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的来及堆积的价值大小(回收所获得的空间大小及回收所需要的时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间优先收集价值最大的Region。

G1收集器中Region之间的对象引用以及其他收集器中的新生代和老年代之间的对象引用,虚拟机都是使用Remembered Set来避免全堆扫描的。G1中每个Region都有一个与之对应的Remembered Set,虚拟机发现程序在对Reference类型的数据进行写操作时,会产生一个Write Barrier暂时中断写操作,检查Reference引用的对象是否处于不同的Region之中(在分代的例子中就是检查是否老年代的对象引用了新生代中的对象),如果是,便通过CardTable把相关引用信息记录到都被引用对象所属的Region的Remembered Set中。当进行内存回收时没在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗漏。

G1收集器的运作划分为以下步骤:

运行示意图如下:

jvm_12