Go垃圾回收初探

常见垃圾回收的5中经典算法

1、标记-清扫

     主要分为两个阶段,第一个阶段是扫描并标记当前活着的对象,第二阶段扫描没有被标记的垃圾对象。也就是说标记-清扫通过活着的对象推断出垃圾对象。扫描一般从栈上的根对象开始,只要对象引用了其他堆对象,就会一直向下扫描,扫描的算法可以采用深度优先搜索或广度优先搜索方式。在扫描阶段,为了有效管理扫描的对象,可以通过颜色对对象的状态进行抽象,比如经典的“三色抽象”。

      缺点:主要缺点在于可能产生内存碎片或空洞,会导致新对象分配失败。

2、标记-压缩

      标记-压缩通过将分散的、活着的对象移动到更紧密的空间来解决内存碎片问题。标记-压缩分为标记与压缩两个阶段,在压缩阶段,需要扫描活着的对象并将其压缩到空闲的区域,这可以保证压缩后的空间更紧凑,从而解决内存碎片问题。同时,压缩后的空间能以更快的速度查找到空闲的内存区域。

      缺点:内存对象在内存的位置是随机的,会破坏缓存的局部性,并且时长需要一些额外的空间来标记当前对象已经移动到了其他地方。在压缩阶段,如果X对象发生了转移,那么必须要更新所有引用X对象的指针,这增加了实现的复杂性。

3、半空间复制

      半空间复制是用空间换时间的算法,经典的半空间复制算法只能使用一般的内存空间,保留另一半的内存空间用于快速压缩内存。半空间复制的压缩性消除了内存碎片的问题,同时,其压缩时间比标记-压缩更短。半空间复制不分阶段,在扫描对象时就可以直接压缩,每个扫描到的对象都会从fromspace的空间转移到tospace空间去。所以,一旦扫描完成,压缩的副本也完成了。

      缺点:只能利用一半的内存空间。

4、引用计数

      每个对象都包含一个引用计数,每当其他对象引用了此对象时,引用技术+1,反之,取消引用后,引用计数-1,一旦引用计数为0,表明该对象为垃圾对象,需要被回收。引用计数算法简单高效,在垃圾回收阶段不需要额外的占用大量内存,即便垃圾回收系统的一部分出现异常,也能有一部分对象被正常回收。

       缺点:一些没有破坏性的操作,如只读操作、循环迭代操作也需要更新引用计数,栈上的内存操作或寄存器操作更新引用计数是难以接受的。同时,引用计数必须是原子更新,并发操作同一个对象会导致引用计数难以处理子引用对象。

5、分代GC

      分代GC指将对象按照存活时间进行划分。这种算法的重要前提是:死去的对象一般都是新创建不就的,因此,没有必要反复地扫描旧对象,这大概率会加快垃圾回收的速度,提高处理能力和吞吐量,减少程序暂停的时间。

       缺点:不能及时回收老一代的对象,并且需要额外开销引用和区分新老对象,特别是在有多代对象的时候。

Go语言采用了并发三色标记算法进行垃圾回收。

为什么不选择其他GC算法?

  • 引用计数:引用计数由于其固有的缺陷在并发时很少使用,不适合Go这样的高并发语言。
  • 压缩GC:压缩GC的主要优势是减少碎片化并且快速分配,Go语言使用了现代内存分配算法TCmalloc,虽然没有压缩算法那样极致,但它也很好的解决了内存碎片的问题。并且,由于加锁,压缩算法并不适合在并发程序中使用。
  • 分代GC:分代GC的主要假设是大部分变成垃圾的对象都是新创建的,但是由于编译器的优化,Go语言通过内存逃逸的机制将会继续使用的对象转移到了堆中,大部分生命周期很短的对象会在栈中分配,这和其他使用分代GC的编程语言不同,减弱了使用分代GC的优势。同时,分代GC需要额外的写屏障来保护并发垃圾回收时对象的隔代性,会减慢GC的速度。

Go垃圾回收演进

  1. Go1.0:单协程垃圾回收,在垃圾回收开始阶段需要停止用户协程,并且在垃圾回收阶段只有一个协程执行垃圾回收。
  2. Go1.1:垃圾回收由多个协程并行执行,大大加快了垃圾回收的速度,但这个阶段仍然不允许用户协程执行。
  3. Go1.5:该版本允许用户协程和后台的垃圾回收同时执行,大大降低了用户协程暂停的时间(300ms左右降低到40ms左右)。
  4. Go1.6:大幅度减少STW(stop the world)期间的任务,使得用户协程暂停的时间从40ms左右降低到5ms左右。
  5. G1.8:使用了混合写屏障技术消除了栈重新扫描的时间,将用户协程暂停时间降低到0.5ms左右。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值