内存管理| 青训营笔记

65 阅读2分钟

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

掌握

没掌握呜呜呜呜

不足

内存管理

Go 语言内存管理

内存管理 其最大的特点就是性能优化。Go这门语言抛弃了C/C++中的开发者管理内存的方式:主动申请与主动释放,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计,而不是底层的内存问题。这是Go语言成为高生产力语言的原因之一。

为什么要做性能优化?

用户体验:带来用户体验的提升

资源高效利用:降低成本,提高效率

四个阶段

向操作系统申请内存,由(Page Allocator)完成

runtime为程序分配内存,由(Object Allocator)完成

runtime为程序做垃圾回收,由(Garbage Collector)完成

向操作系统归还内存,由(Scavenger)完成

  • 自动内存管理

  1. 动态内存

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

  1. 自动内存管理(垃圾回收)

由程序语言的运行时系统管理动态内存

  1. 三个任务

为新对象分配空间

找到存活对象

回收死亡对象的内存空间

  • 追踪垃圾的回收

  1. 对象回收的条件

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

  1. 标记根对象

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

  1. 标记可达对象

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

  1. 清理不可达对象

  2. 根据对象的生命周期,使用不同的标记和清理策略

  • 分代GC(Generational GC)

  1. GC流程

Stack scan:Collect pointers from globals and goroutine stacks。收集根对象(全局变量,和G stack),开启写屏障。全局变量、开启写屏障需要STW。

Mark: Mark objects and follow pointers。标记所有根对象,和根对象可以到达的所有对象不被回收。

Mark Termination: Rescan globals/changed stack, finish mark。重新扫描全局变量,和上一轮改变的stack(写屏障),完成标记工作。这个过程需要STW。

Sweep: 按标记结果清扫span

  1. GC触发条件

超过内存大小阈值

达到定时时间