先制造一个内存泄露。
内存泄漏的几个方式
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
image正常的使用,从MainActivity进入SecondActivity日志如下。
5秒后接到msg
image如果进入SecondActivity并在5秒内按下返回键,日志如下。
image操作步骤
1:反复操作:
MainActivity进入SecondActivity,迅速返回MainActivity再进入Second;
2:Dump Heap;
3:用MAT打开hprof,在支配树里输入demo的包名com.example.lahm进行过滤;
image有意思的是看图中第二个SecondActivity还跟了一个MyHandler。
4:对这个Second右键
image5:对列举出来的引用,选择任一右键
image6:结果显示
image另一种查看方法
I.MAT上方选择OQL;
imageII.选一个 Path To GC Roots /exclude weak references
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
网友评论