G1垃圾回收器简介及回收过程

G1是一款关注停顿时间且提供可控回收的垃圾收集器,旨在取代CMS。其特点是采用分区(region)策略,优化空间碎片,并通过Remembered Sets和Card Table实现高效回收。G1的垃圾回收包括新生代GC、并发标记周期、混合回收和Full GC四个阶段。通过参数设置如-XX:MaxGCPauseMillis和-XX:InitiatingHeapOccupancyPercent等,可实现停顿时间的控制和性能优化。
摘要由CSDN通过智能技术生成

一.什么是G1
同CMS一样,G1也是关注停顿时间,不过它是可控的,它被设计用来取代CMS,因为它是空间整理所以没有CMS那么严重的空间碎片问题,同时提供可控的停顿时间。

特性:
1.G1不同于之前的那些垃圾收集器分为连续的年轻代,老年代和永久代,而是分区(region),它将堆分为大大小小的区域(通常约为2048个),每个区域就是eden,survivor,old
2.一般优先回收包含垃圾最多的区域,所以叫Garbage-First(G1)
3.之前的垃圾收集器要么是新生代,要么是老年代,而G1兼顾年轻代和老年代
4.可控性:因为G1可以选择回收部分区域,所以可以做到停顿时间的可控性
可以看到G1的堆结构,是分为一个一个的区
在这里插入图片描述

几个名词介绍
Remembered Sets:每个区都有一个 RSet,用于记录进入该区块的对象引用(如区块 A 中的对象引用了区块 B,区块 B 的 Rset 需要记录这个信息),可以避免扫描整个区,而只需要扫描Rset就行,它用于实现收集过程的并行化以及使得区块能进行独立收集。总体上 Remembered Sets 消耗的内存小于 5%。

Collection Sets: GC中待回收的region的集合。CSet中可能存放着各个分代的Region。CSet中的存活对象会在gc中被移动(复制)。GC后CSet中的region会成为可用分区。

Card Table Java虚拟机用了一个叫做CardTable(卡表)的数据结构来**标记老年代的某一块内存区域中的对象是否持有新生代对象的引用,**卡表的数量取决于老年代的大小和每张卡对应的内存大小,每张卡在卡表中对应一个比特位,当老年代中的某个对象持有了新生代对象的引用时,JVM就把这个对象对应的Card所在的位置标记为dirty(bit位设置为1),这样在Minor GC时就不用扫描整个老年代,而是扫描Card为Dirty对应的那些内存区域。

Humongous region: 是G1中存放巨型对象的分区,巨型对象是指占用了region容量的50%以上的一个对象,如果一个H区装不下一个巨型对象,则会通过连续的若干H分区来存储。因为巨型对象的转移会影响GC效率,所以并发标记阶段发现巨型对象不再存活时,会将其直接回收。ygc也会在某些情况下对巨型对象进行回收。

TLAB(Thread Local Allocation Buffer)本地线程缓冲区: 由于对象一般分配在堆上,而堆是线程共用的,因此可能会有多个线程在堆上申请空间,而每一次的对象分配都必须线程同步,会使分配的效率下降。所以在线程初始化时,同时也会在eden区申请一块指定大小的内存,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率。

栈上分配: 对于那些线程私有对象(指不可能被其他线程访问的对象)可以将它们打散分配在栈上,而不是分配在堆上,这样就不需要GC了,随着线程的销毁而回收。栈空间小,对于大对象无法实现栈上分配。栈上分配依赖于逃逸分析和标量替换 。

Snapshot-At-The-Beginning(SATB): SATB是在G1 GC在并发标记阶段使用的增量式的标记算法。SATB可以理解成在GC开始之前对堆内存里的对象做一次快照,此时活的对象就认为是活的,从

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值