记一次android native 内存泄漏分析

最近有客户反馈,使用平台的SDK,进行扫码时,使用几个小时后,内存就变占满了,然后呢,系统就重启了。

于是,给客户脚本,ps之类拷机,定位,发现是system_server出现内存泄漏。这个大家伙,有java,有native.

通过的抓取2分钟时间内dumpsys meminfo差异 :

主要在Native Heap增加。

好吧,确认是Native Heap出现内存泄漏无疑。

Native Heap的泄漏,主要还是通过开启 libc debug 来分析。

1.设置属性:

setprop libc.debug.malloc 1

setprop libc.debug.malloc.options backtrace

stop;start

注意不是重启,不然这些属性就失效了。另外,开启这个属性后,系统的运行速度会严重变慢。所以不同的测试场景,需要考虑系统负载。

2.抓取操作前后dumpheap 差异:

ps 获取下system_server的进程号,比如 520

am dumpheap -n 520 /sdcard/0.txt

am dumpheap -n 520 /sdcard/1.txt

可以多个。

3.解析上述dumpheap:

放在android工程根目录执行:

python native_heapdump_viewer.py 0.txt > 00.txt
python native_heapdump_viewer.py 1.txt > 11.txt

注意native_heapdump_viewer.py 可用相关参数。我这边没有使用。

native_heapdump_viewer.py下载

4.然后对比00.txt,11.txt,重点关注排前面的数据:

 

这边列出的,是按调用流程,从上到下。比如下面的代码,可以方便在工程中找到。

88432  25.39% 100.00%    20808     e8c29312 /system/lib/libc.so __pthread_start(void*) /proc/self/cwd/bionic/libc/bionic/pthread_create.cpp:198 (discriminator 1)
  4436088  23.52%  92.64%    17960       e71c5f28 /system/lib/libandroid_runtime.so android::AndroidRuntime::javaThreadShell(void*) frameworks/base/core/jni/AndroidRuntime.cpp:1174
  3736560  19.81%  84.23%    15327         e8cc53a2 /system/lib/libutils.so android::Thread::_threadLoop(void*) /proc/self/cwd/system/core/libutils/Threads.cpp:754
  2922464  15.50%  78.21%    15159           e89a880c /system/lib/libinputflinger.so android::InputReaderThread::threadLoop() /proc/self/cwd/frameworks/native/services/inputflinger/InputReader.cpp:949 (discriminator 1)
  2912784  15.45%  99.67%    15029             e89a6d38 /system/lib/libinputflinger.so android::InputReader::loopOnce() /proc/self/cwd/frameworks/native/services/inputflinger/InputReader.cpp:314

这样,一行行跟进去,终于发现在

InputReader.cpp:2277 ,每进来一个操作事件,被修改的代码,就new一个字符数组来获取某个属性,但并没有释放,醉了。

知道原因后,就改了这个属性的获取方式。然后测试,OK。

 

 

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android内存分析是指检测和分析Android应用程序中的内存使用情况,以便优化应用程序性能和解决内存泄漏问题。 首先,我们可以使用Android Studio提供的内存分析工具来对应用程序进行分析。该工具可以显示应用程序的内存使用情况,并提供了堆转储文件的功能。通过查看堆转储文件,我们可以检查应用程序的堆内存使用情况,包括对象的分配、引用和释放情况。从而找到可能的内存泄漏问题,如未及时回收的对象或无效的引用。此外,我们可以利用工具中的多种图表和报告来分析内存泄漏的原因和位置。 其次,我们可以使用MAT(Memory Analyzer Tool)工具来对堆转储文件进行更深入的分析。MAT工具提供了更多的工具和报告,可以帮助我们找出内存泄漏的根本原因,如长生命周期的对象、静态引用、未正确关闭的资源等。此外,MAT还可以分析内存中的对象实例占用及其关系,帮助我们了解对象之间的引用关系并发现潜在的内存泄漏。 最后,我们还可以使用一些第三方库和工具来辅助进行内存分析,如LeakCanary和Facebook的Stetho。LeakCanary可以实时监测内存泄漏,并在检测到泄漏时提供详细的报告和堆转储文件。Stetho可以实时查看应用程序内存使用情况,并提供调试界面和API,方便开发人员进行内存分析和调试。 总之,Android native内存分析是通过使用内置工具、第三方库和工具来检测和分析应用程序的内存使用情况,以优化性能和解决内存泄漏问题。通过分析堆转储文件和使用各种工具和报告,开发人员可以快速定位和解决内存问题,提升应用程序的质量和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值