golang-内存管理-GC回收

本文详细探讨了Go语言中的垃圾回收机制,包括GC原理、引用计数、标记-清除、复制收集、标记-整理算法,特别聚焦于Golang的三色标记法及其问题、屏障机制,以及GC触发条件和性能调优策略。

1.什么是 GC?

垃圾回收(GC)是编程语言中提供的内存管理功能。有自动和手动两种方式。
在应用程序中会使用到两种内存,分别为堆(Heap)和栈(Stack),GC 负责回收堆内存,而不负责回收栈中的内存。那么这是为什么呢?主要原因是栈是一块专用内存,专门为了函数执行而准备的,存储着函数中的局部变量以及调用栈。除此以外,栈中的数据都有一个特点——简单。比如局部变量不能被函数外访问,所以这块内存用完就可以直接释放。正是因为这个特点,栈中的数据可以通过简单的编译器指令自动清理,并不需要通过 GC 来回收。

根对象

  • 全局变量
  • 执行栈:每个协程有自己的执行栈,包含执行栈变量,分配堆内存的指针等。
  • 寄存器

2.GC 算法的种类

2.1.引用计数

对每个对象维护一个引用计数,当引用对象的对象被销毁时,引用计数-1,如果引用计数为0,则进行垃圾回收。
在这里插入图片描述

优点:回收速度快,对象可以很快的被回收,不会出现内存耗尽或达到某个阀值时才回收。
缺点:不能很好的处理循环引用,而且实时维护引用计数,有也一定的代价,频繁更新引用计数降低了性能。

2.2.标记-清除

该方法分为两步,标记从根变量开始迭代得遍历所有被引用的对象,对能够通过应用遍历访问到的对象都进行标记为“被引用”;标记完成后进行清除操作,对没有标记过的内存进行回收(回收同时可能伴有碎片整理操作)。即:从根变量开始遍历所有引用的对象,引用的对象标记为"被引用",没有被标记的进行回收。
在这里插入图片描述
优点:解决了引用计数的缺点。
缺点:需要STW,即要暂时停掉程序运行,回收同时可能伴有碎片整理操作。
代表语言:Golang(其采用三色标记法)

2.3.复制收集

解决效率问题,“复制”收集算法出现了。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。
它的主要缺点有两个:
(1)效率问题:在对象存活率较高时,复制操作次数多,效率降低;
(2)空间问题:內存缩小了一半;需要額外空间做分配担保(老年代)

复制收集算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。复制收集的方式只需要对对象进行一次扫描。从根对象开始对对象进行扫描,如果存在对这个对象的引用,就把它复制到新空间中。一次扫描结束之后,所有存在于新空间的对象就是所有的非垃圾对象。
标记清除的方式节省内存但是两次扫描需要更多的时间,复制收集更快速但是需要额外开辟一块用来复制的内存,对垃圾比例较大的情况占优势
在这里插入图片描述

在复制收集的过程中,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值