Android内存优化(二)之如何分析native heap

2023-05-16

如何获取native heap请阅读上篇文章,本篇文章将主要介绍如何分析一个native heap文件,以及我们的native memory leak问题如何发现并定位。

首先先来看一下实际中我们看到的native heap(我临时dump的com.android.settings进程的native heap):

Android Native Heap Dump v1.0

Total memory: 17898619
Allocation records: 32501
Backtrace size: 16

z 1 sz 585216 num 1 bt 00000074c95904ec 00000074b3a7fa94 00000074b3a29f38 00000074b3a38c84 00000074b3a389c8 00000074b3a38650 00000074b3a3339c 00000074c5b1bce8 00000074c89d3334 00000074c89d39f8 00000074c89d2090 00000074c89cee2c 00000074c89d6984 00000074c89d8678 00000074c89d95f0 00000074c5f6260c
z 1 sz 585216 num 1 bt 00000074c95904ec 00000074b3a7fa94 00000074b3a29f38 00000074b3a38c84 00000074b3a389c8 00000074b3a38650 00000074b3a3339c 00000074c5b1bce8 00000074c89d3334 00000074c89d39f8 00000074c89d2090 00000074c89cee2c 00000074c89d6984 00000074c89d8678 00000074c89d95f0 00000074c5f6260c
……….
MAPS
12c00000-52c00000 rw-p 00000000 00:05 134210 /dev/ashmem/dalvik-main space (region space) (deleted)
70c26000-70c44000 rw-p 00000000 103:05 3139681 /data/dalvik-cache/arm64/system@framework@boot.art
70c44000-70c46000 rw-p 00000000 103:05 3139683 /data/dalvik-cache/arm64/system@framework@boot-QPerformance.art
70c46000-70f2b000 rw-p 00000000 103:05 3139684 /data/dalvik-cache/arm64/system@framework@boot-core-oj.art
70f2b000-71071000 rw-p 00000000 103:05 3139686 /data/dalvik-cache/arm64/system@framework@boot-core-libart.art

我们平时dump出来的内存就是这种形式,主要包括了三类信息,第一类信息是此次dump的整体情况,主要涵盖Total memory,Allocation records,Backtrace size,第二类信息是具体的内存分配信息,形式如z 0 sz 400 num 1 bt 0000a230 0000b500,第三类信息是smaps内存映射信息,用来辅助native heap的分析。

native heap中的各种信息,具体是什么含义呢?有一段英文资料解释的比较清楚:

The data has this header:

Android Native Heap Dump v1.0

Total memory: XXXX
Allocation records: YYYY
Backtrace size: ZZZZ
Total memory is the total of all of the currently live allocations. Allocation records is the total number of allocation records. Backtrace size is the maximum number of backtrace frames that can be present.

Following this header are two different sections, the first section is the allocation records, the second section is the map data.

The allocation record data has this format:

z ZYGOTE_CHILD_ALLOC  sz    ALLOCATION_SIZE  num  NUM_ALLOCATIONS bt FRAMES
ZYGOTE_CHILD_ALLOC is either 0 or 1. 0 means this was allocated by the zygote process or in a process not spawned from the zygote. 1 means this was allocated by an application after it forked off from the zygote process.

ALLOCATION_SIZE is the size of the allocation. NUM_ALLOCATIONS is the number of allocations that have this size and have the same backtrace. FRAMES is a list of instruction pointers that represent the backtrace of the allocation.

Example:
z 0  sz      400  num    1  bt 0000a230 0000b500
z 1  sz      500  num    3  bt 0000b000 0000c000
The first allocation record was created by the zygote of size 400 only one with this backtrace/size and a backtrace of 0xa230, 0xb500. The second allocation record was create by an application spawned from the zygote of size 500, where there are three of these allocation with the same backtrace/size and a backtrace of 0xb000, 0xc000.

The final section is the map data for the process:

MAPS
7fe9181000-7fe91a2000 rw-p 00000000 00:00 0                              /system/lib/libc.so
.
.
.
END

那我们拿到这些信息如何分析呢?
AOSP中有个工具,可以直接分析,叫native_heapdump_viewer.py,下载连接:https://github.com/aosp-mirror/platform_development/blob/master/scripts/native_heapdump_viewer.py

Analyzing heap dumps

To analyze the data produced by the dumpheap command, run this script:

development/scripts/native_heapdump_viewer.py
In order for the script to properly symbolize the stacks in the file, make sure the script is executed from the tree that built the image.

To collect, transfer, and analyze a dump:

adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt
adb shell pull /data/local/tmp/heap.txt .
python development/scripts/native_heapdump_viewer.py --symbols /some/path/to/symbols/ heap.txt > heap_info.txt
At the moment, the script will look for symbols in the given directory, using the path the .so file would have on the device. So if your .so file is at /data/app/.../lib/arm/libx.so on the device, it will need to be at /some/path/to/symbols/data/app/.../lib/arm/libx.so locally given the command line above. That is: you need to mirror the directory structure for the app in the symbols directory.

