java中的finalize() 方法解析

本文深入探讨了Java中Finalize机制的工作原理及其使用注意事项。通过一个具体的代码示例展示了对象如何可能通过Finalize方法暂时逃脱垃圾回收,并讨论了这种机制的局限性和潜在问题。建议采用更可靠的方法如try-catch-finally来处理资源释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class CanReliveObj {
public static CanReliveObj obj;
protected void finalize()
{
System.out.println(“fialize “);
try {
super.finalize();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(“obj finalize called”);
obj = this;
}

/*
 * 
 */
public static void main(String[] args) throws InterruptedException{
    obj = new CanReliveObj();
    obj = null;
    System.gc();//obj复活了
    Thread.sleep(1000);
    if (obj == null){
        System.out.println("obj is null");
    } else {
        System.out.println("obj can be used");
    }
    System.out.println("second gc()");
    obj = null;
    System.gc();
    if (obj == null){
        System.out.println("obj is null");
    } else {
        System.out.println("obj can be used");
    }
}

}

运行结果如下:

fialize
obj finalize called
obj can be used
second gc()
obj is null

  1. java的GC只负责内存相关的清理,所有其它资源的清理必须由程序员手工完成。要不然会引起资源泄露,有可能导致程序崩溃。
  2. 调用GC并不保证GC实际执行。
  3. finalize抛出的未捕获异常只会导致该对象的finalize执行退出。
  4. 用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关。
  5. JVM保证在一个对象所占用的内存被回收之前,如果它实现了finalize方法,则该方法一定会被调用。Object的默认finalize什么都不做,为了效率,GC可以认为一个什么都不做的finalize不存在。
  6. 对象的finalize调用链和clone调用链一样,必须手工构造。

从上面的程序可以看出,调用finalize()方法引起了内存外泄,因为obj复活了,
因此:
1. finalize()方法不推荐使用,它是一种非常糟糕的模式;
2. 因为finalize()方法是被系统调用的,调用时间不明确,因此不是一个很好的释放资源的方案;
3. 推荐使用try-catch-finally来释放资源;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值