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即可。

你可能感兴趣的:(Android统就如何管理自己内存的?)