Android 项目中对于内存优化的几个细节点

定义

当一个对象已经不需要再使用了,本应该被回收掉,而另一个正在使用的对象持有他的引用,导致对象不能被回收。因为不能被及时回收的本该被回收的内存,就产生了内存泄露。如果内存泄露太多会导致程序没有办法申请内存,最后出现内存溢出的错误。

场景

Android开发中经常出现内存泄露的点,

  • 使用单例模式
  • 使用匿名内部类
  • 使用异步事件处理机制Handler
  • 使用静态变量
  • 资源未关闭
  • 设置监听
  • 使用Asynctask
  • 使用Bitmap

优化

  • 当查询完数据库之后,及时关闭Cursor对象。
  • 记得在ActivityonPause方法中调用unregisterReceiver()方法,反注册广播。
  • 避免Context内存泄露,比如在4.0.1之前的版本上不要将Drawer对象置为static。当一个Drawable绑定到了View上,实际上这个View对象就会成为这个Drawable的一个CallBack成员变量,静态的SBackground持有TextView对象lable的引用,而lable只有Activity的引用,而Activity会持有其他更多对象的引用,sBackground生命周期要长于Activity,当屏幕旋转时,Activity无法销毁,这样就产生了内存泄露的问题。
  • 尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用,当非静态内部类的引用的生命周期长于Activity的生命周期时,会导致Activity无法被GC正常回收掉。
  • 谨慎使用线程Thread,很多人会犯这样的错误:Java中的Thread有一个特点就是他们都是直接被GC Root所引用,也就是说Dalvik虚拟机对所有被激活状态的线程都是持有强引用 ,导致GC永远都无法回收掉这些线程对象,除非线程被手动停止并置为null或者用户直接kill掉进程操作,所以当使用线程时,一定要考虑在Activity退出时,及时将线程也停止并释放掉。
  • 使用Handler时,要么放在单独的类文件中, 要么就是使用静态内部类,因为静态的内部类不会持有外部类的引用,所以不会导致外部类实例的内存泄露

参考资料: Android性能优化篇之内存优化--内存泄漏 资料

转载于:https://juejin.im/post/5c8a6849f265da2de52dd06d

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值