Go内存管理与编译器优化 | 青训营笔记

41 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

自动内存管理

动态内存:程序在运行时根据需求动态分配的内存:malloc()

内存管理问题( 垃圾回收(GC) )

容易出现的问题:

double-free(重复释放内存)

use-after-free(使用释放过的内存)

三个任务

  • 为新对象分配空间
  • 找到存活对象
  • 回收死亡对象的内存空间

相关概念

  • Mutator:业务线程,分配新对象,修改对象指向关系
  • Collector: GC线程,找到存活对象,回收死亡对象的内存空间

GC按方式分类

  • Serial GC:只有一个collector
  • Parallel GC:支持多个collectors同时回收的GC算法
  • Concurrent GC: mutator(s)和collector(s)可以同时执行

image.png

自动内存管理算法

评价GC算法

image.png

GC算法

追踪垃圾回收(Tracing garbage collection)

回收指针指向关系不可达的对象

1.标记根对象

静态变量、全局变量、常量线程栈等

2.标记可达对象

求指针指向关系的传递闭包:从根对象出发,找到所有可达对象

3.清理不可达对象

copying CG

将存活对象复制到另外的内存空间

image.png

Mark-sweep GC

将死亡对象的内存标记为可分配

image.png

Mark-Compact GC

原地移动并整理存活对象 image.png

引用计数(Reference counting)

节点存储被引用的次数,若次数为零,则被清除 image.png

分代GC

年轻代和老年代采取不同的策略

年龄:经历过GC的次数 image.png

Go内存管理

TCmalloc

提到malloc,就不得不提google开发的大名鼎鼎的TCmalloc(Thread caching Malloc),即 线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free,new,new[]等)

image.png

From:

图解 TCMalloc - 知乎 (zhihu.com)

go内存策略

分配路径: g->m->p->mcache->mspan->memory block -> return pointer

image.png

编译器优化

编译器的结构:

image.png

这里我们学习后端的两个部分

函数内联

逃逸分析