golang的垃圾回收

147 阅读1分钟
  • 栈操作比堆操作快的原因
    • 插入和删除:栈在栈顶插入和删除,效率很高
    • 读取:栈是连续分配的,堆是分散的。这样在内存中访问数据的时候,可以利用局部性原理,将相邻的数据一次性的加载到内存中
    • 读取:寻址方式不同,栈是直接寻址,堆是间接寻址。
  • 栈分配和堆分配的时机
    • 堆上:new和make产生的指针和引用类型
    • 堆上:变量所需空间太大,一般是超过了几千个字节
    • 堆上:变量的生命周期跨越了几个函数调用
    • 栈上:函数的小小的局部变量
  • 栈回收和堆回收
    • 栈回收:函数调用结束。是由编译器自动完成的
    • 堆回收:垃圾回收器决定,隔一算时间扫描一次不再引用的变量
  • 垃圾回收的三色标记
    • 白色:对象初始都是白色,代表着未扫描
    • 灰色:对象被扫描到,但是它引用的对象未被扫描
    • 本对象和已引用的对象都被扫描了
  • 垃圾回收优化
    • 新分配的堆内存不会被回收
    • 写屏障。指针在操作中告诉gc,此轮不回收
    • 辅助GC