Android内存泄漏问题笔记

版权声明:转载请注明出处http://blog.csdn.net/xuaho0907 https://blog.csdn.net/xuaho0907/article/details/84673689

OOM:out of memory,内存溢出

简单的说内存溢出就是,有一些对象不用了之后,java的GC(垃圾回收机制)也没有检测到可以回收它,久而久之堆内存内存就被占满了。

GC在回收一个对象之前需要经过两个阶段:

1.发现(标记)该对象为垃圾对象。这里用到一个搜索算法(早期用的是引用计数器算法,根搜索算法)

2.回收该对象,释放该对象的内存。

java中有四种引用类型:

1.强引用:User a = new User(); (显示的强引用)

2.软引用

3.弱引用

4.虚引用

tips:

1.一个线程只有等它的run()方法执行完成之后才会被销毁。

2.使用leakcanary检测,如果发生内存泄漏则会弹出提示,并且有详细的日志代码。

内存泄漏场景:

1.一个activity中执行了一个线程(内部类),但是这个线程又是执行的耗时操作,当这个线程还没有执行完的时候,用户就按下了返回键(finish掉了这个activity),但这个线程依然引用着这个activity,这时候本该被GC回收的activity就不会被回收,因为GC发现这个activity还被其他的对象(线程)引用着,一个activity在安卓中算是比较大的对象,如果一个activity泄漏了,一次性至少要泄漏好几k的内存,这样就导致一个问题,每使用一次就泄漏一次,这个app就会越用越卡,知道有一天这个app发生了oom,它就直接崩溃掉了。那么问题来了!我怎么知道线程什么时候执行完成呢?对策:在finish掉activity时停止掉线程

2.还有一种情况,a类的静态成员变量通过set方法引用了b类(activity)的内部类对象,从而也能导致activity不能正确被回收掉,如果a类不是静态的成员变量的话则不存在这样的问题。 对策:把内部类改为静态内部类。

3.在handler中使用postDelayed()方法递归调用,或者长时间延时时acttivity已经被关闭了,也会发生内存泄漏。 对策:在activity的生命周期方法onDestory()中加上:mHandler.removeCallbacksAndMessages(null);//移除当前mHandeler发送的所有的msg和任务

猜你喜欢

转载自blog.csdn.net/xuaho0907/article/details/84673689
今日推荐