请教高手,什么情况下引用变量为null

unique_hxl 2008-08-25 05:10:23
根据GC的工作原理,我们可以通过一些技巧和方式,让GC运行更加有效率,更加符合应用程序的要求。

  以下就是一些程序设计的几点建议。

  1.最基本的建议就是尽早释放无用对象的引用。

  大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null。
摘自http://wz.csdn.net/url/781480/
-----------------------------------------------------------------------------------------------------------
上面最后一句话的意思是不是说即使引用变量退出活动域之后,该引用变量依然存在,垃圾回收器就不会回收该引用指向的对象?如果让垃圾回收器回收无用的对象,则只能显示该指向该对象的引用变量置为null或者重新指向一个对象?“大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为null。”对于这句话谁又能给一个例子?
...全文
178 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_1987 2008-08-26
  • 打赏
  • 举报
回复
刚好看到JAVA编程思想里的关于这个例子的解释。
说是会自动回收垃圾的。
不过我对JAVA的自动回收的工作原理还不了解。所以不敢瞎说。
ZangXT 2008-08-26
  • 打赏
  • 举报
回复
str指的对象没有引用执行了,GC会发现这个对象成为垃圾,需要的时候就回收掉。
unique_hxl 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ZangXT 的回复:]
不是,超出作用域范围str这个变量已经不存在了,出栈操作 。
[/Quote]
str变量出栈了,str指向的对象也就不会被达到,所以他的效果和str=null是一样的,str指向的对象也会被GC回收,你是这个意思吗?
ZangXT 2008-08-25
  • 打赏
  • 举报
回复
不是,超出作用域范围str这个变量已经不存在了,出栈操作 。
unique_hxl 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ZangXT 的回复:]
这种情况是,但是具体什么时候回收是不确定的 。
str=null;
这样的写法肯定是方法中还有很多其他的代码,但是str到此已经没有用了,直接设置为null。这样str原来指向的对象就是GC可以回收的了 。
[/Quote]
只要超出引用变量的作用域范围,该引用变量就直接置为null了,你是这个意思吗?
ZangXT 2008-08-25
  • 打赏
  • 举报
回复
这种情况是,但是具体什么时候回收是不确定的 。
str=null;
这样的写法肯定是方法中还有很多其他的代码,但是str到此已经没有用了,直接设置为null。这样str原来指向的对象就是GC可以回收的了 。
unique_hxl 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ZangXT 的回复:]
public void test(){
String str=new String("Hello");
}
这样的情况,方法执行完后,引用变量str也就不存在了(自动退栈),但是它原来指向的对象依然在栈里面,这样看GC什么时候回收了.这个对象可能存在很长时间.GC也会根据内存状况决定是否进行回收.

[/Quote]
你的意思是在引用变量的作用域之外,该引用变量指向的对象就可以被GC回收了?不需要在退出作用域之前显示的写上这段代码:str = null;
lisl2003 2008-08-25
  • 打赏
  • 举报
回复
受教……
ZangXT 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ZangXT 的回复:]
public void test(){
String str=new String("Hello");
}
这样的情况,方法执行完后,引用变量str也就不存在了(自动退栈),但是它原来指向的对象依然在栈里面,这样看GC什么时候回收了.这个对象可能存在很长时间.GC也会根据内存状况决定是否进行回收.

[/Quote]
笔误,对象在堆里面.
ZangXT 2008-08-25
  • 打赏
  • 举报
回复
public void test(){
String str=new String("Hello");
}
这样的情况,方法执行完后,引用变量str也就不存在了(自动退栈),但是它原来指向的对象依然在栈里面,这样看GC什么时候回收了.这个对象可能存在很长时间.GC也会根据内存状况决定是否进行回收.

62,614

社区成员

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

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