一、内存泄漏概述:内存泄漏监控可以监控app使用过程中,出现activity/fragment等组件不能被回收的的内存泄漏问题
监控原理:通过监听activity/fragment相关生命周期函数,监控其在GC时不能在被虚拟机正常回收的情形,dumo出hprf文件并上报分析,实现内存泄漏监控
三、检测场景
以activity为例,在其回调 onDestroy() 时由于其引用被其他长生命周期对象持有,导致 gc 时 activity 占用的内存空间不能被正常回收,从而判断发生内存泄漏。
内存泄露检测场景分为自动检测和主动检测,自动检测不需接入方做额外接入工作即可自动实现,主动检测需要接入方主动调用相关 api 实现。
3.1 自动检测场景
自动检测场景包含 activity、fragment 及 fragment对应view,分别监听如下生命周期方法实现:
- Activity#onDestory()
- Fragment#onFragmentDestroyed()(Android O以上)
- Fragment#onFragmentViewDestroyed()(Android O以上)
3.2 主动检测场景
主动检测场景需要接入方选取合适的时机、主动调用 PerfTest#leakWatch(Object watchedReference) 方法,实现监控任意对象泄露。
其中,“合适的时机” 一般为对象不再使用、已被销毁之后。
四、数据上报
SDK 在监控到内存泄露时会 dump 应用的内存信息并上报内存信息:
一、概述
重复bitmap监控,通过对内存泄漏监控项上报的 hprof文件进行进一步分析,提取其中包含的 重复bitmap 相关问题。
二、检测原理
重复bitmap问题是在内存泄露分析时新增了重复bitmap分析环节,如果分析存在不同 Bitmap 实例对应的图片完全相同(mBuffer内容相同)、且该不同实例的引用路径不同,即判定内存中存在重复bitmap问题,进而提取该bitmap相关信息并导出生成图片。
三、检测场景
由于 Android 8.0 开始将 bitmap 的 buffer 信息存储于 native 内存中,无法从 hprof 文件中提取并导出重复bitmap 对应的图片信息
分析 重复bitmap 问题
- 过滤 bitmap 实例
对比发现存在多个 Bitmap实例 buffer 内容完全一致。
灵魂拷问:同一张图片为何在内存中存在2个以上的Bitmap实例?
灵魂拷问:每一个 Bitmap 占用内存 4.49M,是否可以优化?如何优化?
- 提取 重复bitmap 的 bitmap引用链
根据引用链分析 bitmap 的引用情况,结合源码分析生成多个 bitmap 实例的原因以及优化方案。
5.2.4 手动导出图片
- 导出图片的 buffer 信息,文件名如:3383d190.data
- 使用 GIMP 打开保存的信息
使用 GIMP 打开 3383d190.data 文件,并设置下图中选中的三个选项:
a. 设置图片类型为 RGB Alpha
b. 设置图片宽高为 hprof文件中对应 Bitmap 实例的宽高
得到该 Bitmap 实例对应的原始图片