这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
掌握
没掌握呜呜呜呜
不足
内存管理
Go 语言内存管理
内存管理 其最大的特点就是性能优化。Go这门语言抛弃了C/C++中的开发者管理内存的方式:主动申请与主动释放,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计,而不是底层的内存问题。这是Go语言成为高生产力语言的原因之一。
为什么要做性能优化?
用户体验:带来用户体验的提升
资源高效利用:降低成本,提高效率
四个阶段
向操作系统申请内存,由(Page Allocator)完成
runtime为程序分配内存,由(Object Allocator)完成
runtime为程序做垃圾回收,由(Garbage Collector)完成
向操作系统归还内存,由(Scavenger)完成
-
自动内存管理
- 动态内存
程序在运行时根据需求动态分配的内存:malloc()
- 自动内存管理(垃圾回收)
由程序语言的运行时系统管理动态内存
- 三个任务
为新对象分配空间
找到存活对象
回收死亡对象的内存空间
-
追踪垃圾的回收
- 对象回收的条件
指针指向关系不可达的对象
- 标记根对象
静态变量、全局变量、常量、线程栈等等
- 标记可达对象
求指针指向关系的传递闭包,从根对象出发,找到所有可达对象
-
清理不可达对象
-
根据对象的生命周期,使用不同的标记和清理策略
-
分代GC(Generational GC)
- 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
- GC触发条件
超过内存大小阈值
达到定时时间