About ANR and OOM

转载 2015年11月19日 14:36:08

1. ANR

    1.1 什么是ANR? ANR(Application Not Responding)

        在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:ApplicationNotResponding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。

          默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒 (厂商可以定制 这个时间)


    1.2 产生ANR的原因?

        1.在5秒内没有响应输入的事件。
        2.BroadcastReceiver在制定时间内完成

        具体点的原因: 1) IO操作耗时 。  2)数据库操作复杂耗时。 3)主线程  非主线程 产生死锁等待。 4)网络加载/图片操作耗时。  5)硬件操作耗时。

                                     1) service binder 数量达到上限。 2)Service忙导致超时无响应。


    1.3 ANR是哪里报出来的?

        ActivityManagerService 管理每个应用程序是否发生了ANR  。按照ANR发生的不同类型,细致一点的说:

        1)KeyDispatchTimeout :每次dispatch 触摸事件的时候都会检查当前接收事件的app是否 ready 去处理下一个事件,判断的过程中会检查是否发生了ANR。检查的办法是ActivityManagerService对比上次记录的该pid的处理时间和当前时间的差值,是否大于系统规定的ANR超时时间。

        2)BroadcastTimeout:ActivityManagerService 管理着几个broadcastQueue,这些broadcastQueue 管理者不同类型的broadcast。每个broadcast发送给注册的对象都有一个时间限制,BroadCastQueue会记录每次发送的开始时间以及结束时间,如果超过了ANR规定时间就会发生ANR。通过调用AMS中的AppNotResponding来弹出系统弹窗。

        3)ServiceTimeout:与KeyDispatchTimeout 类似。(没有具体的看)

    1.4 如何尽力避免ANR?

        1)运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)

        2)应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent ,应用程序应该启动一个Service。

        3)避免在IntentReceiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。

    1.5 出现ANR如何解决。

        解决ANR 主要通过 报错log和Trace文件分析解决。 从产生的原因入手。 具体方法可以参考一下: http://www.cnblogs.com/purediy/p/3225060.html


2. Crash

    Crash 包括很多情况,在进行系统debug的时候很容易区分。 例如JAVA层的Fatal 错误, 在log中会明确的打印出具体原因, 是数组越界/未初始化变量/空指针等。又比如C/C++层的错误,会打印出相应的信息,我们可以通过addr2line  来进行debug。 应用层的crash 是我们常说的FC。  system service 的crash 会导致 系统不能启动/重启等问题。

http://blog.csdn.net/god2469/article/details/9713395   (常见的SIG错误以及含义)


3. OOM

    OOM是指Out Of Memory。每个android应用单独使用一个Dalvik虚拟机,每个虚拟机使用的堆内存是有限的,超过了限制就会引发oom错误。造成OOM几乎都是自己的代码结构导致的不良。常见的原因:

   1)不恰当的使用static关键字。 尽量不要使用static保存对象。

   2)内部类对Activity的引用。 内部类对象如果引用Activity对象,同时有很长的声明周期的话会导致 Activity对象释放不及时。

   3)Bitmap使用。 大量的bitmap会导致 程序包和运行时的内存消耗变大。

   4)游标cursor的使用。 Cursor 对象用完应该及时关闭

   5)其他的内容。 我个人不能列举所有的情况。其他的是我暂时没有想到的 欢迎指教

文章中有一些引用的地方。不算原创。

android开发之详解ANR与OOM

懒惰,只是为了更好的懒惰!
  • zz1175854992
  • zz1175854992
  • 2015年04月01日 16:56
  • 2476

Android中的ANR和OOM

内存溢出的几点原因 1.资源释放问题 程序代码的问题,长期保持某些资源,如Context,Cursor,IO流的引用,资源得不到释放造成内存泄露 2.对象内存过大问题 保存了多个内存过大的对象...
  • u014142287
  • u014142287
  • 2016年03月01日 12:51
  • 1115

简述anr异常和解决方案

什么是ANR 如何避免它  答:Application not Responding(程序无应答) 1)主线程中尽量少做操作 2)对繁琐的功能代码分段完成 3)潜在的耗时操作,例如网络或数...
  • Liu_ser
  • Liu_ser
  • 2017年07月06日 09:51
  • 218

【知识必备】Android内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye

关注楼主的更多博客,总有你想要的:http://www.cnblogs.com/liushilin/ 一、写在前面   对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野...
  • nanchen_lsl
  • nanchen_lsl
  • 2017年01月05日 11:56
  • 620

android ANR产生原因(三总常见类型)和解决办法

ANR (Application Not Responding)       ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程...
  • u011482680
  • u011482680
  • 2014年12月18日 15:35
  • 3566

android中,由于图像处理不当而引起的OOM问题及其解决方案(一)

在android中,经常会出现OOM(OutOfMemoryError), 原因有很多,其中,也可能由于图像处理不当而引起的的,本篇将从这个方面介绍几种常见的场景。 重要:而通常情景是,这个OOM不...
  • liranke
  • liranke
  • 2016年11月29日 14:01
  • 1755

ANR异常的产生和解决方案

1.概念解释: ANR : Application No Response。 在Android中,应用的响应性被活动管理器(Activity Manager)和窗口管理器(Window Mana...
  • huang_xiao_yu
  • huang_xiao_yu
  • 2015年10月30日 12:21
  • 1043

Android面试——OOM及ANR

一、什么是oom? OOM就是当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出的Out Of Memory的异常,主要是因为过多的内存泄漏造成的OOM。 二...
  • AD_wen
  • AD_wen
  • 2017年09月07日 22:02
  • 920

Android 系统稳定性---OOM,ANR

http://rayleeya.iteye.com/category/89044 http://www.yrom.net/blog/2014/08/29/eclipse-mat/ http://g...
  • jkkjklmn
  • jkkjklmn
  • 2015年05月06日 18:17
  • 436

(转)About ANR (Application Not Responding)

Android - how do I investigate an ANR? An ANR happens when some long operation takes place in th...
  • cs_lht
  • cs_lht
  • 2010年08月10日 10:49
  • 2781
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:About ANR and OOM
举报原因:
原因补充:

(最多只允许输入30个字)