Android(jave)中关于finalize必须要注意的几件事

java.lang.ref.FinalizerReference 是 Java/Dalvik GC 相关的一个类,所有 Override finalize() 方法的 Object,最后都会被 FinalizerReference 类的静态变量引用,所有当它们没有强引用时不会被 VM 立即回收,而是 『在GC时』会将这些 Override finalize() 方法的 Object 压入到 ReferenceQueue 中。同时会有一个守护线程『Finalize Daemon』来真正处理调用他们的 finalize() 函数,实现垃圾回收。所以,以下的几件事情,必须要注意:


1.   finalize() 方法被执行的时间是不确定,所以不能依赖它来释放紧缺的资源。

2.   重载了 finalize() 方法的 object 需要至少经过两轮 GC 才有可能被释放,所以在 OOM 的瞬间,java.lang.ref.FinalizerReference 依然还是持有这么高的内存没有释放,这样级就拖慢了释放的速度。


这样,为了内存的高效使用,我们有以下的开发准则:


1.  紧缺资源不要依赖finalize()来释放。

2.  尽量不要重载finalize()。

3.  如果必须重载finalize(),一定要记得调用super.finalize,也建议把类实现成单例模式(较少FinalizerReference占用)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值