Android内存泄漏分析总结

1. android studio 下如何dump heap

Paste_Image.png

如图所示,在android studio下dump内存操作还是比较方便的。大致就是在minitor里面操作。

恩,直接将得到的hprof导入mat(如果是使用 android studio的话,需要自己去下载Eclipse插件mat分析工具)。结果是这样的:

Paste_Image.png

需要在android sdk的platform-tools 中

hprof-conv in.hprof out.hprof

ok, 转换完成,终于可以愉快玩耍了~~

不过,一般程序员自己去dump的情况下很少,一般通过三方工具去记录(如leakcanaryhttps://www.liaohuqiu.net/cn/posts/leak-canary-read-me/ 等其他工具去记录或主动查看内存泄漏)。

2. MAT 分析工具的常用功能

1 dominator_tree 比较常见的

Paste_Image.png

左边可以输入正则表达式进行查找(Regex那),右边Shallow heap:指对象自身所占用的内存大小,不包含其引用的对象所占的内存大小 Retained Heap是指除去GC root引用后,该对象的所有引用。 可以参见这篇文章http://blog.csdn.net/hhww0101/article/details/8133219

2. Histogram

Paste_Image.png

Objects 一栏,是指对象的个数

3. Group 分类查看

Paste_Image.png

可以按类,superclass, class loader 及包 分类显示。

4. 查找该对象的GC Roots的路径

即引用链,非常重要,基本上我们的内存分析得到信息都是在排除如图所示的weak和soft引用之后的,看是否还存在强引用。

Paste_Image.png

Paste_Image.png

3. 常见的内存泄漏举例

1. 内部类持有外部引用 项目中目前未发现(如Thread、TimerTask、Asynctask)

2. 广播注册

leaklocmanager.png

这里说明下, this$0 表示的是外部类。 这里还包含一些系统的Manager管理的service,如sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);需要调用 unregisterListener()方法解开注册。

3. 单例持有callback

leak1.png

4. 动画未停止

leak4.png

4. 常见的误报

Paste_Image.png

看图正在垃圾回收中,故不属于内存泄漏。

Paste_Image.png

5. tips

还有一些系统自身的bug,如一些系统的持有input method造成editText泄漏等。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT探索

java学习笔记

842
来自专栏Pythonista

Django基础教程

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于...

3732
来自专栏Python爱好者

Java基础笔记11

1204
来自专栏云计算教程系列

如何在Debian 9上使用Python 3设置Jupyter笔记本

Jupyter Notebook为交互式计算提供了一个命令shell作为Web应用程序。该工具可以与多种语言一起使用,包括Python,Julia,R,Hask...

2003
来自专栏蓝天

细节决定品质:不良的if/else使用习惯

这个时候应当考虑提取成函数调用,以减少直接的if/else嵌套层次。同理,while/for也应当避免这种情况。

901
来自专栏mini188

Openfire的启动过程与session管理

说明 本文源码基于Openfire4.0.2。 Openfire的启动     Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openf...

2888
来自专栏Coco的专栏

【基础进阶】URL详解与URL编码

1869
来自专栏Petrichor的专栏

git: .gitignore文件 (忽略文件)

Note: 切记目录名后面 一定要加 反斜杠 / ,不然会当成 单文件 处理。

1282
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第9章 轻量级线程:协程(2)《Kotlin极简教程》正式上架:

如果需要依次调用它们, 我们只需要使用正常的顺序调用, 因为协同中的代码 (就像在常规代码中一样) 是默认的顺序执行。下面的示例通过测量执行两个挂起函数所需的总...

1242
来自专栏Jacklin攻城狮

iOS,面试必看,最全梳理

目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送...

2122

扫码关注云+社区

领取腾讯云代金券