这是我参与「第五届青训营」伴学笔记创作活动的第5天
一、性能优化
1.1 优化层面
1.1.1 业务层优化
- 特定场景,具体分析
- 易获得较大收益
1.1.2 语言运行时优化
- 更通用的性能问题:内存分配、编译器优化
1.1.3 数据驱动
- 自动化性能分析工具:pprof
- 依靠数据而非猜测
二、自动内存管理
概念
- 动态内存:程序运行时根据需要动态分配的内存
- 自动内存管理(垃圾回收):程序运行时由系统回收动态内存
追踪垃圾回收
- 回收条件:指针指向不可达的对象
- 回收流程:
- 标记根对象:静态变量、全局变量、常量、线程栈。这些是在程序运行时都可能使用的。
- 标记可达对象:从根对象出发,找到所有可达对象,要根据指向对象找到传递闭包。
- 清理所有不可达对象:
- Copying GC:把原来的内存空间中的标记对象copy到另一块内存空间
- Mark-sweep GC:把非存活对象内存标记为可分配
- Makr-compact把存活对象移动至内存空间的开头
根据不同的生命周期使用不同的策略
根据对象经历GC次数,分为年轻和老年对象,分别放在不同heap区域,制定不同的GC策略
-
年轻代
- 常规对象分配,生命周期不长,内存大小偏小,可以直接copy
- copying GC
-
老年代
- 因为生命周期长,反复复制开销大,采用Mark-sweep GC
GO内存管理及优化
内存分配
分块
为了方便为对象分配最合适的内存,程序会先向OS申请一大块内存,然后分成大块(mspan),再按块细分为特定大小的小块。
缓存
申请内存流程:g -> m -> p -> mspans -> mcentral