GC垃圾回收算法

本文介绍了Java垃圾回收机制,包括新生代、幸存区、老年代和元空间的内存划分。详细讲解了引用计数法、复制算法、标记清除法和标记压缩法四种垃圾回收算法的工作原理、优缺点,并对比了它们的内存效率、内存整齐度和内存利用率。最后,总结了GC在不同代际中如何选择合适的算法。
摘要由CSDN通过智能技术生成

描述

什么是垃圾回收

  • 垃圾回收机制是一种自动的回收机制,它回收的内容位于方法区和堆内存中

堆的组成:

  • 新生代
  • 幸存区
  • 老年代
  • 元空间

垃圾回收流程

  • 第一次的垃圾回收会在Eden区做处理,存活下来的进入到幸存区,此时Eden区被清空。幸存区from和to的区分标准是谁空谁是to。
  • 第二次垃圾回收会把Eden区存活的对象放到to中,from上次保存的对象也放到to中。到此原来的from变成to,原来的to变成from
  • 默认情况下当一个对象经历了15次GC都没有死,就会进入到养老区。也可以通过-XX:MaxTenuringThreshold参数来调节这个参数
    在这里插入图片描述

算法

引用计数法

  • 它会给堆中的每个对象计数。最好使用次数的对象会先被GC回收
  • 这种算法jvm中用的非常少了,因为每一个对象都有一个记数器,对象多了非常影响性能
  • 在这里插入图片描述

复制算法

  • 复制算法用于对象存活度低的新生区。它的含义是GC时伊甸区的内容给了幸存区,幸存区的to和from对象交换的原理。
  • 好处是GC到幸存区后空间一分为二,没有内存碎片
  • 坏处是极端情况下,对象100%存活,始终有一半的to空间是无法存储对象的。浪费了内存空间
  • 在这里插入图片描述

标记清除法

  • 复制算法会出现空间浪费的情况。标记清除法试图解决这个问题。它的原理是扫描第一次标记哪些对象存活,扫描第二次标记哪些对象要被清除
  • 优点:不需要额外空间
  • 缺点:两次扫描会浪费时间,并且对一个个无序的小块标记,中间会产生内存碎片
    在这里插入图片描述

标记压缩法

  • 压缩法在清除法的基础上又进行了一次扫描,把存活的对象进行了排序,解决了内存碎片问题,但多扫描一次增加了时间成本。
    在这里插入图片描述

算法比较

内存效率(时间复杂度):

  • 复制算法>标记清除算法>标记压缩算法

内存整齐度:

  • 复制算法 = 标记压缩算法>标记清除算法

内存利用率:

  • 标记压缩算法>标记清除算法>复制算法

总结:GC是一个分代的垃圾回收机制,年轻代存活率低时候用复制算法,老年代存活率高适合于标记清除算法+标记压缩算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值