您的位置:首页 > 移动开发 > Android开发

Android下检测和定位内存泄露的方法

2017-03-20 15:23 288 查看
Android内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gcroots导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。
一、场景:
1、类的静态变量持有大数据对象
2、静态变量长期维持到大数据对象的引用,阻止垃圾回收
3、非静态内部类的静态实例
4、非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉
5、资源对象未关闭,资源性对象如Cursor、File、Socket,应该在使用后及时关闭。未在finally中关闭,会导致异常情况下资源对象未被释放的隐患
6、注册对象未取消注册会导致观察者列表里维持着对象的引用,阻止垃圾回收
7、Handler临时性内存泄露,Handler通过发送Message与主线程交互,Message发出之后是存储在MessageQueue中的,有些Message也不是马上就被处理的。在Message中存在一个target,是Handler的一个引用,如果Message在Queue中存在的时间越长,就会导致Handler无法被回收。如果Handler是非静态的,则会导致Activity或者Service不会被回收
8、AsyncTask内部也是Handler机制,同样存在内存泄漏的风险。此种内存泄露,一般是临时性的。

二、检测:
1、DDMS Heap发现内存泄露:
dataObject totalSize的大小,是否稳定在一个范围内,如果操作程序,不断增加,说明内存泄露。
2、使用Heap Tool进行内存快照前后对比:
BlankActivity手动触发GC进行前后对比,对象是否被及时回收。
三、定位:
1、MAT插件打开.hprof具体定位内存泄露:
查看histogram项,选中某一个对象,查看它的GC引用链,因为存在GC引用链的,说明无法回收。
2、AndroidStudio的Allocation Tracker:
观测到期间的内存分配,哪些对象被创建,什么时候创建,从而准确定位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 内存泄露 OOM