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的交互。
网友评论