这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
自动内存管理
自动内存管理的对象是动态内存,它是程序在运行过程中根据需求动态分配的内存。在实际程序中,数组、结构体等往往都不能提前预设大小,需要动态分配。比如在c语言中就常常使用malloc()函数动态分配内存。
自动内存管理是一种垃圾回收机制,在程序运行时由系统管理动态内存(将内存管理交给系统,让我们更专注于业务逻辑),它需要保证内存的正确性和安全性。
三个任务:为新对象分配空间、找到存活对象、回收死亡对象的内存空间
1 概念
Mutator:业务线程,分配新对象,修改对象指向关系
Collector:GC线程,找到存活对象,回收死亡对象的内存空间
以及三个不同类型的GC:
Serial GC、Parallec GC、Concurrent GC
2 GC算法评价指标:
安全性(Safety)、吞吐率(Throughput) 、暂停时间(Pause time)、内存开销(Space overhead)
3 追踪垃圾回收
步骤:①标记根对象 ②标记:找到可达对象 ③清理:所有不可达对象
清理方法有很多种,需要根据对象的生命周期,采用不同的标记和清理策略。常用的清理策略:
Copying GC:将对象复制到另外的内存空间,这样原来空间就可使用;
Mark sween GC:使用free list管理空闲内存,将可用内存空间标记为free,跳过不可用空间,使得内存空间可用;
Compact GC:原地整理对象,和Copying G类似但不需要额外的空间。有一定的压缩功能
4 分代GC
分代假说:很多对象被分配后很快就不再使用。因此分代GC是将对象分为年轻对象和老年对象,分别用不同GC策略管理。
年轻对象:常规的对象分配,存活的对象少,因此采用cpoying GC,这样拷贝次数少,吞吐率高;
老年对象:倾向于一直活着,反复复制开销较大,可以采用Mark sween GC。如果碎片太多,也可以使用Compact GC。
5 引用计数
场景:每个对象都有一个与之关联的引用数目。
对象存活的条件:当且仅当引用数大于0。