文末本文转载自微信公众号「程序喵大人」,作者程序喵大人。转载本文请联系程序喵大人公众号。
最近在调试Android Native层的内存泄漏问题,整理了一些笔记,分享一下
在代码中打印,开启一个线程,间隔固定时间打印出当前内存信息【有好多种获取内存信息的API,这里只列出其中一种方式,亲测有效】
- private void startMemProfiler() {
- new Thread(new Runnable() {
- @Override
- publiC++ void run() {
- while (true) {
- displayMemory();
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- }
- private void displayMemory() {
- final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
- ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
- activityManager.getMemoryInfo(info);
- Log.i(TAG, "系统剩余内存:" + (info.availMem / (1024 * 1024)) + "M");
- Log.i(TAG, "系统是否处于低内存运行:" + info.lowMemory);
- Log.i(TAG, "当系统剩余内存低于" + (info.threshold / (1024 * 1024)) + "M" + "时就看成低内存运行");
- Log.i(TAG, "系统已经分配的native内存:" + (Debug.getNativeHeapAllocatedSize() / (1024 * 1024)) + "M");
- Log.i(TAG, "系统还剩余的native内存:" + (Debug.getNativeHeapFreeSize() / (1024 * 1024)) + "M");
- Log.i(TAG, "系统的所有native内存大小:" + (Debug.getNativeHeapSize() / (1024 * 1024)) + "M");
- }
- adb shell dumpsys meminfo /
- adb shell dumpsys meminfo tv.danmaku.bili
dumpsys meminfo显示的信息如图所示:
这里仅介绍我们需要重点关注的字段:
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工具定位到具体的代码:
- /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++内存泄漏的调试
文章网址:http://www.shufengxianlan.com/qtweb/news28/440928.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联