标签归档:内存泄漏

ActivityThead.mNewActivities导致的内存泄漏

昨天有测试报告说这个版本的应用在重复跑测试case的时候内存不断变大

由于测试case会重复启动activity首先就怀疑是不是activitty导致的内存泄漏

Adb shell dumpsys meminfo [packagename]

通过dump 信息,发现activity的实例确实在不断变多,但查阅代码并未发现任何持有引用的地方

android studio profile来 dump内存信息发现最短的引用路径来自android os. ActivityThead

开始有点不信,不觉得系统的引用的会导致内存不断增加,然后再次使用MAT分析

发现确实来自ActivityThead.mNewActivities

源码分析

通关简单分析发现mNewActivities 是一个链表

搜索关键字发现仅仅只在ActivityThead.Idler这个私有类里进行了引用释放,这个

MessageQueue.IdleHandler 这是一个接口,查阅注释发现这个接口仅仅只有当前线程 MessageQueue 空闲之后才会回调 查看更多

android 内存泄漏分析

一、使用android studio profile分析

android studio 相比mat来说优势在于可以分析native内存的大小,例如Bitmap等,而mat不能分析native内存。

这里以android studio 3.42为例 ,方法如下

第一步、选择右上角profile app


第二步、选择 运行设备

第三步、点击中间的memory区域,让左上角出现dump 按钮

第四部、点击左上角区域的gc按钮,然后点击dump按钮

第五步、找出其中内存较大的实例或者对象较多的实例(这里选用bitamp)

简单说明一下这里的参数

Allocations: 表示这个类实例有多少个,实例越多占用的内存越大

Shallowsize:表示这个类仅仅自身占用的内存大小,不包含引用的对象和native的大小

NativeSize :表示这个对象native的内存大小

retainedsize:表示这个对象+引用对象+native对象的大小,分析内存泄漏时,可以从这里入手

另外:点击以上各个参数可以按照参数来进行排序

第六步,选择需要查看的对象

下面显示的是reference,上面显示的是对象的详细信息

depth表示引用链的深度,当对象比较多的时候,尤其是发现对象是被一个链表引用,可以通过,选择最浅的depth来找到节点 查看更多