handler机制原理与内存泄漏

说到handler机制的话 涉及到4个类:Handler、Message、MessageQueue、Looper

我们通常用的都是子线程向主线程发送消息,大致的流程是 子线程发送MSG到MessageQueue队列涉及到的方法依次是:handler.sendMessage()->handler.equeueMessage()->messageQueue.enqueueMessage()

主线程取消息处理消息的流程是:ActivityThread.main()->Looper.loop()->MessageQueue.next()->

handler.dispatchMessage()->handler.handleMessage();

其实handler实现线程切换的实质是线程间内存共享 也就是MessageQueue共享

这里还有一个handler内存泄漏的问题 其实质不是因为匿名内部类的原因 而是因为 handler是被looper(GCRoot)间接引用的对象具体的引用是:

Looper(static)->MessageQueue->Message(有可能不会释放)->handler->activity

这个持有链不会断开的时候 activity就泄漏了 两种方法可以避免 一个是用 static+弱引用 这样handler就不会持有activity的引用 还有一个是activity关闭的时候 移除所有消息 切断message处的持有链

发消息的时候为什么不用new Message()而是用message.obtin() 这样是为了避免频繁GC 

造成STW(stop the world 因为gc时所有线程都将停止),从而造成画面卡顿

还有一个原因就是new 空间会产生内存碎片导致连续内存不够 最后造成oom

ThreadLocal类 主要作用是线程间隔离 这里面还涉及到一个epoll机制 这个epoll是阻塞可扩展io处理机制 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值