Android内存泄露之 FinalizerReference

在用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,特别是一些占用空间很大类更要谨慎!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值