You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
合作与生态
支持与服务
开发者
了解我们
导航

内存分析

更新时间:2022.12.06 17:50:58

内存问题是Android App稳定性、性能相关问题里占比较高、影响面较大、难以分析定位和解决的一类问题,挑战难度较大。因此,内存分析和归因、内存监控等手段也是APM里非常重要、实用的工具方法。本专项为您提供全维度的内存实时监测和专项分析、归因功能。

内存全维度指标

打开PC端软件,连接好手机,选择应用,进入 “性能评测” 专栏,选择指标:内存总览、内存模块概览、内存分配详情,单击开始,开启内存全维度指标实时监测功能。在App里打开要监测的功能场景或者页面,查看指标走势。

具体的指标含义说明请参考 性能测试-内存

内存分析:JavaHeap

dump JavaHeap

JavaHeap是App运行时的Java堆内存,通过dump(堆转储)功能可以将内存的瞬时状态(内存快照:记录了内存使用、Class类信息、objects对象分配、引用链、堆栈、线程、GC等详细信息)以特定格式(HPROF_AGENT协议)导出为Android本地文件,再通过adb pull将文件从Android本地拉回到PC里进一步处理和展开下文的分析。

功能说明

  • 手动触发GC:手动发起GC释放无用对象占用内存,dump前自动执行。 注意该功能目前仅支持到root手机上。

  • 手动dump hprof:手动dump heap获取hprof文件,自动解析,展示结果(总览、大对象、小对象、内存泄漏、图片等)。

  • 本地上传hprof:除了手动dump实时内存快照外,还可以通过上传本地的已有的hprof文件,从原始堆转储文件里解析出结果,省去dump及pull操作。

  • 本地上传json:dumpHeap过程中不仅保存了原始hprof文件,还保存了分析过程中产生的中间结果文件xx.json,通过手动上传该文件,直接读取并展示结果,省去dump及分析过程。

  • hprof解析:按HPROF_AGENT协议解析特定的模块,提取对象关键信息,裁剪加工、分类、汇总等,是一个耗时操作,视内存堆大小执行5-20s甚至更长时间,期间有进度条loading态指标。

  • hprof文件历史记录:每一次dumpHeap操作完成后,会记一次历史记录,单击下拉菜单选择历史记录,同时刷新数据列表。历史文件命名规则:yyyyMMddHHmmss.hprof。

JavaHeap总览

概览和汇总分析本次dump到的内存使用状况,主要包括以下四项:

  • 按比例饼图展示Top10(RetainSize)大对象
  • 按比例饼图展示Top10(Allocations)小对象
  • 按比例饼图展示Top10(RetainSize)内存泄漏对象
  • 按比例饼图展示Top10(RetainSize)图片

大对象列表

列表查询详细的展示JavaHeap中大对象(RetainSize >= 500KB)的名称、数量、内存占用ShallowSize以及RetainSize情况。列表Item项详细描述了对象的类名、对象名(Object/Class name),对象自身占用大小(ShallowSize),对象被释放后可腾退空间大小(RetainSize)。

  • 输入关键字,按对象名称进行过滤查询。

  • 单击名称,显示该对象的变量列表、兑现引入链等详细信息。

大对象详情

变量信息展示了该对象的成员fields及static fields的变量名、ShallowSize、RetainSize。

引用链展示了该对象被引用的调用链层级关系,每层的对象名、对象ID、in类名、Depth层级及RetainSize。

小对象列表

列表查询详细的展示JavaHeap中小对象( RetainSize < 500KB)的名称、数量、内存占用ShallowSize以及RetainSize情况。列表Item项详细描述了对象的类名、对象名(Object/Class name),对象自身占用大小(ShallowSize),对象被释放后可腾退空间大小(RetainSize),小对象数量(Allocations)。

  • 输入关键字,按对象名称进行过滤查询。

  • 单击名称,显示搞对象的children列表,展开child项,显示该对象的引用链详细信息。

小对象详情

  • children列表单击可展开[+]的item项,显示children列表,列表项同上。

  • 引用链展示了该对象被引用的调用链层级关系,每层的对象名、对象ID、对象类名、in 类名、Depth层级、RetainSize及Allocations。

内存泄漏分析

内存泄漏是指不合理使用内存造成一些内存对象无法被回收的问题,是一种常见的、同时又不太容易被发现的内存问题。内存泄漏问题久经积累,可能会引起大量对象无法被回收,大量内存占用,最终可能OOM,造成App崩溃。通过本功能自动查找与分析出内存泄漏点,帮助您发现隐藏在代码逻辑里的Bug,及时处理,科学合理使用内存。

  • 内存泄露列表展示了App里存在的泄漏点Activity/Fragment对象类名称。列表项由Name对象名/类名、ShallowSize、RetainSize构成。

  • 单击列表Item展示GCRoots。GCRoot是某个GCRoot的对象名、对象ID、对象类名。

  • 引用链展示了该对象被引用的调用链层级关系,每层的对象名、对象ID、 in 类名、Depth层级及RetainSize,帮助您找到详细的泄漏原因。

图片内存分析

图片Image组件是App内使用非常高频的组件,特点是数量较多、内存占用较大、对象创建与销毁较快、易发问题。如何合理的使用图片对于内存的优化十分有必要。本功能通过专门筛选图片类对象进行专项分析,监控所有图片对象的基础和引用链、原始数据信息等,并对于不合理使用点、内存泄漏等给出归因解释,帮助您更好的监控App内图片的使用。

  • 图片列表展示了所有hprof中的Bitmap对象,列表项由图片对象ID、图像分辨率、对象占用内存大小、图片缩略(可能为空,取决于是否有hook到图片原始数据,目前先保留占位但无信息,后续完善SDK后可能会hook到原始数据,更直观指示图片)、错误归因构成。

  • 引用链展示了该对象被引用的调用链层级关系,每层的对象名、对象ID、in类名、Depth层级及RetainSize。

公共功能

  • 按对象名称搜索及过滤对象列表
  • 列表可能有翻页功能,每页最大50个
  • 可能有空列表、不可操作等状态页