## 常见算法
- 引用计数:循环引用问题
- 标记 - 清除算法:速度快,但有内存碎片
- 标记 - 整理算法:速度慢,无内存碎片
- 复制算法:无内存碎片,占用内存大
- 分代垃圾收集:综合若干算法
## 问题
###1、引用计数中,循环引用如何产生? 例如这段代码(来自[深入理解 java 垃圾回收机制]):
public class Main {
public static void main(String[] args) {
MyObject object1 = new MyObject();
MyObject object2 = new MyObject();
object1.object = object2;
object2.object = object1;
// 试图清理
object1 = null;
object2 = null;
}
}
如果采用引用计数,那么在 // 试图清理
之前:
在
object1 = null;
object2 = null;
之后:
两个对象之间仍然存在互相引用,可惜没有变量名可以访问它们了…
###2、如何标记 - 整理? 若对象 A 中引用了 B,当对 B 进行挪动时,如何保证 A 保存的 B 的位置仍然是 B?
不清楚,这个是底层实现的问题。一个思路:B 中也存放(隐式存放,不当作引用)了 A 的位置,当 B 的位置变化,B 可以通知 A 更新 B 的位置。
在基于 Compacting 算法 (例如标记 - 整理) 的收集器的实现中,一般增加句柄和句柄表。
###3、为什么标记 - 整理比标记 - 清除慢? 标记-整理
的第 1 步是标记-清除
,之后进行整理,多了一个整理的时间。
###4、复制算法比标记整理算法更? 快一些。复制算法的目标是为了克服句柄的开销和解决堆碎片。
###5、标记 - 清除算法中标记的什么?清除的什么? 标记存活的对象,删除未被标记的对象。