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

所以,上述程序中无用单元是可以回收的.
...全文
392 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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会在这两种方式中动态切换。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