GC垃圾回收

垃圾回收的区域

JVM在进行GC时,并不是对这三个区域统一回收,大部分的时候,回收都是新生代

  • 新生区

  • 幸存区

  • 老年区

GC种类:

  • 轻GC(普通的GC)

  • 重GC(全局的GC)

GC题目:

  • JVM的内存模型和分区,详细到每个区放什么?

  • 堆里面的分区有哪些?Eden,from,to,老年区,说说他们的特点

  • GC的算法有哪些?怎么用?

    • 标记清除法

    • 标记压缩

    • 复制算法

    • 引用计数器

  • 轻GC和重GC分别是在什么什么时候发生?

复制算法

        为了解决标记清除算法的内存碎⽚问题,就产⽣了复制算法。复制算法将内存分为⼤⼩ 相等的两半,每次只使⽤其中⼀半。垃圾回收时,将当前这⼀块的存活对象全部拷⻉到另⼀半,然 后当前这⼀半内存就可以直接清除。这种算法没有内存碎⽚,但是他的问题就在于浪费空间。⽽ 且,他的效率跟存活对象的个数有关。

  • 好处:没有内存的碎片
  • 坏处:浪费了内存空间(多了一半空间to永远是空)。假设对象100%存活(极端情况),不适合使用复制算法

使用场景

        复制算法最佳使用场景:对象存活度较低的时候(新生区)

标记清除算法

        a. 标记阶段:把垃圾内存标记出来

        b. 清除阶段:直接将垃圾内存回收。

         c. 这种算法是⽐较简单的,但是有个很严重的问题,就是会产⽣⼤量的内存碎⽚。

  • 优点:不需要额外的空间
  • 缺点:两次扫描,严重浪费时间,会产生内存碎片

标记压缩算法

        为了解决复制算法的缺陷,就提出了标记压缩算法。这种算法在标记阶段跟标记清除算法是⼀样的,但是在完成标记之后,不是直接清理垃圾内存,⽽是将存活对象往⼀端移动,然 后将边界以外的所有内存直接清除

        可以进行多次标记清除,再进行一次压缩

GC算法总结

        内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
        内存整齐度:复制算法=标记压缩算法>标记清除算法
        内存利用率:标记压缩算法=标记清除算法>复制算法

  思考一个问题:难道没有最优算法吗?
        答案:没有,没有最好的算法,只有最合适的算法——》GC:分代收集算法

年轻代:

  • 存活率低
  • 复制算法

老年代:

  • 区域大:存活率高
  • 标记清除(内存碎片不是太多)+标记压缩混合实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值