内存垃圾回收概述

内存垃圾回收概述

了解垃圾回收首先应该明确什么是垃圾,垃圾即没有被引用但是仍然存在,占用空间的数据。然后再来看垃圾收集器,垃圾收集器(garbage collector)是一种动态内存分配器,它自动释放程序不再需要的已分配块。下面将简单介绍几种方式,即Mark Sweep、Mark Compact、Mark Copy、Reference count、Generational memory management。归类其实就是打标记、引用计数、区分生命周期管理

1.Mark Sweep

从流程看Mark-Sweep分为两个阶段:
1.Mark阶段(标记阶段)
标记阶段首先要把内存看为一张图,其开始节点也就是想寄存器、栈、.data段等,其内可以有其他数据的引用,做一次图的遍历,例如下

以上A和B是存在引用的(栈上存在数据引用他们),C为垃圾没有根节点能到达,即不可达状态,也就不会被标记。
2.Sweep阶段(清除阶段)
从Mark阶段来看所有的不可达节点都不会被Mark,在sweep时候可以检测如果没有被Mark且块Allocate的状态就可以释放掉(可以看看能不能和前后空闲块合并)
3.优缺点
优点:简单无需考虑移动后相关引用变化
缺点:属于非移动回收,产生内存碎片

2.Mark Compact

1.Mark阶段(标记阶段)
其打标记的过程和Mark-Sweep一致,都是一次图的遍历。
2.Compact阶段(整理阶段)
整理阶段其实分类比较多,内存相对顺序来说有:任意顺序(不考虑整理后数据的相对顺序)、 线性顺序(相关对象保证近)、滑动顺序(整体顺序不变)。方式的话也有如双指针法、Lisp 2。下面介绍一下简单的双指针法。

2.1双指针法介绍
双指针,两个指针我们称为start和end,一个找空闲,一个找被使用块。
第一轮:start向前扫描,end向后扫描,start找空闲块,end找非空闲块,将非空闲块数据复制到空闲块,并在原位记录转发信息。
第二轮:将引用关系修改为写入的转发关系。
优点:简单,不需要额外空间存储引用关系
缺点:会破坏线程局部性。
3.优缺点
优点:减少内存碎片
缺点:存在拷贝,影响效率

3.Mark Copy

将内存空间分成了两块,每次只使用一块,另一块用来做拷贝。
1.Mark阶段(标记阶段)
其打标记的过程和Mark-Sweep一致,都是一次图的遍历。

2.Copy阶段(拷贝阶段)
将一片空间内的存活对象全部拷贝到另一片空间,同时角色互换,考虑两个问题1.相关引用怎么一起更新(也可以和Compact一样通过转发的方式后续遍历更新) 2.角色互换的原因,因为每次都只使用一块空间,所以使用存在引用的空间。看一下前后示意图。

内存1:
FreeAllocateFreeAllocate
内存2:
FreeFreeFreeFree
图3-1 执行copy前
内存1
FreeFreeFreeFree
内存2
AllocateAllocateFreeFree
图3-2 执行copy后

3.优缺点
优点:减少内存碎片
缺点:占用双倍空间

4.Reference Count

引用计数即记录每个对象被引用的次数,为0时应该被清理,C++中shared_ptr就是使用的引用计数,但其和整个内存回收的引用计数相比比较简单。
引用计数每次新产生一个引用就给对象计数加一,但是面临的问题:
1.循环引用问题,可以通过强弱引用或者一些环的判断打断一些边来解决。
优缺点
优点:是局部的,不涉及扫描
缺点:内存碎片且容易出现内存泄露(循环引用)

5.Generational memory management

分代内存管理就是将内存按照对象生命周期来进行分类,分为两个级别,老一代和新一代,新一代触发回收后还存在的就会被放入老一代内存中,直到老一代出发回收。这样其实也面临问题:
1.老一代引用了新一代的东西,触发新一代回收时不检测老一代的东西会造成错误的回收。解决的话可以增加一张表来记录老一代的引用

优缺点
优点:分类处理,每次扫描变少,效率提高
缺点:产生一些已经应该释放却还在的对象(比如老一代的一个对象引用了新一代对象,老一代的应该被回收却还没有触发时)

6.总结

垃圾回收是各种方式的综合,分类除了生命周期外还可以根据大小来分,这样也能减少移动。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值