Android异常与性能优化-ANR&OOM

Anr&OOM面试详解

一、Anr

1.什么是anr

Application Not Responding(程序无响应)

 

2.造成anr的主要原因

应用程序的响应性是由Activity Manager和WindowManager系统服务监视的

 

·主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞

·主线程中存在耗时的计算

 

Android中哪些操作是在主线程呢?

Activity的所有生命周期回调都是执行在主线程的.

Service默认是执行在主线程的.

BroadcastReceiver的onReceive回调是执行在主线程的.

没有使用子线程的looper的Handler的handleMessage,post(Runnable)是执行在主线程的

AsyncTask的回调中除了doInBackground,其他都是执行在主线程

 

3.如何解决anr

使用Asynctask处理耗时IO操作

使用Thread或者HandlerThread提高优先级

使用handler来处理工作线程的耗时任务

Activity的onCreate和onResume回调中尽量避免耗时的代码


二、OOM

1.什么是oom?

当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的在最大内存限制就会抛出的Out of memory异常。

 

2.一些容易混淆的概念

内存溢出(OOM)--最严重

内存抖动:短时间内大量对象被创建又被马上释放,瞬间产生的对象会严重占用内存区域,造成堆内存的压力,达到阀值时触发GC。

内存泄漏:如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,这中情况就是内存泄露。

 

3.如何解决oom

有关bitmap

·图片显示(显示缩略图时点击再加载大图、ListView滑动停止后再加载图片)

·及时释放内存(GC只回收Java部分,c部分内存区域不能由虚拟机释放)

·图片压缩(对加载的bitmap大小进行压缩,inSampleSize())

·inBitmap属性(主要就是指的复用内存块,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率)

·捕获异常(error属性)


其他方法

Listview:convertview/LRU(三级缓存机制)

避免在onDraw方法里面执行对象的创建

谨慎使用多进程



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值