内存管理 | 青训营笔记

68 阅读3分钟

这是我参加「第五届青训营」笔记创作活动的第三天

一、概述

内存管理
静态分析

二、内存管理

自动内存管理GC

自动内存管理(垃圾回收):程序语言运行时由系统自动回收动态内存

垃圾回收主要任务:

1、为新对象分配空间
2、找到存活对象
3、回收死亡对象的内存空间

Mutator:业务线程,主要用于分配对象空间,修改对象指向关系

Collector:GC线程,寻找存活对象,回收对象空间

Serial GC:只有一个GC线程用于回收
Parallel GC:多个GC线程
Concurrent GC:Mutator线程和Collector线程能够同时执行

评价GC算法的指标:安全性、吞吐率、暂停时间以及内存开销

GC算法主要有:追踪垃圾回收、引用计数

追踪垃圾回收

标记根对象(全局变量、静态变量、常量以及线程栈),通过指针标记所有可达对象,回收不可达对象

根据对象生命周期的不同,采取不同的垃圾回收策略

1、复制所有存活对象到另外的内存空间
2、标记所有死亡对象的内存空间为可分配内存
3、移动整理所有存活对象

分代GC:

每个对象GC的次数,为对象分配年龄
对年轻和老年的对象采取不同的垃圾回收策略
  • 年轻代存活对象数量少,采取复制策略
  • 老年代经过多轮GC依旧存活,继续存活的可能性较高,采用标记内存空间策略

引用计数

每个对象都有与之关联的引用数目,当引用计数归零时回收内存空间

优点:
无需关心runtime实现细节
内存管理操作在程序执行过程中
缺点:
开销较大,需要保证对引用计数的原子操作
环形结构无法回收
内存开销较大

Go内存管理

提前将内存分块,根据对象的大小选择合适的块返回

采用多级缓存的结构进行内存分配

Balanced GC

由于对象分配非常频繁且小对象占比高,可以提前向os申请一块大的内存空间(1KB)--GAB
对于小对象的内存分配,直接在GAB上进行,无需经过原流程

由于GAB本质上是一块一次性申请的大空间,当GAB上的小对象仅占极少部分空间时,其余内存空间仍不能释放,导致内存浪费问题

解决方法:将GAB上的小对象复制到其他有空余内存空间的GAB上,原GAB空间可以释放

二、静态分析

静态分析:不执行代码,推导程序行为

控制流:程序运行的流程
数据流:数据在控制流上的传递
过程内分析:仅在函数内部分析
过程间分析:需要考虑函数调用时参数传递和返回的数据流和控制流

go编译器优化:

  • 函数内联

  • 逃逸分析