是否需要设置obj = null?
来源:互联网 发布:php模版 编辑:程序博客网 时间:2024/05/16 10:04
这个问题原贴发表在这儿:
http://topic.csdn.net/u/20090408/13/89c22659-e194-488d-add1-23256b22465e.html?seed=2029607558
虽然是C#技术栏目,但对JAVA完全适用。
但所以答案没有一个是正确且完整的。
下面是我的答案,我有足够的自信说这是真正正确的答案,除非JVM和CLR规范重新修改了。
正常情况下生成一个对象后主动让 obj = null;
没有任何作用,但也没有任何害处(除了说明程序员对编译器的无知和代码看起来比较幼稚)
编译器比你更清楚在什么位置对象已经失去引用。
object o = new object();
stmt1;
o.xxx();
stmt2;
stmt3;
o = null;
其实编译器在为o.xxx()后面就知道它(原来o指向的那个对象)是可回收的,
比你在两个语句后再o=null更准确!
什么时候需要 o = null;?
o = null;有时是必须的,就是在底层容器中保存对象然后外部封装类pop出来的时候。
比如一个Queue,它的实现是用一个成员变量数组来保存对象
class MyQueue{
private object[] arr = new object[100];
private int tail;
private int head;
private int count;
............;
}
当压入元素时:
if(count >= 100) throw 一个没有空间的异常
this.arr[this.tail] = o;
tail = (tail + 1) % this.arr.length; //如果到数组最后则从头开始
count++;
但当弹出时:
if(count <= 0) return null;
object o = this.arr[this.head];
this.arr[this.head] = null;
this.head = (this.head + 1) % this.arr.length;
count--;
this.arr[this.head] = null;这里如何不主动设置null.则这个对象被pop出去后
arr中始终有一个引用指向这个对象而使对象不能回收,如果你只是临时放一个对象到
Queue中马上就POP出来使用,本来你以为使用后可以被回收,却因为arr中同时有一个
引用指向它,如果这个引用不被其它元素替换掉,则原来那个对象一直不能被回收。
凡是类似的有底层容器和外部封装同时对一个对象持有多个引用的,在你用完了这个对象后
你应该把其它指向它的引用手工置为null;其它情况(指正常的只有一个引用时)不应该置为null
(完全是多余)
其实上面的情况相当于: object o = new object();
o1 = o;
o.xxx();//使用完了,使用完了的意思是我知道o1也不需要再操作这个对象
//我本来想在这个位置对象进入可回收的状态,但因为o1还没有超出作用域,
//所以不能被回收,所以要手工设置o1 = null;
//这样这个对象才会被回收。
}
}
- 是否需要设置obj = null?
- obj=null :是否能让对象立即释放或者加快对象释放,是否必须加上?
- obj=null;是否能让对象立刻释放,是否能加快对象释放,是否有必要加上?
- C#中的obj==null问题?
- obj==null 和 null==obj的区别
- null == obj 和 obj == null在java中推荐前者的原因
- 关于as3.0代码里delete后是否需要null
- new操作符返回null是否需要检测!!!
- JVM内存管理------杂谈(借此也论一论obj=null)
- 没有obj=null 导致内存溢出的案例
- java中 obj=null对垃圾回收有用吗
- JVM内存管理------杂谈(借此也论一论obj=null)
- java中 obj=null对垃圾回收有用吗
- JVM内存管理------杂谈(借此也论一论obj=null)
- JVM内存管理------杂谈(借此也论一论obj=null)
- obj==null和obj.isEmpty()还有"".equals()有什么区别,equals
- android 判断是否需要设置代理
- SQL语句查询是否为空 =null及null
- Linux操作系统下C语言编程入门学习笔记(...20090601(第一遍学完待整理)...)
- Toastmaster
- c#中equals与==的区别
- 各种数据源连接各种数据库常用连接字符串
- Java学习之Iterator(迭代器)的一般用法 (转)
- 是否需要设置obj = null?
- C#双缓冲技术
- 《网络营销实战密码》推荐
- 小议面向接口编程
- ORA-00257解决
- 两年
- 虚拟化技术产品资讯 2009年4月5日
- 深入理解DirectX D3D9
- 复杂图形下擦除图像