java彻底销一个对象_一起学Java(三十一)----- 对象销毁

不积跬步,无以至千里;不积小流,无以成江海。

Java语言基础

Java的对象销毁:

Java的内存清理是通过垃圾回收器进行的,当垃圾回收器准备回收对象内存的时候,首先会调用对象的finalize()方法,并且在下一次垃圾回收动作发生的时候真正回收对象的内存。既然会调用对象的这个方法就说明所有的类都会有这个方法(因为所有的类都可能会被回收)。

先看Java的根类 Object:

protected void finalize() throws Throwable { }

这是一个实现为空的方法,既然是protected就说明具体的方法可以留给子类去实现。

我们也知道当对象不再被任何引用指向时候,该对象才会被回收。那么具体情况如何呢?

class User {

private int money;

public int getMoney() {

return money;

}

public void setMoney(int money) {

this.money = money;

}

public void cool() {

System.out.println("Money!");

}

@Override

protected void finalize() throws Throwable {

// TODO Auto-generated method stub

super.finalize();

System.out.println("finalize methode executed");

System.out.println(this);

}

}

我们重写了finalize()方法,接着对其进行测试:

public class Test {

public static void main(String[] args) {

// TODO Auto-generated method stub

User user = new User();

System.out.println(user);

user = null;

System.out.println(user);

new User();

}

}

程序输出:

User@15db9742

null

我们发现运行结束之后,user并没有被回收,就连没有任何引用指向的new User()也没有被回收。

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

这里我们可以使用System.gc(),强制系统垃圾回收器工作:

public class Test {

public static void main(String[] args) {

// TODO Auto-generated method stub

User user = new User();

System.out.println(user);

user = null;

System.out.println(user);

System.gc();

}

}

程序输出:

User@15db9742

null

finalize methode executed

User@15db9742

可以看到创建的对象user被回收了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值