老物,dialog另类内存泄漏,不过不存在于ART(5.0+ && Debuggable=false)上,感兴趣的可以了解一下

有篇译文大概这么讲:

    dialog也有不寻常的内存泄漏,跟我们常见的handler.removeCallbacks移除runnable(匿名内部类持有了activity/fragment的引用)避免的内存泄漏不太一样。我们都知道常见的泄漏在于handler可能长时间持有了runnable,这个时间超过了activity/fragment的生命周期了,无法释放知道handler不再持有该runnable。

    而这个不寻常的泄漏,是这样的(伪代码):

while(true) {
    Message msg = next();
    ...
    dispatchMessage(msg);
    ...
    msg.recycle();
}

    可以看到代码会在msg.recycle()后回到之前的next()并阻塞等待下一个msg。

    泄漏可能这么来了:在dalvik上,或者在Debuggable设置为true的情况下,这段代码在等待下一个msg的时候,上一个msg实际上不会被释放,即便msg内容为空(recycle后内容清空了)。这可以理解对吧,但当这个时候假设有这么一段伪代码:

Message localMsg = Message.obtain();
localMsg.obj = new MyObject();

    假设localMsg刚好得到的msg就是上述的空msg,并设置了obj,那么如果next()一直长时间没有message的情况下而你又想要销毁这个MyObject,泄漏就出现了。

    可能说完还是有些懵,可以先自行实践一下,完整代码在最下面。也可以跳过实践看下面的译文,不过译文可能比我的还长,看不下去可以直接实践哈哈。

 

译文地址:

https://github.com/hehonghui/android-tech-frontier/blob/master/issue-25/%E4%B8%80%E4%B8%AA%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E5%BC%95%E5%8F%91%E7%9A%84%E8%A1%80%E6%A1%88-Square.md

 

完整代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值