在用Android studio中的Profiler查看内存时常会发现类型为FinalizerReference的对象也有好几百甚至成千上万的,那么这个对象是什么鬼,怎么来的呢?下面我我们来仔细分析下
当我们想在一个类对象释放时额外做一些工作是,就会重写这个类的finalize函数,当系统在创建类对象时发现这个类重写了finalize函数,就会额外创建一个FinalizerReference对象,并用这个FinalizerReference对象把我们自己的对象包装起来,添加到一个队列中
public final class FinalizerReference<T> extends Reference<T> {
public static void add(Object referent) {
FinalizerReference<?> reference = new FinalizerReference<Object>(referent, queue);
synchronized (LIST_LOCK) {
reference.prev = null;
reference.next = head;
if (head != null) {
head.prev = reference;
}
head = reference;
}
}
}
系统还会启动一个额外的线程来处理这个队列中的对象,但是这个处理线程的优先级很低,时长处理不过来,如果你的对象处理这个队列时,那么就会很长时间得不到释放,造成内存的暂时性泄露,如果短期内有大量这样的对象,OOM就要发生了;
所以,在日常开发中尽量不要重写finalize,特别是一些占用空间很大类更要谨慎!