Java 分代式GC与G1算法

前言:最近浏览了不少分代式GC和G1算法的文章,好多文章的知识点都比较分散,要几篇文章结合起来对比才能明白,特别是R大的文章,很精辟但不好理解,这里我就把我最近收集并结合自己理解的有关分代式GC和G1算法的知识分享一下
这里放一下我感觉写的比较好的文章链接
G1介绍 R大
G1介绍
java GC为什么要分代

GC分代

年轻代(Young Generation)

对象被创建时,内存的分配首先发生在年轻代(大对象可以直接 被创建在年老代),大部分的对象在创建后很快就不再使用,因此很快变得不可达,于是被年轻代的GC机制清理掉(weak generational hypothesis 大部分对象die young,而没有die young的对象往往会live long),这个GC机制被称为Minor GC或叫Young GC。
注意:Minor GC并不代表年轻代内存不足,它事实上只表示在Eden区上的GC。

由于绝大部分的对象都是短命的,甚至存活不到Survivor中,所以,Eden区与Survivor的比例较大,HotSpot默认是 8:1,即分别占新生代的80%,10%,10%。如果一次回收中,Survivor+Eden中存活下来的内存超过了10%,则需要将一部分对象分配到老年代。用-XX:SurvivorRatio参数来配置Eden区域Survivor区的容量比值,默认是8,代表Eden:Survivor1:Survivor2=8:1:1.

什么情况会导致YGC的发生?最常见的情况是在年轻代分配内存时,出现空间不足,这里的内存分配,有可能是TLAB(后序讲解),也有可能是一个对象(该对象在TLAB中放不下,但虚拟机不想重新申请TLAB,就在Eden区分配)

年轻代上的内存分配是这样的,年轻代可以分为3个区域:Eden区和两个存活区(Survivor 0 、Survivor 1)

  • 绝大多数刚创建的对象会被分配在Eden区,其中的大多数对象很快就会消亡。Eden区是连续的内存空间,因此在其上分配内存极快;

  • 当Eden区满的时候,执行Minor GC,将消亡的对象清理掉,并将剩余的对象复制到一个存活区Survivor0(此时,Survivor1是空白的,两个Survivor总有一个是空白的);

  • 此后,每次Eden区满了,就执行一次Minor GC,并将剩余的对象都添加到Survivor0;

  • 当Survivor0也满的时候,将其中仍然活着的对象直接复制到Survivor1,以后Eden区执行Minor GC后,就将剩余的对象添加Survivor1(此时,Survivor0是空白的)。

  • 当两个存活区切换了几次(HotSpot虚拟机默认15次,用-XX:MaxTenuringThreshold控制,大于该值进入老年代)之后,仍然存活的对象(其实只有一小部分,比如,我们自己定义的对象),将被复制到老年代。

Eden区是连续的空间,且Survivor总有一个为空。经过一次GC和复制,一个Survivor中保存着当前还活着的对象,而Eden区和另一个Survivor区的内容都不再需要了,之后分配内存时直接覆盖,到下一次GC时,两个Survivor的角色再互换。因此,这种方 式分配内存和清理内存的效率都极高,这种垃圾回收的方式就是著名的**“停止-复制(Stop-and-copy)”清理法**

BTP & TLAB

HotSpot虚拟机使用了两种技术来加快内存分配。分别是

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值