欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Messenger使用不当导致的内存泄漏

程序员文章站 2022-04-19 16:04:33
...

###问题现象描述:
根据Leak明显内存泄漏.一直占用message的引用.
页面完全卡住不动.但是一直有log 输出
正常Message只有next 属性不为空 .但是现在的程序target what 等属性都不为空

###原因: 耗时操作导致message 无法释放

开启定长为1的线程池处理数据 .leak 发现 FinalizeReference 和Data 一直很高.
原因:数据处理速度跟不上数据传输速度.数据一直堆积,无法释放.
补充: 是在开启runable的时候传参导致的data备份,并且占用导致内存无法释放
解决方案:Messenger 不适合多线程调度,直接使用线程池。

//Messenger 内存释放源码
try {
            //让handler去处理这个消息
            msg.target.dispatchMessage(msg);
        } finally {
            if (traceTag != 0) {
                Trace.traceEnd(traceTag);
            }
        }
        //handler处理完消息之后,回收消息
        //关键代码
        msg.recycleUnchecked();
    }
recycleUnchecked();将msg的除了next之外的信息都清空了.

###leak 参数
Retained size是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。
换句话说,retained size是该对象被GC之后所能回收到内存的总和。为了更好的理解retained size。