go语言垃圾回收

川长思鸟来 2022-12-15 02:56 179阅读 0赞

概述

在c/c++当中,需要程序员自己管理内存;定义一个变量,就是在内存中开辟一段响应的空间来进行存储,而内存的容量是有限的,当不需要再使用这个变量的时候就需要销毁该对象并释放其所占的内存空间;在c/c++中释放内存需要程序员手动的进行释放。这样就显的非常的繁琐,如果有遗漏,就可能导致资源浪费甚至内存泄露

为了解决这个问题,后来开发的语言(php,java)都引入了语言层面的自动内存管理,也就是说使用者只用关心内存的申请不用关注内存的释放,内存的释放由虚拟机(virtual machine)或运行时(runtime)在自动进行管理。这种对不在使用的资源进行自动的回收功能就成为垃圾回收。

垃圾回收的由来

程序跑起来是需要内存的,栈内存是由编译器来管理的,堆内存是由程序员来管理的。因此go语言的垃圾回收就是管理堆上的内存

垃圾回收的分类

  1. 引用计数法

    • 引用计数法就是对象的引用+1,去掉引用就-1
    • 优点:简单,回收速度快
    • 缺点:需要额外的空间进行计数,无法解决循环引用的问题,频繁更新引用计数降低性能
  2. 标记删除法

    • 就是对栈上引用堆的内存一个个栈进行扫描标记,标记出未使用变量,进行清扫
    • 优点:解决了引用计数的循环引用的问题
    • 缺点:需要stw(stop the word)暂停程序运行

go垃圾回收的版本与改进

标记清除法主要有两个重要步骤,标记和清扫

go语言gc使用的三色标记法,是标记删除法的一种。

go语言gc主要几次重大的改进

  • v1版本 采用的是标记删除法;
    程序运行–> stw —> 标记和清扫 —> stw ->程序运行
  • v1.3 版本 采用标记和删除法 清扫和程序并行
    程序运行–> stw —> 标记 —> stw ->清扫、程序运行
  • 1.5 版本 三色标记删除 + 插入写屏障
  • 1.8版本 三色标记删除法+混合写屏障

go语言v1版本采用的是标记删除法,需要暂停程序进行gc,gc耗时300ms;在1.3版本进行了改进,暂停程序进行标记,清扫和程序运营并行;在1.5版本引入了三色标记删除法+插入写屏障的计数,使标记也可以程序运行同时并行,只需要开始在开始标记时候进行暂停程序和标记完成之后重新扫描栈暂停程序;在1.8版本在1.5版本的基础上使用了混合写屏障,将程序stw缩至更短。

go垃圾回收的流程(基于1.14版本)

三色标记法

混合写屏障

发表评论

表情:
评论列表 (有 0 条评论,179人围观)

还没有评论,来说两句吧...

相关阅读

    相关 垃圾回收?

    在Java 8 中,垃圾回收(Garbage Collection,GC)的基本原理和工作方式与之前版本的Java类似,但Java 8引入了一些新特性和改进来提高垃圾回收的性能

    相关 垃圾回收

    垃圾回收 > 垃圾回收主要思考三件事情: 哪种内存需要回收? 什么时候回收? 怎么回收? 对象是否存活 引用计数法 这是一种非常简单易理

    相关 垃圾回收

    标记-清除 该算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到

    相关 go语言垃圾回收

    概述 > 在c/c++当中,需要程序员自己管理内存;定义一个变量,就是在内存中开辟一段响应的空间来进行存储,而内存的容量是有限的,当不需要再使用这个变量的时候就需要销毁该

    相关 Go垃圾回收机制剖析

    Golang 从第一个版本以来,GC 一直是大家诟病最多的。但是每一个版本的发布基本都伴随着 GC 的改进。下面列出一些比较重要的改动。 v1.1 STW v1.

    相关 go强大的垃圾回收机制。

    一、C语言中返回函数中局部变量值和指针 (1) 在C语言中,一个函数可以直接返回函数中定义的局部变量,其实在函数返回后,局部变量是被系统自动回收的,因为局部变量是分配在栈空