关于finalize()方法的那点事

提到finalize方法,可能第一想法就是与C++的析构函数相同,但其实不然,我们先来看看finalize的作用:

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

乍一看,似乎更贴近于析构函数的功能,但其实这里有个陷阱,C++中对象一定会被销毁(确切来说是应该被销毁,不然就会内存泄漏,毕竟C++是手动管理对象),但Java的对象并非总是被回收。

如果Java虚拟机JVM并未面临内存耗尽的情况,它是不会浪费时间去执行垃圾回收以恢复内存的。

所以,finalize作为通用的清理方法并不合适,因为它并不一定保证会被调用到,那这东西到底有啥用呢?

1. 清理其他语言占用的存储空间:Java中无论对象如何创建,垃圾回收器都会负责释放对象占据的所有内存。但有特殊情况,这就是本地方法。所谓本地方法,就是在Java代码中用非Java代码(比如C和C++)的方式。在非Java代码中,也许会调用C的malloc()函数来分配存储空间,而且除非用了free(),否则这部分存储空间将得不到释放,从而造成内存泄漏,可free()函数是C和C++的用法,所以此时finalize就派上用场了。

2.对象终结条件的验证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值