Android应用上的anr和crash

内存泄漏

内存泄漏:程序在向系统申请分配内存空间后,在使用完毕后未释放,结果导致一直占据该内存单元但是无法调用,直到程序结束

内存溢出(OOM):程序向系统申请内存空间超出了系统能给的。

大量的内存泄漏会导致内存溢出。

内存

静态存储区(方法区):存放静态变量、常量、全局static数据

栈区:当方法被执行时,方法体内的局部变量都在栈上创建,并在方法执行结束时这些局部变量持有的内存将会自动释放。每个线程分配一个栈区,执行到一个新的方法时,创建一个帧,存放方法的局部变量和对象的引用和返回地址,当方法执行结束时,frame将会从栈中删除,其占有的内存空间也被释放。当所有的栈都清空时,程序也随之运行结束。

堆:动态内存分配,这部分内存在不使用时将会由回收器负责回收。JVM只有一个堆区会被所有线程共享,存放对象本身。

垃圾回收(GC):GC可以自动清理堆中不再使用的对象,如果对象不再有引用指向,那么该对象就无从处理或者调用该对象,这样的对象称为不可到达,垃圾回收用于释放不可到达的对象所占据的内存。但是如果持有对象的强引用,垃圾回收器将无法在内存中回收这个对象。

内存泄漏的根因:持有对象的强引用,而又没有及时释放,内存单元一直被占用。

ANR

  应用程序主线程在超时时间内,没有处理完输入事件或者特定操作,就会出现anr。这时Android会弹窗提示用户应用无响应,用户可以选择关闭这个程序或者继续等待。系统打印trace.txt日志在/data/anr文件夹下。

anr的种类

1.主线程对输入事件(键盘操作,触摸事件)在5s内没有处理完成。

2.主线程在执行BroadcastReceiver的onReceive函数时10秒内没有执行完毕

3.主线程在执行Service的各个生命周期函数时20秒内没有执行完毕

3种anr都会在log中打印消息,但是只有第一种anr才会触发弹窗提示。

crash

java crash和native crash

 

posted @ 2020-12-01 19:11  Cc905  阅读(556)  评论(0编辑  收藏  举报