简析Android的垃圾回收和内存泄漏

 1.一些与内存泄漏相关的基本概念

       1)垃圾回收;和java一样Android也是基于垃圾回收(Gabage Collection,简称GC)机制实现内存的自动回收的;

        2)软引用:使用SoftReference关联的对象,用来表示一些有用但不是必需的对象,被SoftReference关联的对象,只有在内存不足时才会被垃圾回收;

        3)弱引用:使用WeakReference关联的对象,用来表示非必需的对象,在虚拟机进行垃圾回收时,无论内存是否充足,这类对象都会被回收;

        4)引用队列:引用队列ReferenceQueue一般作为WeakReference(SoftReference)的构造函数参数传入,在WeakReference(SoftReference)指向的对象被垃圾回收后,ReferenceQueue就是用来保存这些已经被回收的Reference。

2.什么是内存泄漏?

      当你不需要某个实例后,但是这个对象却仍然被引用,防止被垃圾回收,这个情况就叫内存泄漏。

3.常见的内存泄漏问题

     1)非静态内部类导致的内存泄漏,比如Handler,解决办法是将内部类改写成静态内部类,在静态内部类中使用软引用/弱引用持有外部类的实例;

     2)IO操作后,没有关闭文件导致的内存泄漏,比如Cuesor、FileInputStream,FileOutputStream、使用完后没有关闭;

     3)自定义View中使用TypeArray后,没有recycle;这种问题可以通过静态代码分析检查出来,直接改善即可;

     4)某些地方在使用了四大组件的context,在离开这些组件后仍然持有其context导致的内存泄漏,使用Application的context就可以解决这类内存泄漏的问题了。

     5)单例模式导致的内存泄漏,泄漏的原因是Activity的对象呗单例模式的类所持有,而单例模式的特点是其生命周期和Application的生命周期保持一致,因此Activity对象无法呗及时释放。

4.如何检测内存泄漏以及避免内存泄漏?

    通过内存泄漏检测工具先定位是哪里内存泄漏,内存泄漏的检测有两种比较便捷的方式:

       1)使用开源项目Leakcanary,需要添加到代码中,运行后生成分析结果

       2)使用adb shell dumpsys meminfo packagename-d命令在进入一个界面之前查看一遍Activity和View的数量,在退出这个界面之后再查看一遍Activity和View的数量,对比进入前和进入后Activity和View数量的变化情况,如果有差异,则说明存在内存泄漏(在使用命令查看Activity和View的数量之前记得要手动触发GC);

   避免内存泄漏的解决方案:

       1)将线程的内部类改成静态内部类(因为非静态内部类持有外部类的强引用,而静态内部类则没有)

       2)在线程内部采用弱引用保存Context引用;


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值