ANR,OOM,memory leak

    技术2023-05-17  97

    ANR产生的原因是什么? ANR即Application Not Responding,顾名思义就是应用程序无响应。

    在Android中,一般情况下,四大组件均是工作在主线程中的,Android中的Activity Manager和Window Manager会随时监控应用程序的响应情况,如果因为一些耗时操作(网络请求或者IO操作)造成主线程阻塞一定时间(例如造成5s内不能响应用户事件或者BroadcastReceiver的onReceive方法执行时间超过10s),那么系统就会显示ANR对话框提示用户对应的应用处于无响应状态。

    不要让主线程干耗时的工作 不要让其他线程阻塞主线程的执行 ANR定位和修正 ANR一般有三种类型 KeyDispatchTimeout(5 seconds) –主要类型 按键或触摸事件在特定时间内无响应 BroadcastTimeout(10 seconds) BroadcastReceiver在特定时间内无法处理完成 ServiceTimeout(20 seconds) –小概率类型 Service在特定的时间内无法处理完成

    1、主线程当中执行IO/网络操作,容易阻塞。 2、主线程当中执行了耗时的计算。(比如自定义控件中的onDraw()方法)

    在onDraw()方法里面创建对象容易导致内存抖动(绘制动作时会大量不间断调用,产生大量垃圾对象导致GC很频繁,就造成了内存抖动), 内存抖动就容易造成UI出现掉帧、卡顿等问题。

    3、BroadCastReceiver没有在10秒内完成处理。 4、BroadCastReceiver的onReceived代码中也要尽量减少耗时的操作,建议使用IntentService处理。 5、Service执行了耗时的操作,因为Service也是在主线程当中执行的,所以耗时操作应该在Service里面开启子线程来做。 6、使用AsyncTask处理耗时的IO等操作。 7、Activity的onCreate和onResume回调中尽量耗时的操作。

    oom是什么?怎么导致的,怎么解决? 内存泄漏是什么? 什么情况导致内存泄漏?(1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。  (2)引起内存泄露的原因 (3) 内存泄露检测工具 ------>LeakCanary 内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory; 比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存溢出通俗的讲就是内存不够用。 内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略, 但内存泄露堆积后果很严重,无论多少内存,迟早会被占光 内存泄露原因: 一、Handler 引起的内存泄漏。 解决:将Handler声明为静态内部类,就不会持有外部类SecondActivity的引用,其生命周期就和外部类无关, 如果Handler里面需要context的话,可以通过弱引用方式引用外部类 二、单例模式引起的内存泄漏。 解决:Context是ApplicationContext,由于ApplicationContext的生命周期是和app一致的,不会导致内存泄漏 三、非静态内部类创建静态实例引起的内存泄漏。 解决:把内部类修改为静态的就可以避免内存泄漏了 四、非静态匿名内部类引起的内存泄漏。 解决:将匿名内部类设置为静态的。 五、注册/反注册未成对使用引起的内存泄漏。 注册广播接受器、EventBus等,记得解绑。 六、资源对象没有关闭引起的内存泄漏。 在这些资源不使用的时候,记得调用相应的类似close()、destroy()、recycler()、release()等方法释放。 七、集合对象没有及时清理引起的内存泄漏。 通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合,让相关对象不再被引用。

    如何防止线程的内存泄漏(出现在栈内存)? 使用线程池来进行对线程进行管理。

    LruCache默认缓存大小 基本上设置为手机内存的1/8

    如何通过广播拦截和abort一条短信? 首先添加接收短信的权限

    在清单文件中注册广播接收器,设置该广播接收器优先级,尽量设高一点 创建一个BroadcastReceiver来实现广播的处理,并设置拦截器abortBroadcast();

    广播是否可以请求网络? 子线程可以,主线程超过10s引起anr

    广播引起anr的时间限制是多少? 在Android中Activity中阻塞5秒、Service 20秒、BroadCastReceiver 10秒,就会造成ANR。 计算一个view的嵌套层级 循环追寻父类父类,看看有多少,便有多少嵌套层级

    while (view.getParents() != null) { count++; view = view.getParents(); }

    ANR即Application

    KeyDispatchTimeout 5         BroadCastReceiver 10 

    ServiceTimeout 20          

       @Override 92    public long notifyANR(InputApplicationHandle inputApplicationHandle,

        KeyDispatchTimeout          setBroadcastTimeoutLocked(timeoutTime);       case BROADCAST_TIMEOUT_MSG: {                mServices.serviceTimeout((ProcessRecord)msg.obj);                   Dialog d = new AppNotRespondingDialog(ActivityManagerService.this,                                 mContext, proc, (ActivityRecord)data.get("activity"),                                              onDraw    主线程当中执行IO/网络操作,容易阻塞。                                             

    oom是什么?怎么导致的,怎么解决?                                           out of memory          memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存 integer long

    view.getParents                                                                    

    Processed: 0.015, SQL: 9