【教3妹学java】13.垃圾回收算法有哪些?

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 
坚持不懈,越努力越幸运,大家一起学习鸭~~~

3妹

2哥:3妹,在干什么呢。
3妹:我在学习呢, 这不是最近工作中用到Java了嘛,要抓紧时间上手了。
2哥:学习的怎么样啦?不用的话我倒是可以指点指点。
3妹:还真有点搞不懂,这个JVM垃圾回收算法,你给我讲讲呗。
2哥:可以是可以,我有什么好处呢?
3妹:好啦,我学会了后请你吃饭怎么样?
2哥:就等你这句呢,我要吃北京烤鸭!
3妹:可以!

讲课

垃圾回收算法一般有四种

垃圾回收算法

标记-清除算法

就是对要回收的对象进行标记,标记完成后统一回收。(CMS垃圾收集器使用这种)

缺点:

  • 效率不稳定

  • 执行效率不稳定,有大量对象时,并且有大量对象需要回收时,执行效率会降低。

  • 内存碎片化

内存碎片化,会产生大量不连续的内存碎片。(内存碎片只能通过使用分区空闲分配链表来分配内存)

标记-复制算法

就是将内存分为两块,每次只用其中一块,垃圾回收时将存活对象,拷贝到另一块内存。(serial new,parallel new和parallel scanvage垃圾收集器)

缺点:

  • 不适合存活率高的老年代

  • 存活率较高时需要很多复制操作,效率会降低,所以老年代一般不使用这种算法。

  • 浪费内存

会浪费一半的内存,

解决方案是新生代的内存配比是Eden:From Survivor: To Survivor = 8比1比1

每次使用时,Eden用来分配新的对象,From Survivor存放上次垃圾回收后存活的对象,只使用Eden和From Survivor的空间,To Survivor是空的,垃圾回收时将存活对象拷贝到To Survivor,当空间不够时,从老年代进行分配担保。

标记-整理算法

标记-整理算法跟标记-清除算法适用的场景是一样的,都是用于老年代,也就是存活对象比较多的情况。标记-整理算法的流程就是让存活对象往内存空间一端移动,然后直接清理掉边界以外的内存。(parallel Old和Serial old收集器就是采用该算法进行回收的)

吞吐量高

移动时内存操作会比较复杂,需要移动存活对象并且更新所有对象的引用,会是一种比较重的操作,但是如果不移动的话,会有内存碎片,内存分配时效率会变低,所以由于内存分配的频率会比垃圾回收的频率高很多,所以从吞吐量方面看,标记-整理法高于标记-清除法。

延迟高

但是由于需要移动对象,停顿时间会比较长,垃圾回收时延迟会高一些,强调低延迟的CMS收集器一般是大部分时候用标记-清除算法,当内存碎片化程度达到一定程度时,触发Full GC,会使用标记-整理算法清理一次。

分代收集算法

弱分代假说:就是绝大部分对象都是朝生夕灭。
强分代假说:熬过越多次垃圾收集的对象就越难以消忙。

就是现在的系统一般都比较复杂,堆中的对象也会比较多,如果使用对所有对象都分析是否需要回收,那么效率会比较低,所以有了分代收集算法,就是对熬过垃圾回收次数不同的对象进行分类,分为新生代和老年代,采用不同回收策略。

新生代存活率低,使用标记-复制算法。新生代发生的垃圾收集交Minor GC,发生频率较高

老年代存活率高,使用标记-清除算法,或者标记-整理算法。(CMS垃圾收集器一般是多数时间采用标记-清除算法,内存碎片化程度较高时,使用标记-整理算法收集一次)。老年代内存满时会触发Major GC(Full GC),一般触发的频率比较低。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值