Java JVM 5:G1 垃圾收集器概述

G1 垃圾收集器概述

G1 好处

G1垃圾收集器算是目前比较新的垃圾收集器,是用来替代 CMS 垃圾收集器。它有几个好处:

可以和用户线程并发(和 CMS 一样)
可以进行压缩内存(不产生内存碎片问题)
可以像 Parallel Scavenge 那样实现可预测的停顿(这点也是非常主要的)

内存结构上的区别

G1 垃圾收集器和之前的一些垃圾收集器在内存结构上的划分有着比较大的不同,比如说,之前的一般内存结构是:
这里写图片描述

那么,G1 的结构是:
这里写图片描述

也就是说,G1 把内存分成了大约 2000个左右的,大小为 1-32M 的区域。这是 G1 和之前垃圾收集器比较不同的地方。但是这些区域也遵守着新生代,老年代这些逻辑概念。

为什么称为 G1

G1 也就是 Garbage First,主要是在全局标记之后,G1 垃圾收集器可以判断出先收集哪些区域可以获得小空闲区域最高,那么就先收集这些区域,不像 CMS 等一锅端整个堆内存进行收集。正是它有一个先后的顺序,所以可以满足用户指定的停顿时间的要求。

垃圾收集过程

一般来说,会分成两种,一种是新生代 GC,也就是 Young GC;另外一种是老年代GC,老年代GC 的时候也会伴随着新生代的 GC,所以称为混合 GC,也就是 mixed GC。

新生代 GC

新生代 GC 就如下面两个图,也比较简单:

图1:

这里写图片描述

图2:

这里写图片描述

这个其实看起来是比较像复制算法的。这里要注意:

新生代 GC 是 “stop the world” 过程。

老年代 GC

会有下面几个阶段:

1、初始标记:这个过程属于 “stop the world”,是会标记内存中还存活的对象。一般这个阶段会进行一个新生代的 GC。在 log 中显示为 GC pause (young)(inital-mark)。

2、并发标记:在并发标记的过程中,如果发现有一些空的区域,如下图,那么它们在重新标记阶段就会马上被移除。

这里写图片描述

3、重新标记:这里会移除一些空的区域,并且会重新计算所有区域的活跃度。

4、复制,清除阶段:在这里会选择有最低活跃度的区域,因为这些区域最容易被垃圾收集,这些区域会作为新生代 GC 垃圾收集被回收,log 中会被标记为 :[GC pause (mixed)],所以说这里不管是新生代还是老年代都会被收集。如下图:

这里写图片描述

总的来说,在这几个阶段中:

1、关键还是要记录一个区域的活跃度,因为后续会根据这个活跃度来选择清除哪些区域。

2、在重新标记过程中,使用 Snapshot-at-the-Beginning (SATB) 算法,相比 CMS,会快很多。

3、新生代和老年代会被同时收集,并且老年代会根据活跃度来进行收集。

一般可以使用 -XX:+UseG1GC 以及 -XX:MaxGCPauseMillis=200 设置使用 G1 以及设置期望的停顿时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值