对于G1垃圾回收器

来自周志明《深入理解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中内存使用的情况和存活对象。

阅读更多
文章标签: G1
个人分类: JVM
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