Golang GC垃圾回收机制理解记录

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、概念

对不再使用的是内存资源进行自动回收的功能就叫垃圾回收GC: Garbage Collection

二、为什么要有垃圾回收

编程语言需要对内存手动释放操作繁琐处理不好会出现内存泄漏垃圾回收出现使的开发者能更专注于业务逻辑减少额外维护负担。

三、垃圾回收的快速发展

版本

GC算法

v1.1

STWStop the world

v1.3

Mark STWSweep标记清除

v1.5

三色标记

v1.8

三色标记+写屏障

四、go V1.3之前 采用的gc是标记回收法mark&sweep

五、go V1.5 采用的gc 三色标记

六、 GC 触发条件

  1. 当前内存分配达到一定比例则触发超过了内存大小阈值。

  1. 两分钟没有触发过 GC 则触发 GC

  1. 手动触发调用 runtime.GC()

七、不能被GC的情况

阻塞状态是go调度的一个待唤醒的状态是不能被gc的

常见的垃圾回收方法

  • 引用计数对每个对象维护一个引用计数当引用该对象的对象被销毁时引用计数减1当引用计数器为0是回收该对象。
    优点对象可以很快的被回收不会出现内存耗尽或达到某个阀值时才回收。
    缺点不能很好的处理循环引用而且实时维护引用计数有也一定的代价。
    代表语言Python、PHP

  • 标记-清除从根变量开始遍历所有引用的对象引用的对象标记为"被引用"没有被标记的进行回收。
    优点解决了引用计数的缺点。
    缺点需要STW即要暂时停掉程序运行。
    代表语言Golang(其采用三色标记法)

  • 分代收集按照对象生命周期长短划分不同的代空间生命周期长的放入老年代而短的放入新生代不同代有不能的回收算法和回收频率。
    优点回收性能好
    缺点实现复杂
    代表语言 JAVA

参考链接

https://blog.csdn.net/qq_33690342/article/details/113685490

https://studygolang.com/articles/25096

虽然有GC帮我们做内存管理但资源毕竟是有限的如果内存持续上涨说明程序必然有问题。就需要借助性能能分析工具pproftrace 等工具来分析解决优化代码或者架构数据库设计等多个方面来优化。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go