求助安卓开发的大佬们, Native 应用进程内存泄露如何排查

2022-02-21 12:26:55 +08:00
 FranzKafka95
先说背景,我们的应用是安卓 Native 进程应用,近期发现一个 OOM 问题,出现问题时我们进程的 Rss 占用高达 4 个 G ,本身总共就只有 6G 内存,由此得出我们进程发生了内存泄漏,再多的信息就没有了。

仔细检查了代码,涉及到内存的地方大部分都是 static 静态变量,也没有重复 new ,重复 malloc 够不 free 的地方,基本都是常驻内存。除了我们应用代码本身,还有一些开源的第三方库以及安卓系统的标准库,这部分有没有问题无法排查。

网上查了很多,都没有查到能在程序运行期间排查内存泄漏的方法。从 Google 官方文档里就找到一个 libmemeunreachable 的 so 库,这个库本身是被 zygote 加载的,可以通过 adb 命令查看安卓 app (java)的内存情况,但是 C++层却只有通过接口调用的方式进行检测,这又涉及到改代码,总之就是很麻烦。

想问一下各位,有没有好的办法对这个问题进行诊断,最好是能够定位到内存异常增加的是哪个 so 库或者哪个 bin 文件,谢谢各位了
1233 次点击
所在节点    问与答
9 条回复
rrZ2C
2022-02-21 12:28:52 +08:00
经分析 xx,建议转系统接力,谢谢![二哈]
FranzKafka95
2022-02-21 12:34:33 +08:00
@rrZ2C 锅是甩不掉的,已经从 Oom 的日志里看到我们进程 Rss 异常了,只能硬着头皮上
des
2022-02-21 12:34:59 +08:00
root 了之后 dump 内存,用 Linux 那套
FranzKafka95
2022-02-21 12:39:14 +08:00
@des dumpsys meminfo 是吧,可是这也只能看到有异常,没办法帮忙定位到程序的哪个部分
john6lq
2022-02-21 13:23:03 +08:00
先在应用侧确定是哪个页面总行吧
wuruxu
2022-02-21 15:25:13 +08:00
可能是第三方库调用流程有问题,导致内存泄漏,假如容易重现,还比较好处理
pursuer
2022-02-21 19:01:17 +08:00
前几天我在某杂牌机上装的支付宝倒是会卡住,ps 看了下好像是内存用挺多的。不过我觉得大概是杂牌机系统魔改的问题所以没管(又不是不能用。

不知道可不可以 hook 住内存申请释放的函数 malloc mmap 啥的去查。
itsMelo
2022-02-21 22:21:00 +08:00
你们有什么场景下会申请 native 内存吗?
FranzKafka95
2022-02-23 22:07:13 +08:00
过了两天,我来自己回帖了,目前终于是有了方向并且找到问题了,附上本次排查的一些心得,希望对大家有帮助 https://coderfan.net/android-native-memory-leak-debug.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/835373

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX