大白话讲解G1垃圾回收器

今天和大家分享一下G1垃圾回收器的工作原理及相较CMS垃圾回收器的优势

1.G1垃圾回收器简介

  和ParNew+CMS垃圾回收器的组合不同,G1垃圾回收器是可以同时回收新生代和老年代内的垃圾对象的,他不需要两个垃圾回收器协同运作,一个人就可以将所有的垃圾对象回收。他相较于ParNew+CMS,最大的特点就是会将java的堆内存拆分成多个大小相等的Region。虽然G1也有年轻代和老年代的区分,但也只是在概念上区分。可以理解为G1将一部分的Region划分为年轻代,然后将另一部分划分成了老年代,如下图:
在这里插入图片描述
  G1还有一个特点,就是可以让我们设置一个垃圾回收器预期的停顿时间,也就是stop the world时间。比如我们可以设置,在一小时内,G1的stop the world时间不能超过1分钟。看到这里大家应该可以明白G1相较于ParNew+CMS的优化点在哪里了吧。G1优化的主要点就是尽可能的减少MinorGC和FullGC,尽可能的减少GC带来的系统停顿。

2.G1是如何做到stop the world时间可控的呢?

  G1之所以能做到回收时间可控,主要是得益于Region这个结构。G1会记录每个Region里的对象有多少是垃圾对象,如果要对某个Region进行垃圾回收,他会计算出对该Region回收的时间,可以回收多少垃圾。

我给大家举个例子,例如下图所示:
在这里插入图片描述
  G1通过追踪发现,现在新生代有两个Region,第一个Region存储了10M的垃圾对象,回收大约耗时1s,另外一个是20M,回收大概是200ms,然后再垃圾回收的时候,G1会发现在最近的一个时间段内,比如一小时内,垃圾回收已经导致几百毫秒的停顿了,现在又要执行一次垃圾回收,那么必须是回收上图中那个只要200ms的就能回收调20M的垃圾啊,于是G1出发垃圾回收,虽然可能导致200ms的停顿,但是一下回收了更多的垃圾。

  所以G1可以做到让你来设定垃圾回收的系统的影响,G1通过把内存拆分成大量的Region,以及记录Region中可以回收对象的大小和时间,以至于再垃圾回收的时候,尽量在设定的时间内,尽可能多的回收更多的垃圾对象。

3.Region的归属不是固定的

  在G1中,每一个Region都可能属于新生代,也可能属于老年代。
  刚开始的时候,Region可能不属于新生代也不属于老年代,但是过段时间之后,被G1分配给了新生代,然后放了很多新生代的对象。在经历了垃圾回收之后,可能下一次同一个Region又被分配给了老年代,用来存放老年代的长生存周期的对象。
  因此,在G1垃圾回收器中,没有给新生代和老年代分配多大内存的设定,他们各自的内存大小是在不停变动的,都是由G1控制。

总的来说,G1垃圾回收器,相较于ParNew+CMS垃圾回收器,最大的特点就是,G1可以根据设定的预期stop the world时间,来选择最少回收时间和最多回收对象的Region进行垃圾回收,在保证GC对系统停顿的可控时间内,同时还会尽可能的回收最多的对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值