JAVA 中GC(垃圾处理器)

一、GC作用区域

在这里插入图片描述
**注意:**主要作用域堆区域
1.JVM在进行GC的时间,不是统一回收三个堆里面得子区域(新生区、幸存区(from to)、老年区);
2.GC种类:轻GC和重GC(作用域可以看我前一篇JVM基础

二、GC的算法

1.标记清除法

1.标记阶段:
从根对象(如全局变量、活动栈等)开始,遍历内存中的所有可访问对象,并将它们标记为"活动"状态。
所有可达的对象都会被标记,而不可达的对象则不会被标记。
2.清除阶段:
在标记阶段完成后,遍历整个堆内存,将未标记的对象视为"垃圾",并将其回收。
回收的内存会被重新分配给新的对象使用。
3.优缺点:
优点:相对简单高效,不需要额外的内存开销来维护其他数据结构。
缺点:会产生内存碎片,因为回收的内存是分散的,不连续的。同时,在清除阶段会暂停程序的运行,可能引起延迟。
4.工作原理:
标记清除法通过追踪对象之间的引用关系,找到所有可访问的对象,将其标记为活动对象。然后,清除阶段会回收未标记的对象所占用的内存空间。这个过程可以保证不再使用的内存得到回收,避免内存泄漏问题。
在这里插入图片描述

2.复制算法(作用于年轻代(轻GC))

1.工作原理:
复制算法将堆内存分为两块,通常称为"From"空间和"To"空间。
在进行垃圾回收时,首先将所有存活对象从"From"空间复制到"To"空间中。
然后,将"From"空间中的所有对象视为垃圾,直接进行内存清理,不需要标记和压缩操作。
2.优缺点:
优点:解决了标记清除算法可能产生的内存碎片问题,因为存活对象会被紧凑地复制到新的内存空间中。
不需要进行标记和压缩阶段,简化了整个垃圾回收过程,降低了延迟。
缺点:需要额外的内存空间来存储复制后的存活对象,因为整个"From"空间不能被立即释放。
对于存活对象较多的情况,复制算法可能会增加存储开销。
3.工作流程:
复制算法通过复制存活对象到新的内存空间中,并更新引用关系,达到垃圾回收的目的。
一般来说,复制算法会交换"From"空间和"To"空间的角色,以便下一次的垃圾回收
在这里插入图片描述

3.标记压缩

1.标记阶段:
从根对象开始,标记出所有活动对象。
2.清除阶段:
遍历整个堆内存,将未标记的对象视为垃圾,并进行回收。
3.压缩阶段:
在清除阶段之后,将所有存活的对象向堆内存的一端移动,以便将它们紧凑地排列在一起。
这样做可以消除内存碎片,使得内存空间更加连续,提高内存的利用率。
4.优缺点:
优点:通过内存压缩,可以解决标记清除算法可能产生的内存碎片问题,提高内存的利用效率。
缺点:在压缩阶段需要移动存活对象的过程中,会增加一定的开销,可能导致一些延迟。
5.工作原理:
标记压缩算法在标记清除的基础上增加了内存压缩的步骤,通过将存活对象向一端移动,实现内存的紧凑排列。
这样做既可以回收内存,又可以保持内存空间的连续性,提高内存使用效率。
在这里插入图片描述

4.引用计数器(JVM不推荐)

我们有一系列对象,当对象被使用就会加1,当应用为零的时间就会被清理掉。
**缺点:**每一个对象都需要计数器,计数器本身就会有消耗,当我们代码进入死循环就会出现对象永久有效
在这里插入图片描述
不足之处望海涵。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值