• Android系统如何管理自己内存的?




                                本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!


            机缘巧合写下这篇博客,作为个人工作经验的总结,不足之处,随后补上。

     

            安卓是基于Linux2.6内核的操开源作系统,安卓比Linux更智能在于:进程结束后,安卓会把程序(并非进程)保留在内存中,直到内存不够再释放。

            在安卓看来,内存不能空着,留程序缓存在后台不会占用CPU-只保留运行状态,二次打开更加快速-不用再次打开界面资源;所以安卓的内存在于有效利用。

            系统会设置一个阈值,当系统内存低于此值时,便会按优先级来回收,一直达到另外一个稳定的阈值。优先级由低到高依次如下:

    前台进程:如当前界面运行的“愤怒的小鸟”、“网易新闻”等

    可见进程:如界面的Widget、输入法和时钟等

    次要服务:如联系人缓存、电话、Gmail内部存储等

    后台进程:按下Home键后的“前台进程”

    Content Provider

    空进程:程序退出后留下的状态,如记录程序的历史信息,以便下次加载提高速度


            可以给这些进程设置内存oom_adj,值越高,回收越快,也可以手动设置。推荐软件:Auto Memory Manager

            硬性回收一般是错误程序的回收。

            程序退出并不杀死,也会触发Android低内存管理机制(Low Memory);另外程序申请内存大于虚拟机所剩内存,会触发Android内存不足管理机制(Out of Memory)。

    AMS(Activity Manager Service)运行在独立的虚拟机上,启动时即注册一个OOM Killer,当系统内存低时Linux内核会通知OOM Killer,然后根据AMS定义的级别来强制杀死应用程序。优先级如上所述。

    杀死机制:优先退出优先级低的,或同优先级但内存占用大的程序


    经验示例1:

    Bitmapbitmap = null;

    try {

      // 实例化Bitmap

    bitmap= BitmapFactory.decodeFile(path);

    }catch(OutOfMemoryError e) {

    }

    if(bitmap == null) {

    // 如果实例化失败返回默认的Bitmap对象

    return defaultBitmapMap;

    }

      这里对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获,由于OOM是error而非Exception,防止内存溢出错误不能捕获。


    经验示例2:

    BitmapFactory.Optionsopts = new BitmapFactory.Options();

    // 设置inJustDecodeBounds为true

    opts.inJustDecodeBounds= true;

    // 使用decodeFile方法得到图片的宽和高

    BitmapFactory.decodeFile(path,opts);

    // 打印出图片的宽和高

    Log.d("example",opts.outWidth + "," + opts.outHeight);

    系统API提示:需要缩小图片时,通过此方法可以获得图片的宽和高,不会给图片分配内存,然后再设置opts.inJustDecodeBounds为false即可。

  • 相关阅读:
    Window_Open详解
    ajax josn 城市
    图片在容器里垂直居中
    Asp.Net 分段,断点,下载
    HTTP Range
    看得懂的看
    反射访问非公共成员
    C# Rijndael 大文件 分割/合并 并 加密
    在存储过程中如何实现将id列表字符串传入in()
    《植物大战僵尸》网页脚本版
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6147361.html
Copyright © 2020-2023  润新知