2017.12.22三题

1.什么情况下会导致内存泄漏

内存泄漏的根本原因
长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。
1.静态JavaSE类引起内存泄漏主要是hashmap,Vector等,如果是静态JavaSE这些JavaSE没有及时setnull的话,就会一直持有这些对象。
2.remove方法无法删除set集Objects.hash(firstName,lastName),经过测试,hashcode修改后,就没有办法remove。
3.observer我们在使用监听的时候,往往是addXXXlistener,但是我们不需要的时候,忘记removeXXXlistener,就容易内存leak。广播没有unregisterrecevier。
4.各种数据链没有关闭、数据库、io、sokect、cursor等。
5.内部类:java中的内部类(匿名内部类),会持有宿主类的强引用this。所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。Context的引用,当TextView等等都会持有上下文的引用。如果有static drawable,就会导师制改内存无法释放。
6.单例:单例是一个全局的静态对象,当持有某个复制的类A时,A无法被释放,内存leak。

2.如何避免OOM异常

首先OOM是什么?

当程序需要申请一段“大”内存,但是虚拟机没有办法及时的给到,即使做了GC操作以后就会跑出OutOfMemoryException也就是OOM。Android的OOM怎么样?为了减少单个APP对整个系统的影响,android为每个app设置了一个内存上线。

如何避免OOM
最重要的肯定是你的程序没有语法、逻辑错误导致的OOM。然后使用一下方法尽量减少内存消耗:

减少内存消耗

  • ArrayMap/SparseArray代替hashMap
  • 避免在android里面使用Enum
  • 减少bitmap的内存占用
  • inSampleSize:缩放比例,在把图片载入内存之前,算出合适的比例,避免不必要的大图载入。
  • 减少资源图片的大小,进行压缩,过大的图片可以考虑分段加载。

内存对象的重复利用

  • 大多数对象的复用,都是利用对象池的技术
  • listview、gridview、recycleview contentview的复用。
  • inBitmap属性对于内存对象的复用。
  • 避免在ondraw方法里面new对象。
  • StringBuilder代替+。
  • 使用最近最少使用算法(Lrucache)等算法,利用时间换空间策略减少内存消耗。
3.ANR是什么?怎么样避免和解决ANR?

什么是ANR
Application Not Responding,也就是在规定的时间内,没有响应。ANR有三种类型:
1.KeyDispatchTimout(5s)--主要类型按键或触摸事件在特定时间内无响应。
2.BroadcastTimeout(10s)--BroadcastReceiver在特定时间内无法处理完成。
3.serviceTimeOut(20s)--小概率类型Service在特定的事件内无法处理完成。

为什么会超时
事件没有机会处理 & 事件处理超时。

怎么避免ANR
ANR的关键是处理超时,所以应该避免在UI线程,BroadcastReceiver还有Service主线程中,处理复杂逻辑和计算 而交给work thread操作。
1.避免在activity里面做耗时操作
2.避免在onReceiver里面做过多操作
3.避免在IntentReceiver里启动一个activity,因为它会创建一个新的画面,并冲当前用户正在运行的程序上抢夺焦点
4.尽量使用handler来处理UI thread&workthread的交互。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,950评论 25 709
  • java 接口的意义-百度 规范、扩展、回调 抽象类的意义-乐视 为其子类提供一个公共的类型封装子类中得重复内容定...
    交流电1582阅读 6,758评论 0 11
  • 我不知道 心绪烦乱的时候 是不是还可以赋诗一首 在纷纷扰扰的现实里 摸爬滚打 诗一样的生活 终究只是梦想 我不知道...
    似曾相识a阅读 2,924评论 9 7
  • 国庆佳节,举国同庆! 假期日光,与友携程! 游历山河,尝尽佳勺! 秀丽景色,尽收眼底! 美哉幸哉,乐哉乐哉! 卫东...
    五星之荣光阅读 2,571评论 0 0
  • 用ORID方法回顾一天的生活。 O:客观 我今天做了哪些事情? 1,冥想+护眼 2,瑜伽 3,早餐准备 4,宝贝洗...
    Ariesyang阅读 1,033评论 0 0