16.1. 垃圾回收¶
16.1.1. 简介¶
垃圾回收(Garbage Collection, GC)指程序不用的内存空间。
满足 找到内存空间里的垃圾 + 回收垃圾,让程序员能再次利用 两项功能的程序就是GC。由John McCarthy在1960年首次发布。
16.1.2. 常用概念¶
16.1.2.1. mutator¶
用于生成对象和更新指针。
16.1.2.2. 堆¶
用于动态存放对象的内存空间,当mutator申请存放对象时,所需的内存空间就会从堆分配给mutator。
16.1.2.3. 活动对象/非活动对象¶
活动对象指能通过mutator引用的对象,非活动对象指不能通过程序引用的对象。
16.1.2.4. 分配¶
分配(allocation)在内存空间中分配对象。当没有可分配空间时,GC有两种选择:销毁所有的计算结果,输出错误信息,扩大堆,分配可用空间。
16.1.3. 评价标准¶
评价GC算法的性能,采用吞吐量、最大暂停时间、堆使用效率、访问的局部性4个标准。
其中吞吐量指单位时间内的处理能力。最大暂停时间指因执行GC而暂停执行mutator的最长时间。
16.1.4. GC算法¶
16.1.4.1. 标记 - 清除算法 (Mark Sweep GC)¶
分为标记阶段和清除阶段两个阶段。 标记阶段为对象打上标签。 collector会遍历整个堆,回收没有打上标签的对象
分配策略:
First-fit 分配找到的第一个大于等于size的分块
Best-fit 返回大于等于size的最小分块
Worst-fit 找最大的分块
优点在于实现简单,与保守式GC算法兼容。
缺点在于碎片化,分配速度慢,与写时复制技术不兼容。
16.1.4.2. 引用计数算法¶
引入计数器的概念,表示对象的人气指数。
优点在于可即刻回收垃圾,最大暂停时间短,没有必要沿指针查找。
缺点在于计数器值增减处理繁重,计数器需要占用很多位,实现烦琐复杂,循环引用无法回收。