#本文介绍native泄露分析方法#
Native泄露非常难以治理,因为系统Native内存可共享的,不像JavaHeap内存是私有的
捕捉泄露:测试每天从monkey中筛选出内存超标的app,
从dumpsys_meminfo_pid看native heap大,我们采用几种工具可以找到泄露调用栈:
-
Androidstudio:captrue native heap (抓取时长:600s (抓取方式 AndoridStudio分析内存 注意:有的车机系统不稳定:大多数无法抓取,偶尔又可以抓) 适用于实时抓取
-
perffeto native内存 (抓取时长:60s 适用于实时抓取
-
raphael (抓取时长:无限制(适用于压测,提前启动raphael
-
申请和释放的地方打印日志,日志成对出现才证明没有泄露
上述工具使用方法网上有详细介绍,请大家自行学习,使用时遇到任何疑问可私信我!
技巧:
从trace中没找到原因,不要慌!
下一步:恢复现场,从日志或摄像机记录下这段时间的录像,尝试复现,据经验,如果找到必现路径,100%可找到原因,我们要胸有成竹!
业内各种Native工具的使用情况:
名称 | 原理 | 项目 | 备注 |
---|---|---|---|
matrix | 基于PLT hook,hook malloc和free | https://github.com/Tencent/matrix | https://github.com/iqiyi/xHook/blob/master/docs/overview/android_plt_hook_overview.zh-CN.md |
raphael | 长时间抓取 | https://jidudev.com/jian.lang/native-memory-leak-detector/-/tree/master/native-leak-library Jidu 优化过的raphael:优化点(去掉无用代码,增大cache为1G) | |
perffeto | 无法长时间抓取 | ||
Androidstudio | 无法长时间连续抓取,但比perffeto抓取时间要长 | 抓取时长:无限制(抓取方式 https://jidudev.com/jian.lang/native-memory-leak-detector/-/tree/master/native-leak-library 适用于压测,提前启动 | |
各家自研方案 | 在申请和释放对象的地方把对象加入到全局链表中,或简单一些就在申请,释放的地方打印相同的日志 | ||
LeakTracer | 修改编译、链接流程,再libc链接之前,先链接到LeakTracer额内存分配函数(new、delete、malloc、free) | https://github.com/fredericgermain/LeakTracer | https://github.com/wangshengyang1996/AndroidLeakTracer |
LeakTracer原理如图: