go——GC垃圾回收机制

  1. go语言中内存被分成几份区域,其中包括栈和堆,栈主要用于存储函数的局部变量和其他信息,他的大小在程序运行期间是固定的。堆用于存储动态分配的对象,进程中的所有线程共享一个堆区,所以需要考虑线程安全问题。
  2. 堆和栈的区别
    1. 存储方式
      • 栈是线性数据结构、采用先进后出的方式存储数据。栈通常用于存储函数的局部变量、函数的参数,栈上的存储空间是有限且固定的,由编译器和操作系统控制。
      • 堆是树型数据结构,用于动态分配和管理内存,堆内存的大小根据需要动态调整,通常比栈大,用于存储复杂的数据结构
    2. 生命周期
      • 栈中数据的生命周期与其作用域有关,当变量离开作用域时会自动回收内存。
      • 堆中数据的生命周期通常有程序员自己控制
    3. 访问速度
      • 栈中数据访问速度相对较快,因为栈是线性数据结构,内存分配是连续的。
      • 堆中数据访问速度相对慢,因为内存分配是随机的,且堆的管理需要一定的开销。
      • 为什么连续的内存分配访问速度快
        访问数据时先检查缓存中是否存在,如果不存在则在内存中查找数据。连续内存分配可以提高缓存的命中率,有效的利用缓存,随机分配的内存缓存利用率低,所以栈比堆访问速度快
    4. 分配方式
      • 栈上的内存分配是静态的,编译器在分配前就知道大小
      • 堆上的内存分配是动态的,需要在运行时根据需求进行分配
  3. 内存逃逸
    1. 目的:用于用于决定内存存放到栈中还是堆中
    2. 内存逃逸判断条件:
      1. 如果函数外部没有引用则分配到栈中
      2. 如果函数外部有引用则分配到堆中
      3. 如果栈上放不下,则放到堆中
      4. 只要是指针变量都会在堆上分配,所以对于小变量我们还是传值效率(而不是指针)更高一点
    3. 查看逃逸情况命令 go build -gcflags=-m main.go
  4. STW
  5. GC 更新过程
    1. 标记清除(Go版本 V1.3 之前)
    2. 三色标记法(Go版本 V1.5)
    3. 三色标记法+混合写屏障机制(Go版本 V1.8)
posted @ 2024-09-03 13:45  你看起来真的很好吃  阅读(8)  评论(0编辑  收藏  举报