感兴趣的可以看下native_heapdump_viewer,py的源码,尤其是从frames里如何将地址还原为哪个方法,对应哪个源文件的哪一行的过程,还是蛮精彩的~大体逻辑是首先根据frames信息找到smaps中的映射,看到底是哪个二进制文件,再根据symbols库的信息,结合方法地址在二进制文件中的映射偏移量,计算出在二进制文件中的相对地址,在根据add2line工具找到方法名称以及对应的行数~
简单看一下输出结果:

This outputs a file with lines of the form:

BYTES %TOTAL %PARENT    COUNT    ADDR LIBRARY FUNCTION LOCATION
5831776  29.09% 100.00%    10532     71b07bc0b0 /system/lib64/libandroid_runtime.so Typeface_createFromArray frameworks/base/core/jni/android/graphics/Typeface.cpp:68

   5831776 is the total number of bytes allocated at this stack frame, which is 29.09% of the total number of bytes allocated and 100.00% of the parent frame's bytes allocated. 10532 is the total number of allocations at this stack frame. 71b07bc0b0 is the address of the stack frame.

一般通过这种方式可以发现是某个函数调用最终分配了多少内存,但对于内存泄漏貌似没什么帮助~那怎么分析内存泄漏问题呢?

关注内存泄漏问题,主要是关注测试开始与测试结束时内存增长情况,在分析java heap时,可以借助MAT提供的hprof文件的相减,再看引用关系。那么在分析native heap时,是否也可以有类似的分析方法呢?

