一、ANR(Application not responding)程序无响应
主要原因:
1. 主线程做耗时操作超过5s
2. Service做耗时操作超过20s(Service默认执行在主线程,可以使用IntentService)
3. BroadcastReceiver中做耗时操作超过10s
解决办法:
开启子线程来处理
二、 内存溢出(Out of Memory)
主要原因:
1. 加载大图
解决办法:
1. Bitmap对象及时recycle
2. 图片压缩
3. 图片缓存
三、内存泄漏
无用对象持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏
主要原因:
1. 单例模式导致的内存泄漏
通常情况下单例模式会使用到Context参数,如果此时外部传入的Context是Activity,该单例就会持有Activity的强引用,这样的话即使该Activity退出,该Activity也不会被回收,这样就造成了内存泄漏
解决办法:使用ApplicatonContext
2. 内部类导致内存泄漏
非静态内部类持有外部类的引用会导致内部类的生命周期过长。
解决办法:修改成静态内部类。
3. Handler引起的内存泄漏
解决办法:使用静态内部类 + WeakReference
4. BroadcastReceiver等未取消注册引起的内存泄漏
5. 属性动画在activity销毁时没有cancel引起的内存泄漏
6. 资源未关闭或释放引起的内存泄漏
7. WebView没有移除或销毁引起的内存泄漏
四、内存抖动
内存抖动是指内存在短时间内频繁地分配和回收,而频繁的gc会导致卡顿,严重时和内存泄漏一样会导致OOM。
常见的内存抖动场景:
1. 循环中创建大量临时对象;
2. onDraw中创建Paint或Bitmap对象等;
五、UI卡顿
主要原因:
1. UI线程做耗时操作
2. Layout布局过于复杂,无法在16ms内完成渲染
3. View过度绘制,导致某些像素在同一时间内被绘制多次,从而导致cpu,gpu负载过重。
解决办法:
1. 优化布局,使用include、merge、ViewStub
六、内存优化
优化方法:
1. 无用资源及时释放
2. 避免滥用Bitmap