转载请注明出处: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. 二叉树、平衡二叉树、B-Tree、B+Tree 说明

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

  2. 走在深夜的小码农 Seventh Day

    Css3 Seventh Day writer:late at night codepeasant 学习大纲: 1. 定位(position) 介绍 1.1 为什么使用定位 我们先来看一个效果,同时思 ...

  3. map+area标签

    map标签是用于定义一个客户端的图像映射即带有可点击区域的一幅图像,配合area标签 area 元素永远嵌套在 map 元素内部.area 元素可定义图像映射中的区域 例:要实现一幅地图上鼠标点击或者 ...

  4. 简单粗暴套娃模式组json发送https请求

    各位童鞋大家好,向来简单粗暴的铁柱兄给大家来玩一手套娃模式来组Json数据,不说别的,无脑套. 当然,这一手比较适合临场用一下,若长期用的话建议搞一套适用的框架,只管set就好了.话不多说开始上课. ...

  5. redis的rdb与aof持久化机制

    Redis提供了两种持久化方案:RDB持久化和AOF持久化,一个是快照的方式,一个是类似日志追加的方式 RDB快照持久化 RDB持久化是通过快照的方式,即在指定的时间间隔内将内存中的数据集快照写入磁盘 ...

  6. 【Kata Daily 190929】Password Hashes(密码哈希)

    题目: When you sign up for an account somewhere, some websites do not actually store your password in ...

  7. 5.1 ICommand

    1. CanExecute实现 只是将命令绑定到特定控件是不会触发CanExecute方法执行,该方法只是在实例化命令的时候才使用,其余如果需要触发该事件,只能通过后台代码组合触发,如更新一个后台类字 ...

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

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

  9. 面试题:你有没有搞混查询缓存和Buffer Pool

    一. 关注送书!<Netty实战> 文章公号号首发!连载中!关注微信公号回复:"抽奖" 可参加抽活动 首发地址:点击跳转阅读原文,有更好的阅读体验 使用推荐阅读,有更好 ...

  10. Zabbix实现电话告警通知的配置方法分享

    如果要讨论下当下热门的监控系统,我想zabbix应该能够占有自己的一席之地,拥有不小的话语权吧.然而身为一名苦逼的运维,为了不错过重大的告警信息,就需要配置个[电话告警]来进行最快速的通知. zabb ...