Android native Memory分析

本文介绍了一种定位Android Native内存泄漏的方法,包括设置调试参数、使用DDMS查看SO文件内存占用,以及通过复杂分析手段直接定位泄漏代码的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:  http://my.oschina.net/shaorongjie/blog/200350
前面讲述了如何分析Android总的Memory状况,每个进程的Memory状况及使用MAT分析Android内存定位到Java代码。下面看一下定位native memory leak代码。

本文将分析Android native memory的使用状况及通过一些手段来定位到native memory leak代码。

在EngLoad上执行以下adb命令


$ adb shell setprop libc.debug.malloc 1  
$ adb shell stop  
$ adb shell start


然后等手机重新启动后,链接DDMS就可以看到每个SO文件占用的内存大小了。一般占用很大的比较可能发生内存泄露。

(此图片引用自网络)

还有一种复杂的分析方法是结合process showmap, process maps及 process coredump3个文件来定位内存泄露代码,此方法可以直接定位到内存泄露代码,但需要是ENG版的手机和工程symbols文件。

首先,从process showmap文件中找出占用Memory最大的.so文件。

362148 289012 288412 0 648 0 288634 1590 [anon:libc_malloc]

可以看到上面native分配占用了288412 Bytes约288M内存。

然后,输入arm-linux-androideabi-gdb进入gdb

(gdb)file <product_name>/symbols/system/bin/app_process (需要调试的程序)

(gdb)set solib-search-path <product_name>/symbols/system/lib(设置搜索的Symbols文件)

(gdb)core-file coredump (即process coredump文件) (检查内存及寄存器)

(gdb)source core_parser_leak_info_v0.1.gdb(解析内存分配点)

可以看到

alloc_size = alloc_num * size_per_alloc

270MBytes = 49252 * 5760

alloc_bt:

bt:0x7a215c

bt:0xfffffffc

接着,从process maps中可以看到

0064f000-008d0000 r-xp 00000000 b3:05 1296 /system/lib/libskia.so

由于0x7a215c 在libskia.so的地址范围内0064f000-008d0000,可以断定是libskia.so发生了内存泄露。

计算地址偏移0x7a215c - 0064f000 = 0x0015315c

最后,使用arm-linux-androideabi-addr2line 来定位代码

arm-linux-androideabi-addr2line -C -f -e <product_name>/symbols/system/lib/libskia.so 0x15315c

SkImageDecorder::onDecodeSubset(SkBitmap* , SkIRect const&)

external/src/images/SkImageDecorder_libjpeg.cpp:2874

参考文献:http://source.android.com/devices/native-memory.html

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、付费专栏及课程。

余额充值