代码目前还不能给出,感兴趣的可以交流。简单的思路是:在native_heapdump_viewer.py再封装一层,就像MAT分析hprof文件一样,将start和stop两个heap文件信息load进内存后,根据backtraces的frames信息对heap进行整理与解析,然后根据frames为判断依据,将相同的部分相减,得到内存增长的部分,然后再解析heap增长部分的调用栈信息,还原到文件的某一行,可以直接点看到由哪个函数引起的内存增长,增长了多少,以及具体的调用栈是啥。这个可以按大小输出,这样更直观的看到引起内存增长的最大问题。大概就是这样。后面的两篇博客就是基于这个工具而衍生出的一些探索和讨论,甚至说改进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android内存优化(二)之如何分析native heap 的相关文章

  • Android--Jetpack的使用(一)

    目录 1 ViewModel 2 ViewModel 43 LiveData 3 ViewModel 43 LiveData 43 dataBinding 4 ViewModel 43 SavedStateHandle 43 LiveDat
  • Git 常用命令

    一 Git常用命令 1 配置用户名 xff08 上传代码的用户名 xff09 xff1a git config global user name 34 ljs 34 2 配置用户邮箱 xff08 其他作者联系你的邮箱 xff09 xff1a
  • 游戏开发图书推荐--我读过的技术经典图书

    很多同学问我学游戏开发应该看些什么书 xff0c 我在这里抛砖引玉 xff0c 给一份推荐表 xff0c 希望大家共同提高 由于本人英文不太好 xff0c 推荐的大部书籍都是国人编写的 xff0c 有些经典的外文图书可能是翻译不好 xff0
  • Git中使用.gitignore忽略文件的推送

    1 简介 在使用Git管理自己的代码版本时 xff0c 由于编译生成的中间文件 xff0c Git使用SHA 1算法来对文件进行加密 xff0c 进而得出来一个40位的十六进制加密字符串 325525d8b1f67b5ddd37956a8a
  • AFNetWorking3.0处理请求头和请求内容

    今天要处理用户的相关信息 xff0c 需要在HTTP请求中添加请求头 xff0c 网上大部分资料都是针对AFNetWorking2 0的 xff0c 我用3 0版本实现了相关功能 xff0c 见下面代码 首先是请求的URL xff0c sp
  • chrome浏览器安装插件,提示程序包无效

    chrome浏览器安装插件的时候 xff0c 如果提示 程序包无效 xff1a CRX HEADER INVALID xff0c 导致插件安装不上去 xff0c 这个时候该怎么办呢 xff1f 通常 xff0c 这种错误在chrome浏览器
  • viewpage+radiogroup

    lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 http schemas android com apk
  • 线程执行设置超时时间

    import java util concurrent 记录 xff0c 备忘 线程执行设置超时时间 public class Main2 定义线程池 xff0c 推荐手动创建线程池 xff1a https blog csdn net LL
  • Java集合工具类Collections常用方法详解

    文章目录 1 Collections介绍2 Collections常用方法2 1 reverse 2 2 sort 2 3 swap 2 4 min 和max 2 5 copy 2 6 fill 2 7 replaceAll 2 8 shu
  • 智慧小区智能物业管理系统综合解决方案

    因为传统的办公方式效率低 xff0c 工作强度大 人们需耗费大量的时间和精力去手工处理那些繁杂 重复的工作 xff0c 而手工处理的延时和差错 xff0c 正是现代化管理中应该去除的弊端 又由于物业管理企业的启动基金不足 xff0c 多种经
  • LAMP基础搭建

    目录 一 LAMP 1 LAMP环境 2 组成部分 xff08 1 xff09 Linux xff08 平台 xff09 xff08 2 xff09 Apache xff08 前台 xff09 xff08 3 xff09 Mysq xff0
  • python获取子窗口句柄

    2022 09 17 python获取子窗口句柄 python获取窗口句柄 python获取进程 python获取电脑微信小游戏的窗口句柄 上图为按键精灵的工具 python3 xff0c 简单的获取了下句柄 xff0c 想改改内存的 xf
  • Linux多线程编程(三)-----生产者与消费者(条件变量,信号量)

    Linux多线程编程 xff08 一 xff09 xff1a http blog csdn net llzk article details 55670172 Linux多线程编程 xff08 二 xff09 xff1a http blog
  • 微策略的笔试题

    觉得在收获Offer的季节应该为自己积累些人品了 xff0c 在这里将今天的情况向所有求Offer的童鞋分享下 从上个周末开始反应迟钝的我终于有了些求Offer的感觉 xff0c 几天参加了4场面试 xff0c 基本上没觉得有很大的挑战 x
  • 线程池定时任务添加任务以及停止线程

    最近有个需求 就是项目启动的时候需要创建个线程池去执行 而且有时间周期 而且根绝不同的情况可以随时通过接口停止该线程 1首先创建个线程池 默认核心为10 static ScheduledExecutorService threadPool
  • 冰冻三尺非一日之寒-自学篇 浅谈个人学习方法

    昨晚还在看比赛 xff08 war3 xff09 xff0c 小源跑过来问我明天1024 xff0c 不写篇文章么 xff0c 想想也是 xff0c 1024这也算个热点 xff0c 赶紧来蹭蹭 xff0c 哈 xff0c 开个玩笑 上次谈
  • 【附源码】Java计算机毕业设计社区团购服务系统(程序+LW+部署)

    项目运行 环境配置 xff1a Jdk1 8 43 Tomcat7 0 43 Mysql 43 HBuilderX xff08 Webstorm也行 xff09 43 Eclispe xff08 IntelliJ IDEA Eclispe
  • iOS---iOS10适配iOS当前所有系统的远程推送

    一 iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现 每一年都会更新一些新的用法 譬如iOS7出现的Silent remote notifications 远程静默推送 iOS8出现的Category 分类 也可称之为快捷回复
  • iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中 xff0c UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil xff0c 即创建的是UIApplication类型的对象 xff0c 此对象看成是整个
  • 【疯狂造轮子-iOS】JSON转Model系列之一

    1 前言 之前一直看别人的源码 xff0c 虽然对自己提升比较大 xff0c 但毕竟不是自己写的 xff0c 很容易遗忘 这段时间准备自己造一些轮子 xff0c 主要目的还是为了提升自身实力 xff0c 总不能一遇到问题就Google 之前

