日期:2014-05-20  浏览次数:20776 次

问一个JAVA中垃圾回收机制的问题
Button   b   =   new   Button();

......

b   =   null;

执行到上面这一行为止,Button   b所占用的内存空间有没有被回收?最好能讲出个道理来,或者能给出相关的参考资料


------解决方案--------------------
用到这里的时候 b 所占用的内存并没有释放。
b是一个句柄,他的生命周期是从创建时开始,到这个方法结束时回收。

b = NULL;
这样写,就把 原来b与原来他指向的对象给隔离了。
目的是为了让gc尽快地将b原来指向的那个对象清理掉。

至于b自己,还是上面所说的 方法结束时回收
------解决方案--------------------
B = NULL并不是说引用对象B就没有了,只是让他成为空引用,指向空。
至于什么使命释放,一般来说是一个方法结束的时候,但是这个也并不一定。主要是由垃圾回收器GC来决定什么时候回收内存。
------解决方案--------------------
过一段时间回收,首先b的引用变量的地址为null,那么b就没有指向任何对象,这个时候这个对象就是象‘脱了线的野马没人管’,Java虚拟机在一段时间内进行自检发现对象没有被引用就将其消毁。
------解决方案--------------------
GC的机制就不需要关了
JAVA会在它自认为合适的时候删除这个对象

所以JAVA里没有类似C的析构函数
因为对象删除的时机无法确定
------解决方案--------------------
public class A{
public void finalize(){
System.out.println( "对象销毁 ");
}

public static void main(String[] args){
A a = new A();
a = null;
}
}

JVM会自动查找没有有效引用得对象,然后释放空间,但是时机是不确定得,即使你调用System.gc()也不能保证全都收集