Android系统如何管理自己内存的?
2014-02-26 18:29
344 查看
本文来自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 { // 实例化Bitmapbitmap= BitmapFactory.decodeFile(path);}catch(OutOfMemoryError e) {}if(bitmap == null) {// 如果实例化失败返回默认的Bitmap对象return defaultBitmapMap;} 这里对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获,由于OOM是error而非Exception,防止内存溢出错误不能捕获。
经验示例2:
BitmapFactory.Optionsopts = new BitmapFactory.Options();// 设置inJustDecodeBounds为trueopts.inJustDecodeBounds= true;// 使用decodeFile方法得到图片的宽和高BitmapFactory.decodeFile(path,opts);// 打印出图片的宽和高Log.d("example",opts.outWidth + "," + opts.outHeight);系统API提示:需要缩小图片时,通过此方法可以获得图片的宽和高,不会给图片分配内存,然后再设置opts.inJustDecodeBounds为false即可。
机缘巧合写下这篇博客,作为个人工作经验的总结,不足之处,随后补上。
安卓是基于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 { // 实例化Bitmapbitmap= BitmapFactory.decodeFile(path);}catch(OutOfMemoryError e) {}if(bitmap == null) {// 如果实例化失败返回默认的Bitmap对象return defaultBitmapMap;} 这里对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获,由于OOM是error而非Exception,防止内存溢出错误不能捕获。
经验示例2:
BitmapFactory.Optionsopts = new BitmapFactory.Options();// 设置inJustDecodeBounds为trueopts.inJustDecodeBounds= true;// 使用decodeFile方法得到图片的宽和高BitmapFactory.decodeFile(path,opts);// 打印出图片的宽和高Log.d("example",opts.outWidth + "," + opts.outHeight);系统API提示:需要缩小图片时,通过此方法可以获得图片的宽和高,不会给图片分配内存,然后再设置opts.inJustDecodeBounds为false即可。
相关文章推荐
- Android系统如何管理自己内存的?
- Android系统如何管理自己内存的?
- [Android 性能优化系列]内存之提升篇--应用应该如何管理内存
- 一步步教你如何用疯狂.NET架构中的通用权限系统 -- 分布式管理(每个公司管理每个公司自己的数据)
- 如何让自己的Android程序永不被系统kill
- [Android 性能优化系列]内存之基础篇--Android如何管理内存
- Android编译系统如何添加厂商自己定义产品的编译选项
- 如何让自己的Android程序、Service永不被系统kill
- Android内存优化6 了解Android是如何管理App内存
- Android如何安装系统应用,及自己增加安装系统应用的接口
- Android系统中的进程管理:内存的回收
- 在android开发中应该如何管理内存或者是在开发过程中应该注意哪些问题来较少OOM?
- 一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序
- 如何在自己的信息管理系统里集成第三方权限控制组件 - 开发一个好用稳定的开放组件
- android系统电源管理--如何防止系统进入深度睡眠
- 内存不足时Android 系统如何Kill进程
- 如何在自己的信息管理系统里集成第三方权限控制组件 - 开发一个好用稳定的开放组件
- 如何在自己的信息管理系统里集成第三方权限控制组件
- Android如何安装系统应用,及自己增加安装系统应用的接口
- 如何让自己的Android程序永不被系统kill