handler机制原理与内存泄漏

Handler机制涉及Handler、Message、MessageQueue和Looper四类,用于线程间通信。子线程通过Handler发送MSG到MessageQueue,然后由Looper在主线程中取出并处理。内存泄漏问题主要因Handler被Looper引用导致,可通过使用静态+弱引用或在Activity关闭时移除消息来避免。使用Message.obtain()而非newMessage()减少GC压力,防止STW和可能的OOM。ThreadLocal实现线程间隔离,epoll是高效的IO处理机制。
摘要由CSDN通过智能技术生成

说到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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值