13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

研究了一波AndroidNativeC++内存泄漏的调试

文末本文转载自微信公众号「程序喵大人」,作者程序喵大人。转载本文请联系程序喵大人公众号。

最近在调试Android Native层的内存泄漏问题,整理了一些笔记,分享一下

本文目录

如何查看内存信息?

在代码中打印,开启一个线程,间隔固定时间打印出当前内存信息【有好多种获取内存信息的API,这里只列出其中一种方式,亲测有效】

 
 
 
 
  1. private void startMemProfiler() { 
  2.     new Thread(new Runnable() { 
  3.         @Override 
  4.         publiC++ void run() { 
  5.             while (true) { 
  6.                 displayMemory(); 
  7.                 try { 
  8.                     Thread.sleep(2000); 
  9.                 } catch (InterruptedException e) { 
  10.                     e.printStackTrace(); 
  11.                 } 
  12.             } 
  13.         } 
  14.     }).start(); 
  15.  
  16. private void displayMemory() { 
  17.     final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
  18.     ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo(); 
  19.     activityManager.getMemoryInfo(info); 
  20.     Log.i(TAG, "系统剩余内存:" + (info.availMem / (1024 * 1024)) + "M"); 
  21.     Log.i(TAG, "系统是否处于低内存运行:" + info.lowMemory); 
  22.     Log.i(TAG, "当系统剩余内存低于" + (info.threshold / (1024 * 1024)) + "M" + "时就看成低内存运行"); 
  23.     Log.i(TAG, "系统已经分配的native内存:" + (Debug.getNativeHeapAllocatedSize() / (1024 * 1024)) + "M"); 
  24.     Log.i(TAG, "系统还剩余的native内存:" + (Debug.getNativeHeapFreeSize() / (1024 * 1024)) + "M"); 
  25.     Log.i(TAG, "系统的所有native内存大小:" + (Debug.getNativeHeapSize() / (1024 * 1024)) + "M"); 
 
 
 
 
  1. adb shell dumpsys meminfo / 
  2. adb shell dumpsys meminfo tv.danmaku.bili 

dumpsys meminfo显示的信息如图所示:

Android 关键内存项介绍

这里仅介绍我们需要重点关注的字段:

如何调试内存泄漏

matrix的使用

通过集成matrix库,可以选择hook某个动态链接库的malloc和free符号,然后工作方式和libctools类似,存储malloc的节点,free时候就删除该节点,最后统计内存泄漏情况。

matrix的集成方式可以看github库:https://github.com/Tencent/matrix

hook的原理可以看:https://github.com/iqiyi/xHook/blob/master/docs/overview/android_plt_hook_overview.zh-CN.md

如果出现内存泄漏,会有json和log后缀的文件,如图:

json文件会统计哪个库泄漏了多少内存,log文件会记录具体泄漏的堆栈信息。

拿到具体泄漏的堆栈信息后,可以通过addr2line工具定位到具体的代码:

 
 
 
 
  1. /Users/xxx/Android/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line -C -f -e /Users/xxx/project/java/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libBMMCapture-Android.so 83a70 

效果如图:

其它工具

dumpsys还有一些其它功能,使用方式如下:

复盘拍摄内存泄漏排查

背景:每次出现内存泄漏时,经常怀疑是某个模块或者其他库更新导致,但又没有证据,没有合适的排查内存泄漏的方法论。

分析与解决:

○内存泄漏:Android使用matrix,iOS使用Xcode

○cpu占用率:Android profiler, iOS Xcode

○gpu占用率:Android 高通使用snapdragonprofiler,或者perfdog(收费)

相关资料推荐

https://developer.android.com/topic/performance/memory-management?hl=zh-cn

https://developer.android.com/studio/profile/memory-profiler

https://developer.android.com/studio/command-line/dumpsys

https://github.com/iqiyi/xHook/blob/master/docs/overview/android_plt_hook_overview.zh-CN.md

参考资料

https://developer.android.com/studio/command-line/dumpsys

https://blog.csdn.net/pugongying1988/article/details/16838859

https://www.jianshu.com/p/8203457a11cc


新闻名称:研究了一波AndroidNativeC++内存泄漏的调试
链接URL:http://cdbrznjsb.com/article/dppgceo.html

其他资讯

让你的专属顾问为你服务