浅谈Go与习题(二十九)

52 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情

今天来学习下Go常见的习题问题(二十九),也是面试中可能会遇到的,让我们来一起学习吧~

垃圾回收

垃圾回收顾名思义,对程序中不再使用的内存资源进行自动回收,(Garbage Collection,缩写为GC),是一种自动内存管理机制

  1. 引用计数法 对每个对象增加一个引用计数,当被引用对象被创建或者被其他对象引用的时候自动加一,引用自己的对象被回收销毁的时候计数减一,当引用数为0的对象是可以被回收销毁的,多用于实时性比较高的、内存紧张的情况下
  • 优点:回收快,方法简单
  • 缺点:需要额外的空间存放计数,无法处理循环引用(a.c= c, c.a=a),频繁更新引用计数操作会影响性能
  1. 标记清除法 判断一个对象是否可达,如果一个对象访问不到了那么就可以立即被回收处理,如何判断是否可达呢?可以从根节点出发开始找全局变量和当前函数的变量,访问到的都可以标记上可达,没有被标记的会进行回收
  • 优点:解决了引用计数法存在的循环引用问题,占用空间少
  • 缺点:无法立刻识别垃圾对象,需要启动STW(stop the world)暂停程序运行,会被其他线程修改当前状态,会产生一大片不连续的内存空间,会导致立刻启动新的GC操作

三色标记法

在暂停程序的情况下,使用三色标记清除法,将对象分为三种对象:白色、灰色、黑色

  • 白色对象:潜在的回收的对象,还未被标记的对象
  • 灰色对象:正在执行的对象,正在等待搜索完成的对象,可能存在指向白色对象的外部指针,所以会继续扫描子对象
  • 黑色对象:完成扫描的对象,不存在任何引用外部指针的对象

清除步骤:

  • 初始所有对象都是白色
  • 从root节点出发,扫描可达对象标记为灰色,进入队列
  • 从队列中取出一个灰色对象标记为黑色,并把其子对象的引用标记为灰色,加入队列
  • 重复第三步,直到灰色队列为空
  • 删除剩余白色对象

总结

今天浅谈了Go的习题(二十九),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!