##常见算法
引用计数:循环引用问题
标记-清除算法:速度快,但有内存碎片
标记-整理算法:速度慢,无内存碎片
复制算法:无内存碎片,占用内存大
分代垃圾收集:综合若干算法
##资料
##问题
###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、标记-清除算法中标记的什么?清除的什么? 标记存活的对象,删除未被标记的对象。