垃圾收集器知识点汇总3:GC算法基础

GC算法基础

标记可达对象(Marking Reachable Objects)

首先重温一下GCROOTS,GCROOTS为Garbage Collection Roots的缩写,被指定为GCROOTS的对象包括:

  • 当前 正在执行的方法里 的 局部变量和输入参数
  • 活动线程(Active threads)
  • 内存中所有类的静态字段
  • JNI引用

GC遍历内存中的整体对象关系图,从GC根元素开始扫描,所有GC访问到的对象都会被标记为存活对象
在这里插入图片描述
执行标记期间需要暂停所有应用线程,以遍历所有对象的引用关系,这种情景叫做 全线停顿(stop the world pause),可以安全的暂停线程的点叫安全点(safe point)。标记阶段完成后,GC进行下一步操作,删除不可达对象。

删除不可达对象

GC算法在删除不可达对象时的操作可以分成三类:清除(sweeping)、整理(compacting)、复制(copying)。

清除操作

在标记-清除算法(Mark and Sweep)中所有不可达对象占用的空间被认为是空闲的,因此需要一张空闲表(free-list)来记录所有的空闲区域,以及每一个区域的大小
在这里插入图片描述
其缺陷就是维护空闲表增加了对象分配时的开销,还有就是可能没有一个区域大小能够存放需要分配的对象从而导致分配失败。

整理操作

因为内存碎片可能会引发OOM的缘故,对内存进行整理的操作应运而生,在空闲表的基础上将可达对象内存复制整理,修改指向这些对象的引用。
在这里插入图片描述
缺点是GC暂停时间会增加。

复制操作

整理操作之所以耗时是因为需要先标记完成才可以执行整理,而复制操作可以边标记边复制到存活区。
在这里插入图片描述
缺点是需要额外的内存空间作为存活区使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值