Android中的内存泄漏情况分析

来源:互联网 发布:虚拟机网络不可用 编辑:程序博客网 时间:2024/05/23 19:19

内存泄漏(memory leak)是指由于疏忽或错误造成程序未能释放已经不再使用的内存。那么在Android中,当有一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity也不会被系统回收,那这么以来便出现了内存泄漏的情况。在应用中内出现一两次的内存泄漏或许不会出现什么影响,但是在应用长时间使用以后,若是存在大量的Activity无法被GC回收的话,最终会导致OOM的出现。

常见的内存泄漏
1、非静态内部类的静态实例容易造成内存泄漏
2、Activity使用静态成员
3、非静态的匿名内部类对象会持有一个外部类的引用
4、使用Handler导致的内存泄漏;
(Handler通过发送Message与其他线程交互,Message发出之后是存储在目标线程中的MeessageQueue中的,而有时候Message也不是就被处理,可能会驻留比较久的时间。在Message类中存在一个成员变量target,它强引用了handler实例,如果message在queue中一直存在,就会导致handler实例无法被回收,如果handler对应的类是非静态内部类,则会导致外部类实例不会被回收,这就造成了外部类实例的泄漏。所以正确处理Handler等之类的内部类,应该将自己的Handler定义为静态内部类,并且在类中增加一个成员变量,用来弱引用外部类实例。)
5、属性动画中有一类无限循环动画
(如果在Actitvity中播放这类动画并且在onDestroy中去停止动画,那么这个动画将会一直播放下去,这时候Activtiy会被view所持有,从而导致Activity无法被释放。解决此类问题则是需要在Activity中onDestroy去调用objectAnimator.cancel()来停止动画。)
6、注册某个对象后为反注册
7、集合中对象没清理造成的内存泄漏
8、资源对象未关闭造成的内存泄漏
9、第三方库使用不当
10、不良代码造成的内存压力
10.1 Bitmap使用不当(1、及时的销毁 ;2、设置一定的采样率;3、巧妙的运用软引用;)
10.2构造Adapter时,没有使用缓存的convertView;
10.3不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当使用hashtable、vector创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后丢弃。
——-(未完待续)———-

原创粉丝点击