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。