java finalize 作用_java回收finalize方法的作用(编程思想)

清理:终结处理和垃圾回收

java有垃圾回收期负责回收无用对象占据的内存资源。但也有这种情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收期只知道释放那些由new分配的内存,所有它不知道该如何释放对象这块“特殊内存”。为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:

一旦垃圾回收期准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。

例子模拟:

假设某个对象在创建过程中会自己绘制到屏幕上,如果不是明确的从屏幕上将其擦除,它可能永远得不到清理。如果在finalize()里加入某种擦除功能,当“垃圾回收”发生时(不能保证一定会发生),finalize()方法得到了调用,图像就会被擦除,下一次垃圾回收就会回收掉。

也许你会发现,只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总得不到释放。如果程序执行结束,并且垃圾回收器一直没有释放你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统。这个策略是恰当的,因为垃圾回收本身也有开销,要是不使用它,也就不用支付这部分开销了。

finalize使用例子:验证终结条件

public class TestFinalize {

public static void main(String[] args){

Book novel = new Book(true);

novel.checkIn();

//Drop the reference. forget to clean up

new Book(true);

//Force garbage collection & finalization

System.gc();

}

}

class Book{

boolean checkOut = false;

Book(boolean checkOut){

this.checkOut = checkOut;

}

void checkIn(){

checkOut = false;

}

protected void finalize(){

if(checkOut){

System.out.println("Error: checked out");

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值