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系统如何管理自己内存的?的更多相关文章
- Android内存优化6 了解Android是如何管理App内存
1, Dalvik & ART Android在4.4之前一直使用的Dalvik虚拟机作为App的运行VM的, 4.4中引入了ART作为开发者备选, 5.0起正式将ART作为默认VM了. 我们 ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6666491 在前面一篇文章Android系统匿 ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共 ...
- Android:管理应用内存
全部内容均来源于官方文档https://developer.android.com/training/articles/memory.html only way to completely relea ...
- Android 之 内存管理-查看内存泄露(三)
概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在 ...
- (转)Android开发:性能最佳实践-管理应用内存
翻自:http://developer.android.com/training/articles/memory.html 在任何软件开发环境中,RAM都是宝贵的资源,但在移动操作系统中更加珍贵.尽管 ...
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6939890 在Android系统中,针对移动设 ...
- Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8046659 在前文中,我们分析了Surface ...
- 每个Android开发者必须知道的内存管理知识
原文:每个Android开发者必须知道的内存管理知识 拷贝在此处,以备后续查看. 相信一步步走过来的Android从业者,每个人都会遇到OOM的情况.如何避免和防范OOM的出现,对于每一个程序员来说确 ...
随机推荐
- 在Linux终端使用W3M浏览器下载文件
在Linux终端使用W3M浏览器下载文件 W3M 是3个基于Linux系统命令行的WEB网站浏览工具(w3m/Links/Lynx) 对于需要验证cookie 和来源的页面,比如163的超大附件,直接 ...
- Android中App可分配内存的大小
现在真实测试结果: 1,为了搞清楚每个应用程序在Android系统中最多可分配多少内存空间,我们使用了真机进行测试,测试机型为魅族MX4 Pro,3G内存. 测试方法是直接申请一块较大的内存空间,看应 ...
- Fishing Net
In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...
- GridView单元格取值显示为
在通过GridView取一个单元格(cell)的值时,数据库中为NULL,而页面上显示为空格.发现通过gridview.cell[i].text取出来的值为 ,导致获取数据出现问题. 解决方法: 一. ...
- Django_模型操作
- JS数组去重的6种算法实现
1.遍历数组法 最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法"indexOf"是ECMAScript5 方法 ...
- Add Webhooks to Your API the Right Way
Add Webhooks to Your API the Right Way Adam DuVander / December 15, 2016 In the last 10 years, APIs ...
- 高速排序——JAVA实现(图文并茂)
高快省的排序算法 有没有既不浪费空间又能够快一点的排序算法呢?那就是"高速排序"啦! 光听这个名字是不是就认为非常高端呢. 如果我们如今对"6 1 2 7 9 3 4 5 ...
- 【Swift初见】Swift数组(二)
在苹果的开发文档中对Array还提供了其它的操作算法: 1.Sort函数: 对数组进行排序.依据指定的排序规则,看以下的代码: var array = [2, 3, 4, 5] array.sort{ ...
- Excel的版本
https://en.wikipedia.org/wiki/Microsoft_Excel 取自维基百科,需要特别注意的是,从v12开始,有很大的改变.后缀名从xls变为xlsx Versions 5 ...