讨论一下java里的垃圾回收算法
dyhml 2005-01-27 03:54:33 关于java里的垃圾回收算法,初学者经常产生的疑问是,像这样的代码里的无用单元:
class Test{
public Test test = null;
public static void main(String args[]){
Test t1 = new Test();
Test t2 = new Test();
t1.test=t2;
t2.test=t1;
t1=null;
t2=null;
}
}
java能不能自动回收?
java是可以回收的.对此有疑问的人的想法是以为java是采用引用计数法实现垃圾回收的.实际上,java不是用此方法,所以可以回收.
1:引用计数,如下,当单元count=0时回收此单元
Test t1 = new Test();//t1指向单元count=1
Test t2 = new Test();//t2指向单元count=1
t1.test=t2;//t2指向单元count++,count=2
t2.test=t1;//t2指向单元count++,count=2
t1=null;//t1指向单元count--,count=1
t2=null;//t2指向单元count--,count=1
两单元均不可达,为无用单元,但引用计数count=1,!=0,不能回收.
2:java的算法(简化)
基本思想:为了避免悬挂引用,宁可产生无用单元,只在空间用完,需要新单元时才进行垃圾回收.
过程:
1:标记Mark
首先,所有单元标记为off,然后,java所有thread的栈stack内引用的单元标记为on,对所有标记为on的单元引用的其他单元标记为on.
2:扫描Sweep
扫描堆heap,所有标记为off的单元一概回收.
所以,上述程序中无用单元是可以回收的.