GC--算法详解

GC算法概述

在这里插入图片描述

JVM进行GC和Full GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是新生代。因此,GC按照回收的区域又分成了两种类型,一种是普通GC(mimor GC),一种是全局GC(major GC or Full GC)。

minor Gc和Full GC的区别:

  • 普通GC(Minor GC):只针对新生代区域的GC,指发生再新生代的垃圾收集动作,因为大多数Java对象存活率都不高,所以Minor GC非常频繁,一般回收速度也比较快。
  • 全局GC(major Gc or Full GC):指发生在老年代的垃圾收集动作,出现了Major GC,经常会伴随至少一次的Minor GC(但并不绝对)。Major GC的速度一般比Minor GC慢10倍以上。

引用计数法

每个对象都有一个引用计数器,当对象被引用一次则计数器加1,当对象引用失效一次,计数器减1,对于计数器为0的对象意味着是垃圾,可以被GC回收。

应用:微软的COM、ActionScript3、Python等等

在这里插入图片描述

缺点:

  • 每次对对象赋值时都要维护计数器,且计数器本身也有一定消耗;
  • 较难处理循环引用;

循环引用示例:

在这里插入图片描述
JVM的实现一般不采用这种方式。

复制算法(Copying)

HotSPot JVM把年轻代分为了三个部分:1各Eden区和2各Survivor区(分别较from和to)。默认比例是8:1:1,一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移动到Survivor区。对象再Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到老年代中。因为年轻代中的对象基本都是朝生夕死(90%),所以再年轻代的垃圾回收算法使用的是复制算法

复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

在这里插入图片描述

在GC开始的时候,对象只会存在于Eden区和名为『from』的Survivor区,Survivor区『to』是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到『to』,而在『from』区中,仍存活的对象会根据他们的年龄值来就决定去向。年龄没有达到阈值的对象会被复制到『to』区域。经过这次GC后,Eden区和from区已经被清空。这个时候,『from』和『to』会交换他们的角色,也就是新的『to』就是上次GC前的『from』,新的『from』就是上次前的『to』。 不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到『to』区被填满,『to』区被填满之后,会将爱那个所有对象移动到老年代中。

在这里插入图片描述

因为Eden区对象存活率较低,一般的,使用两块10%的内存作为空间和活动区间,而另外80%的内存,则是用来给新建对象分配内存的。一旦发生GC,将10%的from活动区间与另外80%中存活的eden对象转移到110%的to空间,接下来,将之前90%的内存全部释放,以此类推。

复制算法的缺点:

  • 它浪费了一半的内存;
  • 如果对象的存活率很高,假如是100%存活,那么我们需要将所有对象都复制一遍,并将所有引用地址重置一遍。复制这一工作所花费的时间,在对象存活率达到一定程度时,将会变得不可忽视。所以从以上描述不难看出,复制算法想要使用,最起码对象的存活率要非常底才行,而且最终要的是,我们必须要客服50%内存的浪费。

标记清除(Mark-Sweep)

当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被触发并将程序暂停,随后将要回收的对象标记一遍,最终统一回收这些对象,完成标记清理工作,再让程序恢复运行。

算法分成标记和清除两个阶段,先标记出要回收的对象,然后统一回收这些对象。
在这里插入图片描述

老年代一般是由标记清除或者是标记清除与标记整理的混合实现。

优点:
不需要额外空间

缺点:

  • 两次扫描,耗时严重
  • 会产生内碎片

标记压缩(Mark-Compact)

在这里插入图片描述

在整理压缩阶段,不再对标记的对象做回收,而是通过所有存活对象都向一端移动,然后直接清除边界以外的内存。可以看到,标记的存活对象将会被整理,按照内存地址一次排列,而未被标记的内存会被清理掉。

优点:
没有内存碎片

缺点:
需要移动对象的成本(耗时)

总结

内存效率:

复制算法>标记清除>标记整理

内存整齐度:

复制算法=标记整理>标记清除

内存利用率:

标记整理=标记清除>复制算法

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值