G1垃圾回收算法概述

垃圾回收都是基于分区进行的。G1在实现垃圾回收时一共提供了3种回收的方法,分别是新生代回收(称为Young GC, YGC),混合回收(称为Mixed GC),全回收(称为Full GC, FGC)。这3种垃圾回收触发的时机通常如下:

1. 应用程序分配对象时,发现内存不足,触发YGC;

2. 在YGC执行中,判断整体内存使用是否大于一定的阈值,如果大于启动并发标记;在并发标记完成后,当下一次启动垃圾回收称为Mixed GC,在Mixed GC执行过程中不仅回收新生代分区,同时也回收部分老生代分区;

3. 在用程序分配对象时,发现内存不足,触发YGC或者Mixed GC;垃圾回收结束后再次尝试分配对象,如果内存还不足,此时将触发FGC。

在整个JVM运行过程中,还可以通过外部命令或者代码触发垃圾回收。

1 Young GC概述

G1对于YGC和Mixed GC的回收采用的复制算法。简单可以总结为:从根出发,标记活跃对象,并将活跃对象复制到新的分区中。在实际实现中,G1为了提高回收效率,将整个回收过程进行了细分,大体上拆分为:并行执行部分和串行执行部分。首先G1针对多个根进行并行的标记复制,然后再进行串行的标记复制。最早G1把引用处理也放在串行执行部分中,后来G1对引用处理做了优化,也可以并行执行,但是引用处理并不能直接放入到并行执行部分(因为引用处理必须在多个根并行执行完成之后才能执行)。所以这里把串行执行部分称为其他部分,在其他部分执行中以串行执行为主,有个别的任务的可以并行执行。

YGC的执行顺序来看一下整个收集过程的主要步骤:

1. 进行收集之前需要执行暂停。

2. 选择分区回收集合(称为CSet),对于YGC来说整个新生代分区都会被放入到CSet。

3. 进入并行任务处理

1) 根扫描并处理;处理过程会把根直接引用的对象复制到新的Survivor区,然后把被引用对象的成员变量入栈等待后续的复制处理。

2) 处理老生代分区到新生代分区的引用;首先会把程序运行过程中需要记录的代际关系引用信息进行保存(代际引用关系通过数据结构RSet来存储,G1中还存在单代的引用处理线程),然后从RSet出发,把RSet所在卡表对应的分区内存块中所有的对象都认为是根,把这些根引用到的对象复制到新的Survivor区,然后把被引用对象的成员变量入栈等待后续的复制处理。

3) JIT代码扫描。

4) 根据栈中的对象,进行深度递归遍历复制对象。

4. 下面是其他任务处理,其他任务大部分都是串行执行

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值