一.摘要
我们在分析内存泄漏时java内存泄漏我们可以集成LeakCanary来进行监控,出现问题时会打印出泄漏时的引用关系,那么我们native内存泄漏时如何分析呢?native内存泄漏我们可以通过malloc_debug工具来进行监控,详细的介绍请参考:
https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README.md
二.如何使用
默认情况下高通的手机已经包含了malloc_debug的代码,具体路径在:bionic/libc/malloc_debug/,下边介绍使用方法:
1.使用dumpsys meminfo --unreachable分析
1.1设置你要监控的进程:
adb shell setprop wrap.<APP> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace"'
例如:
adb shell setprop wrap.com.smartisanos.security '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace"'
adb shell am force-stop com.smartisanos.security
1.2重启进程:
设置完属性后需要重启进程,我们先杀死进程adb shell am force-stop <APP>
如果之前的设置正常,进程重启后你会发现你进程的父进程并不是zygote64,而是:
sh -c LIBC_DEBUG_MALLOC_OPTIONS=backtrace /system/bin/app_process64 /system/bin --application '--nice-name=com.smartisanos.security' com.android.internal.os.WrapperInit 35 28 'android.app.ActivityThread' '0'
这就说明我们设置好了
1.3不断复现你的问题并且抓取分配内存的调用栈:adb shell dumpsys meminfo --unreachable pid | tee app_size.txt
1.4对比你APP 不同native size产生的日志问题,寻找问题
例如:
com.smartisanos.security APP Native Heap: 66696byte 时有如下栈信息:
Unreachable memory
65376 bytes in 1349 unreachable allocations
ABI: 'arm64'
48 bytes unreachable at 75aa29e0b0
and 62832 similar unreachable bytes in 1309 allocations
referencing 1248 unreachable bytes in 26 allocations
first 32 bytes of contents:
75aa29e0b0: 18 67 43 4d 76 00 00 00 00 00 00 00 00 00 00 00 .gCMv...........
75aa29e0c0: 00 00 00 00 00 00 00 00 b0 90 fa ad 75 00 00 00 ............u...
#00 pc 000000000006a4f8 /system/lib64/libc++.so (operator new(unsigned long)+32)
#01 pc 000000000007062c /system/lib64/libhwui.so
#02 pc 0000000000068818 /system/lib64/libhwui.so
#03 pc 000000000006c404 /system/lib64/libhwui.so
#04 pc 0000000000075a84 /system/lib64/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+340)
#05 pc 00000000000114e8 /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+280)
#06 pc 00000000000ad7ec /system/lib64/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+140)
#07 pc 000000000006827c /system/lib64/libc.so
#