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占用)。