• 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

  • 相关阅读:
    Firefly是什么?有什么特点?
    windows7下启动mysql服务出现服务名无效
    win7系统64位eclipse环境超详细暗黑1.4服务器搭建
    Python安装模块出错(ImportError: No module named setuptools)解决方法
    Error format not a string literal and no format arguments解决方案
    DropFileName = "svchost.exe" 问题解决方案
    javascript
    Javascript
    PHP 命名空间namespace 和 use
    css
  • 原文地址:https://www.cnblogs.com/Cc905/p/13498567.html
Copyright © 2020-2023  润新知