- 内存管理器如何知道何时可以释放内存?
- 一般我们不知道下一步会用到什么,因为这取决于具体条件
- 但是我们知道如果没有指针,某些块就不能被使用
- 必须做些关于指针的假设
- 内存管理器可以区分指针和非指针
- 所有指针都指向一个块的起始地址
- 无法隐藏指针(e.g., by coercing them to an int, and then back again)
- 经典的垃圾收集算法
- Mark-and-sweep collection (McCarthy, 1960) 标记-清除算法
- 不移动块 (除非要 “紧凑”)
- Reference counting (Collins, 1960) 引用计数
- 不移动块 (未讨论)
- Copying collection (Minsky, 1963) 复制收集
- 移动块 (未讨论)
- Generational Collectors (Lieberman and Hewitt, 1983)
- 基于生命期的收集
- 大部分分配很快就会变成垃圾
- 因此回收工作的重点应该是刚刚分配的内存区域
- 基于生命期的收集
- Mark-and-sweep collection (McCarthy, 1960) 标记-清除算法