Android(jave)中关于finalize必须要注意的几件事
2014-11-19 11:07
337 查看
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占用)。
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占用)。
相关文章推荐
- 关于手机必须知道的几件事(含SP陷阱)。
- 关于局部变量隐藏全局变量的必须注意的小错误
- 关于Android BroadcastReceiver一点点需要注意的地方
- 关于Cocos2d-x android的环境搭建、Demo运行的注意事项。
- 关于EditText的android:maxLength属性的注意事项
- 关于测试代码必须做以下几件事情的下厨做菜理解法。
- Android中关于线程使用的几点注意事项
- 十年心得:一个优秀Android开发人员必须注意的10个误区
- 【Android开发:自定义控件系列二】关于PopupWindow的注意点
- 关于android中shape的用法和注意点
- Android中关于线程使用的几点注意事项
- [android]关于SharedPreferences putString和commit的使用注意事项
- 关于D3D11,你必须了解的几件事情(三):完结篇
- 十年心得:一个优秀Android开发人员必须注意的10个误区
- Android 平台上蓝牙开发的关于 UUID 设置的注意事项
- 关于在配置web ssltossl有关证书方面必须注意的问题。
- 关于android:layout_weight属性使用注意事项
- android_Android应用开发之(你必须知道的关于程序性能小提示)
- 关于使用Android Application的注意点
- 关于android的JNI几点注意问题。