内存分析工具使用-----实践篇

先制造一个内存泄露。
内存泄漏的几个方式

1.webview
2.单例持有activity的context;
3.handler持有activity的context(本质是匿名内部类默认持有外部引用,类似的有Thread、TimerTask)
4.非静态内部类持有某callback(本质是非静态内部类默认持有外部引用)
5.持有静态的View引用
6.资源使用完成后没有关闭,例如:BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap
7.集合类内存泄漏,如果一个集合类是静态的(缓存HashMap),只有添加方法,没有对应的删除方法,会导致引用无法被释放,引发内存泄漏。
8.错误的覆写了finalize()方法,finalize()方法执行执行不确定,可能会导致引用无法被释放。

经典存泄露代码

http://blog.csdn.net/qq_17250009/article/details/51261616

demo用不正确的方法使用handler

内存分析工具使用-----实践篇_第1张图片
image

正常的使用,从MainActivity进入SecondActivity日志如下。

5秒后接到msg

image

如果进入SecondActivity并在5秒内按下返回键,日志如下。

image

操作步骤

1:反复操作:

MainActivity进入SecondActivity,迅速返回MainActivity再进入Second;

2:Dump Heap;

3:用MAT打开hprof,在支配树里输入demo的包名com.example.lahm进行过滤;

内存分析工具使用-----实践篇_第2张图片
image

有意思的是看图中第二个SecondActivity还跟了一个MyHandler。

4:对这个Second右键

内存分析工具使用-----实践篇_第3张图片
image

5:对列举出来的引用,选择任一右键

内存分析工具使用-----实践篇_第4张图片
image

6:结果显示

内存分析工具使用-----实践篇_第5张图片
image

另一种查看方法

I.MAT上方选择OQL;

内存分析工具使用-----实践篇_第6张图片
image

II.选一个 Path To GC Roots /exclude weak references

内存分析工具使用-----实践篇_第7张图片
image

概念参考

http://www.jianshu.com/p/d8e247b1e7b2#

webview内存泄漏从cpp上找到原因,但没分析
https://my.oschina.net/zhibuji/blog/100580

http://blog.csdn.net/xygy8860/article/details/53334476?utm_source=itdadao&utm_medium=referral

你可能感兴趣的:(内存分析工具使用-----实践篇)