Java对象的销毁过程

2016-10-23  本文已影响0人  帅_zs

那么问题又来了,finalize()是个什么鬼呀,既然会调用对象的这个方法就说明所有的类都会有这个方法(毕竟所有的类都会被回收嘛),自然而然我们就想到了java的根类 Object.进去看看

protected void finalize() throws Throwable { }

最后一行还真找到了,是一个实现为空的方法,既然是protected就说明具体的方法可以留给子类去实现


public class User {

private int money;

public int getMoney() {

return money;

}

public void setMoney(int money) {

this.money = money;

}

public void cool(){

String str=new String();

}

@Override

protected void finalize() throws Throwable {

// TODO Auto-generated method stub

if(money>0){

System.out.println("error");

}

else{

System.out.println("suceess");

}

super.finalize();

}

}

这里我们重写finalize()方法,在销毁前如果一个人的前还没花光,打印这个人是失败的,否则这个人是成功的。

我们在main()中的代码


public class Test {

public static void main(String args[]){

User u1=new User(200);

new Object();

new User(100);

}

}

运行一下,结果如下:


居然什么都没有!运行结束之后不光有引用指向的u1,就连没有任何引用指向的new User(100);居然都没有被回收。这是怎么回事呢?

java中的并非总是被垃圾回收,也就是说对象可能不被回收。一般程序只要不到濒临存储空间用光,垃圾回收器一般都不会主动回收内存,如果程序结束,并且垃圾回收器一直没有释放你创建的空间,则随着程序的退出,资源则会被归还给操作系统。所以上面的我们finalize()才一直没有被调用


public class Test {

public static void main(String args[]){

User u1=new User(200);

new Object();

new User(100);

System.gc();

}

}

System.gc();会强制系统垃圾回收器工作,运行效果如下


error

可以看到new User(100);创建的对象被回收了。

上一篇 下一篇

猜你喜欢

热点阅读