随机推荐

  • 解决fastboot 刷 system.img 尺寸限制问题

    fastboot S xxxM flash system system img 其中 S 后面为单次上传大小 C platform tools gt fastboot S 300M flash system system img sendi
  • 修改Gnome Terminal窗口的默认大小

    修改Gnome Terminal窗口的默认大小 以前一直比较别扭的是 xff0c Gnome Terminal窗口打开时总那么小 曾经找半天也不知道在哪里改 xff0c 甚至在官方论坛里也没查到 今天偶然间想到那个Preferred App
  • 前端基础练习题

    变量命名规则 xff1a 1 只能由字母 数字 下划线 美元符号组成 xff0c 并且不能以数字开头 2 变量命名要有意义 xff0c 杜绝a01 b0046 3 变量遵循小驼峰规则 第一个单词全小写 xff0c 从第二个单词开始 xff0
  • Unity5-ABSystem(三):AssetBundle加载

    Unity特殊路径 ResourcesStreamingAssetsPathPersistentDataPathDataPath 同步加载 核心函数安卓平台下不能同步加载问题示例 异步加载 核心函数示例WWW异步加载 资源加载 核心函数 加
  • Unity5-ABSystem(五):AssetBundle内存

    AssetBundle内存占用 建议 实测 www加载实测LoadFromFile加载实测 建议 AssetBundle内存占用 先上图 xff0c Don t panic 我们从AssetBundle中加载资源一般会经过三个步骤 xff1
  • Java中String字符串长度

    String类是Java中最为常用的类 xff0c 我们知道String是个final类 xff0c 不能修改内容 但是String类型是否有长度限制呢 xff0c 下面来一探究竟 想要搞清楚这个问题 xff0c 首先我们需要翻阅一下Str
  • 安装BBR时出现Error: Install elrepo failed, please check it.

    安装BBR时出现Error Install elrepo failed please check it Press any key to start or Press Ctrl 43 C to cancel curl 35 SSL conn
  • mac卸载mysql教程(按照步骤可完全卸载)

    Mac下卸载mysql的方法 xff1a 大部分卸载是因为版本高 1 关闭mysql 查看mysql是否启动 xff1a ps ef grep mysql 2 输入 xff1a kill 9 然后回车 xff0c 关闭mysql 3 卸载
  • 全网最简单Win10桌面美化教程,只需4步!!

    时间过得真滴快呀 xff01 咋眼就10月了 不知道国庆期间 小伙伴们是外出旅游 还是宅在家里哪里也没去 或者更悲催一点 还在国庆加班抑或因为疫情正在隔离 无论大家处于任何状态 小七都要在这里祝大家 xff1a 国庆节快乐 吉祥话说完了 下
  • Pycharm配置Jupyter Notebook实现本地开发与调试

    Pycharm专业版中集成了Jupyter Notebook xff0c 方便用户编辑 xff0c 执行和调试Notebook代码 xff0c 并检查执行输出 个人感觉 xff0c 相比于Jupyter提供的网页编辑器 xff0c Pych
  • Zookeeper选举机制介绍

    ZooKeeper是一个高可用的分布式协调服务 xff0c 它的核心功能之一就是选举机制 当ZooKeeper集群中的一个节点宕机时 xff0c 需要通过选举机制来选出一个新的leader节点 xff0c 确保集群的正常运行 下面是ZooK
  • redis实现布隆过滤器

    Redis是一种基于内存的数据存储系统 xff0c 具有高性能 高可用性 高扩展性等特点 xff0c 因此被广泛用于实现布隆过滤器 以下是一种基于Redis实现布隆过滤器的方案 xff1a 创建一个长度为m的位数组 xff08 bit ar
  • 解决shiro的登录成功后跳转到自定义error.html的问题

    解决shiro的登录成功后跳转到error html 1 先说一下问题现象 xff1a saas项目中 xff0c 登录成功之后 xff0c 跳转了error html xff0c 停顿一会儿后进入主页面 2 说一下我处理这个问题的步骤 x
  • 喜茶皇茶茶叶带您走上致富之路

    我国是茶文化的发源地 xff0c 尤其是南方各类品种的茶层出不穷 xff0c 茶韵茶香引人入胜 消费者生活水平大幅提高 xff0c 饮茶几乎已经成为一种时尚 xff0c 皇茶 在市场上受到大家的认可与喜爱 xff0c 短短时间内迅速发展壮大
  • 处理Spire.Pdf 生成书签有 Evaluation Warning : The document was created with Spire.PDF for .NET.字样的问题

    处理spire Pdf生成时的警告信息 这俩天在使用spire Pdf生成书签的时候总是会有Evaluation Warning The document was created with Spire PDF for NET 的警告字样 x
  • Android Drawable Preview插件适配Android Studio4.1版发布

    Android Drawable Preview是一个在安卓开发中非常有用的AS IDEA插件 可以将drawable资源文件的icon替换成内容的预览图 达到不需要打开资源文件 快速预览内容的功能 实在是非常的方便快捷 让开发工作更加的愉
  • 变频器的逆变、变频原理

    变频器的逆变 变频原理 YJZhang 从事制造业质量管理 xff0c 做过PCBA 线束 电话机 变频器行业 90 人赞同了该文章 变频器将直流电转变为交流电的这个过程叫 逆变 xff08 inverting 先讲逆变过程 xff0c 分
  • ubuntu20.04设置自动文字模式登录

    文字模式登录后取得的程序称为 Shell xff08 壳 xff09 xff0c Linux 的壳程序是bash xff08 Bourne Shell的增强版本 xff09 设置文字模式登录 xff1a 第一步 xff1a 进入grub文件
  • 从高考到程序员

    记得当年进入考场的时候也是志气满满 xff0c 心里念叨着一定要考上自己理想的大学 xff0c 光宗耀祖 当时坐在学校安排的bus上向考场的方向行进 xff0c 看到路边的交警叔叔 xff0c 情不自禁的喊了一声 xff0c 交警大哥辛苦了
  • Android内存优化(二)之如何分析native heap

    如何获取native heap请阅读上篇文章 xff0c 本篇文章将主要介绍如何分析一个native heap文件 xff0c 以及我们的native memory leak问题如何发现并定位 首先先来看一下实际中我们看到的native h