3 垃圾回收
3.1 内存管理机制
什么是空间分配?
分配器提供一组块的内存抽象
为什么动态内存分配?
程序通常不知道数据结构的大小,直到程序实际运行
动态内存分配的类型
- 显式:malloc free
C - 隐式/自动:应用程序分配,但不释放
在 Java、Lisp 或 ML 中垃圾回收
垃圾回收特点
- 自动回收堆分配的存储
- 隐式内存管理(Java),不用free
- 延迟处理,仅在需要时才重新组织垃圾回收
分配器
分配器作用/功能
- 维护进程虚拟内存(称为堆)的区域
- 将堆保留为各种大小块的集合
- 显式分配
- 显式或隐式释放内存
分配器约束
- 对齐请求 / 相邻分配
- 无法确定分配内存的大小
- 立即响应
- 从可用内存分配
- 不移动已经分配的内存
优秀分配器的目标:
free掉多少内存?
- 保持块的长度
- 需要为分配的块提供额外单词
如何实现一个分配器?
0) 怎样表示内存分配?
- 位图 bitmap:由位组成的一个二进制块
分配了的和释放了的块都可以表示
- 链表
存储已分配或可用的内存
1)块组织 Block organization:我们如何跟踪自由块?
方法1:隐式空闲列表
用额外 1 位,以标识是否分配;在块大小的低阶位