[原理] Android Native内存泄漏检测原理解析
转载请注明出处: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内存泄漏检测原理解析的更多相关文章
- [教程] Android Native内存泄漏检测方法
转载请注明出处:https://www.cnblogs.com/zzcperf/p/9563389.html Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/ ...
- 利用Android Studio、MAT对Android进行内存泄漏检测
利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...
- Android Native 内存泄漏系统化解决方案
导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...
- Android 内存泄漏检测工具 LeakCanary(Kotlin版)的实现原理
LeakCanary 是一个简单方便的内存泄漏检测框架,做 android 的同学基本都收到过 LeakCanary 检测出来的内存泄漏.目前 LeakCanary 最新版本为 2.7 版本,并且采用 ...
- 【Android内存泄漏检测】LeakCanary使用总结
一.什么是LeakCanary? LeakCanary就是用来检测Android端内存泄漏的一个工具.能够检测Activity的泄漏 什么是内存泄漏? Java 对象有时也会”长死不死“,GC 拿它没 ...
- Android内存泄漏检测利器:LeakCanary
Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...
- android 内存泄漏检测工具 LeakCanary 泄漏金丝雀
韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 内存泄漏检测工具 android 内存泄漏检测工具 ======== 内存泄漏 就是 无用的对 ...
- Android 性能优化之内存泄漏检测以及内存优化(中)
https://blog.csdn.net/self_study/article/details/66969064 上篇博客我们写到了 Java/Android 内存的分配以及相关 GC 的详细分析, ...
- 为什么各大厂自研的内存泄漏检测框架都要参考 LeakCanary?因为它是真强啊!
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
随机推荐
- LoRa联盟的简介
LoRa联盟成立于2015年3月,从成立开始,LoRaWAN规范就在不断更新,从1.0.0版本已更新至1.0.2版本,目前能公开下载的事2016年7月完成的1.0.2版本,可以看到该规范的主要作者包括 ...
- IDEA通过file-open打开以前的项目无法运行
在学习java的过程中我们会建立很多项目,IDEA默认打开最近一次编辑的项目,当我们打开以前的项目时会发现run图标变成灰色了, 解决办法: 1. 手动设置src为根目录 选中src目录--右键--m ...
- 令人惊叹的百度Echarts,大数据分析的必备工具
学习目录 1.可视化面板介绍 1.1技术要点 1.2案例适配方案 1.3页面主体布局2.Echarts(重点) 2.1echarts介绍 2.2echarts体 ...
- php中Standard中配置选项,在TargetFrameworks环境下如何输出库存
在.NET Standard/.NET Core技术出现之前,编写一个类库项目(暂且称为基础通用类库PA)且需要支持不同 .NET Framework 版本,那么可行的办法就是创建多个不同版本的项目( ...
- python开发基础(二)运算符以及数据类型之dict(字典)
# encoding: utf-8 # module builtins # from (built-in) # by generator 1.147 """ Built- ...
- 题解 AT3877 【[ARC089C] GraphXY】
参考的博客 在[有趣的思维题]里看到了这道题. 题意: 给出一个\(A\times B\)的矩阵,其中第i行第j列元素为\(d_{i,j}\),试构造一个有向图,满足: 有向图点数\(\le 300\ ...
- leetcode144 longest-palindromic-substring
题目描述 找出给出的字符串S中最长的回文子串.假设S的最大长度为1000,并且只存在唯一解. Given a string S, find the longest palindromic substr ...
- 【转载】Apriori
通过这个博客学习:数据挖掘十大算法(四):Apriori(关联分析算法) 代码也是摘自上面博客,对照代码理解理论部分可能更加有助于对该算法的理解 from numpy import * # 构造数据 ...
- 十个Pycharm快捷键——提升效率
一些比较实用的Pycharm的快捷键,提升编写开发效率. 1.解除语法限制 默认情况下,Pycharm会对代码进行检查,包括但不仅限于代码是否有语法错误,是否符合PEP8规范. 如命名检查,如下图 变 ...
- mysql实现当前行的值累加上一行的值
数据库钱包表有日期.收入.支出三个字段.用mysql语句计算每日余额,得如下结果 select m.*, @total :=@total + 收入 - 支出 as 钱包余额 ( select * fr ...