在Java编程中,有必要在一个对象完成工作后,用obj = null;吗?

xiaoyue_yu 2003-10-16 02:48:38
和java中自动垃圾回收有什么关系呢?
...全文
79 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
swinging 2003-10-17
  • 打赏
  • 举报
回复
另外说一点,对object=null操作后,不一定是会使对象被回收的,
对象是否被回收是看一个对象是否还有引用指向它,如果你将对象的引用置为null,
而这个对象还有其它引用在引用它,那么你这么做基本就没有任何意义了,
而且还在程序上给人困扰,因为你使一个变量具有多重意义,
在你不经意的时候,很可能会在将这个变量置为NULL后又使用它(因为开始时这个变量
确实是指向你需要的对象的,所以你后来还用它,而忘了自己中途把它置为NULL了),
于是BUG就爬出来了。
swinging 2003-10-17
  • 打赏
  • 举报
回复
我觉得你们(楼上所有的)思路有问题。
其实如果一个OBJECT使用完了,需要NULL下了,不如让它就在此OVER,
就是说,尽量在使该OBJECT的引用的生存空间只有使用它的那么大,
一个对象引用在使用是一般是最好不用来反复通过赋值指向不同对象的,
这样变量的意义更确定一些,有助于程序的清晰,
因此一旦不使用该对象引用的对象时,最好是同时使这个引用也被丢弃,
给个简单例子:
假设有一个List list,
当使用迭代器遍历它时,最好能这样:
for(Iterator iter = list.iterator; iter.hasNext();) {
// do something
}
这样的话,变量iter的生存空间就只在使用它的范围内,一旦程序流程跑出了循环,那么这个引用就被丢弃了。
一般我们很习惯这样的写法:
Iterator iter = list.iterator;
while(iter.hasNext()) {
// do something
}
其实两个好像没有什么本质区别,最大不同就是变量iter的生存空间不同,
象楼主说的,在使用完后置iter=null,即:
Iterator iter = list.iterator;
while(iter.hasNext()) {
// do something
}
iter=null;
肯定不如上面使用FOR循环来得简洁,而且这里并没有丢弃变量iter,而实际iter将不再被使用了的。
umeshu 2003-10-17
  • 打赏
  • 举报
回复
虽然楼上说的有一定的正确性,但null一下还是有助于垃圾回收得以正确执行的。
songsd 2003-10-17
  • 打赏
  • 举报
回复


object = null有时候很有用,有时候一点用也没有,纯粹是浪费cpu,浪费读你代码人的感情(这点我深有体
会了),object = null的语句的目的是让某个对象的引用数为0,这样的话,当垃圾回收线程运行时候,会将该

对象占用的资源释放,使该对象真正的消失。理解这个目的再加上对变量作用域的理解,就很容易知道什

么时候该用,什么时候不该用了。
这里举几个例子
比如有个方法
void method1()
{
List l= new ArrayList();
向l中加入10000个对象;

使用或处理l; //到此l已经使用完毕


methodX(); //methodX()需要长时间执行;
}

对于这种情况,显然需要执行l = null;否则假如最后执行methodX(); ,执行了很长时间,这段时间gc执行

了好多次,但是l引用的对象一直却得不到释放,于是造成了白白的内存浪费,显然这样的代码不是最好

的。
假如后面的mehodX()换成了执行时间很短的代码(即使很多行),那就没有必要执行l = null了。
是不是需要使用l=null需要衡量的是,l是否占用足够多的内存空间。2,使用完后,l作用域范围内还需要执行的时间。3,使用l = null会使代码看起来很别扭。

再举一个不需要执行 "=null"的例子

method2()
{
.....
for(int i = 0;i<n;i++)
{
MyClass m ....
process(m);
m=null;
}

.....
}





littlecpu 2003-10-17
  • 打赏
  • 举报
回复
只要你的函数原子性足够细,那有这些烦心事
littlecpu 2003-10-17
  • 打赏
  • 举报
回复
放屁
happyegg 2003-10-16
  • 打赏
  • 举报
回复
null一下没有用的,java中的垃圾回收是自动完成,自己null一下,内存还是不会释放的
Mars_wx 2003-10-16
  • 打赏
  • 举报
回复
觉得还是null一下
zeeler 2003-10-16
  • 打赏
  • 举报
回复
java中的GC可以自动回收作废类的对象,但是只回收Heap中存储的对象,所以在java编程中尽量都使用new来生成对象,例如: String hello = new String("");
另外,还要注意GC回收的标准是Heap中的对象没有相关的reference指向它,具体的内容请参考《Java编程思想(第二版)》
xiaoyue_yu 2003-10-16
  • 打赏
  • 举报
回复
up

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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