Android关于销毁你所应该知道的

finalize()用途何在

五步看懂:

这里写图片描述

我们都了解初始化的重要性,当常常会忘记同样也重要的清理工作。在Java中有垃圾回收器负责(GC)回收无用的对象占据的内存资源。

但是也有特殊情况:假定你的对象(并非使用new)获得一块“特殊”的内存区域。为了处理这种情况,Java允许在类中定义一个名为finalize()的方法。

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

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

请记住,无论是”垃圾回收“还是“终结(finalize())”,都不保证一定会发生。如果JVM未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的(除了手动调用System.gc()强制进行finalize()的执行)。

垃圾回收器执行的不确定性,导致finalize()方法的执行时机也是不确定的,So,不能够将finazlie()方法作为通用的清理方法。

那么,finalize()真正的用途是什么呢?

  • 垃圾回收至于内存有关。

也就是说,使用垃圾回收器的唯一原因时为了回收不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize())方法来说,它也必须时同内存及其回收有关的。

但这是否意味着要是对象中还有其他的普通对象(通过new创建的),finalize()就应该并却释放那些对象呢?

普通对象的创建(new的方式),垃圾回收器都会负责释放对象占据的内存。这就对finalize()的需求限制到一种特殊情况,即通过某种创建对象的方式以外的方式为对象分配的存储空间。

不过Java中一切皆为对象,那么这种特殊情况是怎么回事呢?

之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非Java的通用做法(new)。这种情况主要发生在使用”native method”的情况下,本地方法(native method)是一种在Java中调用非Java代码的方式,目前只支持C或C++(也就是我们常说的JNI or NDK编程)。

在非Java代码中,也许会调用C的malloc()函数来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏。

GC如何工作

// TODO

继承中的销毁操作

销毁的顺序应该和初始化顺序相反,以防某个子对象依赖于其他对象。

对于字段,则意味着与声明的顺序相反,因为字段的初始化时按照声明的顺序进行的。

对于父类,应该首先对其子类进行销毁操作,然后才是父类。这是因为父类的销毁操作可能会调用父类的某些方法,所以需要使父类中的构件仍起作用,而不应过早的销毁他们。

尽管通常我们都不需要执行销毁操作,但是一旦选择要执行,就必须谨慎和小心。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值