转载请注明出处:https://www.cnblogs.com/zzcperf/articles/11615655.html

上一篇文章列举了不同版本Android OS内存泄漏的检测操作(传送门),这一篇说一下Android Native内存泄漏检测的原理。

之前所说的内存泄漏检测,主要借助了Android 原生的libc_malloc_debug.so,这一种检测方法分为以下三步:

记录内存分配的调用栈 -> 输出当前进程尚未释放的内存对应的申请调用栈 -> 找出内存泄漏的调用栈。

其实是围绕记录内存分配的调用栈这个主题。

  • 记录内存分配的调用栈

为了输出尚未释放内存的调用栈,内存分配时需要记录当时的调用栈,释放内存时,也要删除相应内存申请时调用栈的信息。

内存泄漏的代码往往重复执行而没有释放,所以才导致严重的内存占用问题。

这些内存申请都有相同的调用栈,所以libc_malloc_debug.so以调用栈为Key,使用哈希表保存尚未释放的内存申请记录。

每次申请内存时,会额外申请分配一个头部指针,并在哈希表中记录本次的内存申请,最后将头部指针指向哈希表中的记录。

对于之前已经记录过内存分配调用栈,就只需要对分配次数自增即可。

-> PointerData::AddBacktrace(size_t num_frames)

每次释放内存时,就根据头部指针,消去哈希表中对应的记录。

-> PointerData::RemoveBacktrace(size_t hash_index)

提取哈希表的记录,就是进程当前尚未释放的内存记录

-> PointerData::GetInfo(uint8_t** info, size_t* overall_size, size_t* info_size, size_t* total_memory, size_t* backtrace_size)

  • 输出当前进程尚未释放的内存对应的申请调用栈

Android N OS之后,Google有native_heapdump_viewer.py脚本,已经不需要我们自己写代码来解析获得的哈希表内容了。

这里补充略微尴尬的一点,Android N在返回结果的时候,将保存分配次数的变量,错误地赋值为调用栈栈帧数,导致脚本不得不作出规避和适配。

有兴致围观谷歌bug的话,可以对比Android N 和 O返回信息的函数:

void TrackData::GetInfo(DebugData& debug, uint8_t** info, size_t* overall_size, size_t* info_size, size_t* total_memory, size_t* backtrace_size)

  • 找出内存泄漏的调用栈

native_heapdump_viewer.py生成的HTML文件,是树状结构。树的每一个节点代表一个栈帧,叶子节点就是申请内存的地方。

通过对比重新20次和40次的HTML文件,找上升最快的调用栈,就基本上是内存泄漏的地方。

[原理] Android Native内存泄漏检测原理解析的更多相关文章

  1. [教程] Android Native内存泄漏检测方法

    转载请注明出处:https://www.cnblogs.com/zzcperf/p/9563389.html Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/ ...

  2. 利用Android Studio、MAT对Android进行内存泄漏检测

    利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...

  3. Android Native 内存泄漏系统化解决方案

    导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...

  4. Android 内存泄漏检测工具 LeakCanary(Kotlin版)的实现原理

    LeakCanary 是一个简单方便的内存泄漏检测框架,做 android 的同学基本都收到过 LeakCanary 检测出来的内存泄漏.目前 LeakCanary 最新版本为 2.7 版本,并且采用 ...

  5. 【Android内存泄漏检测】LeakCanary使用总结

    一.什么是LeakCanary? LeakCanary就是用来检测Android端内存泄漏的一个工具.能够检测Activity的泄漏 什么是内存泄漏? Java 对象有时也会”长死不死“,GC 拿它没 ...

  6. Android内存泄漏检测利器:LeakCanary

    Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...

  7. android 内存泄漏检测工具 LeakCanary 泄漏金丝雀

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 内存泄漏检测工具 android 内存泄漏检测工具 ======== 内存泄漏 就是  无用的对 ...

  8. Android 性能优化之内存泄漏检测以及内存优化(中)

    https://blog.csdn.net/self_study/article/details/66969064 上篇博客我们写到了 Java/Android 内存的分配以及相关 GC 的详细分析, ...

  9. 为什么各大厂自研的内存泄漏检测框架都要参考 LeakCanary?因为它是真强啊!

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

随机推荐

  1. POI CellStyle 中样式覆盖问题

    问题描述 在使用 Apache POI-3.8的时候,需要一个功能,就是处理上传得 Excel的 cell style.如果数据有错误,则标红或者加上其他 style 标识.但是当直接获取到 cell ...

  2. 二叉树、平衡二叉树、B-Tree、B+Tree 说明

    背景 一般说MySQL的索引,都清楚其索引主要以B+树为主,此外还有Hash.RTree.FullText.本文简要说明一下MySQL的B+Tree索引,以及和其相关的二叉树.平衡二叉树.B-Tree ...

  3. Docker(1)- 什么是 Docker

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 备注 这里的概念直接引用官方的, ...

  4. @Transactional 注意事项、方法调用

    1.同一个类中,即A与B在同一类中,A()调用B()方法,A不加 @Transactional 事务注解,B加 @Transactional 事务注解,则B中的事务不起作用,A加事务,才会起作用,B中 ...

  5. MYSQL连接时错误码2059解决办法

     一.问题原因: 如上图的报错提示可知,报错原因是caching_sha2_password不能加载. 这是因为8.0之后mysql更改了密码的加密规则,而目前已有的客户端连接软件还不支持Mysql8 ...

  6. numpy数组运算

    一.四则运算   (以此为例) 1.加法 2.减法 3.乘法 4.除法 5.幂运算 二.比较运算   (以此为例) 1.<   > 2.>=    <= 3.==    != ...

  7. vue API 知识点(1)---全局 API 总结

    1.Vue.extend(options) 构造器,创建一个 子类 .参数是一个包含组件选项的对象 data 选项是特例,需要注意 在 Vue.extend() 中它必须是一个函数, <div ...

  8. 【SpringBoot】07.SpringBoot文件上传

    SpringBoot文件上传 1.编写html文件在classpath下的static中 <!DOCTYPE html> <html> <head> <met ...

  9. 2020年的UWP(3)——UWP和desktop extension的简单交互

    上一篇<2020年的UWP(2)--In Process App Service>中我们了解了UWP和Desktop Extension可以通过AppService进行数据交互.本篇我们就 ...

  10. jquery DataTable插件使用自定义搜索

    $(function () { $("#pk_status").change(function () { valid = $(this).val(); if(valid){ tab ...