讨论一下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的单元一概回收.

所以,上述程序中无用单元是可以回收的.
...全文
273 点赞 收藏 8
写回复
8 条回复
dyhml 2005年01月29日
再顶一下
回复 点赞
antivence 2005年01月28日
比较深噢,好好理解一下
回复 点赞
dyhml 2005年01月28日
treesoft(长沙水) 说的不错
回复 点赞
御南 2005年01月27日
顶了,不太懂
回复 点赞
廖雪峰 2005年01月27日
最新的火车算法,建议看看《inside the jvm》
回复 点赞
cuilichen 2005年01月27日
呵呵,学习ing
回复 点赞
不徻写代码 2005年01月27日
up
回复 点赞
treesoft 2005年01月27日
stop and copy: heap 在使用过程中出现很断裂,则jvm会停止程序运行,将heap中所有的有用对象拷贝到一个新的heap,然后再使新heap,更新所有reference,释放旧的heap内存。

mark and sweep: heap没有什么断裂,便首先标记有用对象,然后再一次性清除无用对象(释放它们的内存),这一过程会产生断裂。这种方式可在程序运行中进行。

jvm会在这两种方式中动态切换。
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告