本文来自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系统如何管理自己内存的?的更多相关文章

  1. Android内存优化6 了解Android是如何管理App内存

    1, Dalvik & ART Android在4.4之前一直使用的Dalvik虚拟机作为App的运行VM的, 4.4中引入了ART作为开发者备选, 5.0起正式将ART作为默认VM了. 我们 ...

  2. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6666491 在前面一篇文章Android系统匿 ...

  3. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共 ...

  4. Android:管理应用内存

    全部内容均来源于官方文档https://developer.android.com/training/articles/memory.html only way to completely relea ...

  5. Android 之 内存管理-查看内存泄露(三)

    概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在 ...

  6. (转)Android开发:性能最佳实践-管理应用内存

    翻自:http://developer.android.com/training/articles/memory.html 在任何软件开发环境中,RAM都是宝贵的资源,但在移动操作系统中更加珍贵.尽管 ...

  7. Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6939890 在Android系统中,针对移动设 ...

  8. Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8046659 在前文中,我们分析了Surface ...

  9. 每个Android开发者必须知道的内存管理知识

    原文:每个Android开发者必须知道的内存管理知识 拷贝在此处,以备后续查看. 相信一步步走过来的Android从业者,每个人都会遇到OOM的情况.如何避免和防范OOM的出现,对于每一个程序员来说确 ...

随机推荐

  1. 七牛用户搭建c# sdk的图文讲解

    Qiniu 七牛问题解答 问题描写叙述:非常多客户属于小白类型. 可是请不要随便喷七牛的文档站.由于须要一点http的专业知识才干了解七牛的api文档.如今我给大家弄个c# sdk的搭建步骤 问题解决 ...

  2. .vscode folder

    https://stackoverflow.com/questions/32964920/should-i-commit-the-vscode-folder-to-source-control Che ...

  3. 《Android编程权威指南》PhotoGallery应用梳理

    PhotoGalley是<Android编程权威指南>书中另外一个重要的应用.       

  4. Python(六) Python 函数

    一.认识函数 help(方法名字)  help(round) 1.功能性 2.隐藏细节 3.避免编写重复的代码 4.组织代码 自定义函数 二.函数的定义及运行特点 # 递归 def sum_num(n ...

  5. MVC5发展历程,从MVC2谈起

    目前,MVC已经发布了5个版本,不包括一些临时的版本,为了更好的了解MVC5,知道MVC的发展历程是非常重要的.本篇随笔主要讲解3个版本的内容及其新特性. 1.MVC 2,发布日期:2010年3月 部 ...

  6. 用efibootmgr管理UEFI启动项,添加丢失的启动项

    UEFI用来替代传统BIOS引导操作系统,学会修改UEFI启动项也变得十分重要,UEFI全称为:“统一的可扩展固件接口”(Unified Extensible Firmware Interface), ...

  7. 如何在 Linux 上安装应用程序

    如何在 Linux 上安装应用程序 编译自:https://opensource.com/article/18/1/how-install-apps-linux作者: Seth Kenlon原创:LC ...

  8. Hexo 自动同步

    灵感 最近认证阿里云学生用户,参与ESC服务器9.9元/月的活动,准备先搭建一个博客网站,写写自已的心得以及经验.之前也搭建过网站,最后由于个人没时间(没时间是假的,就是懒.哈哈)的原因导致最后服务器 ...

  9. HDU——T 1556 Color the ball

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 Time Limit: 9000/3000 MS (Java/Others)    Memory Limi ...

  10. CF 439C(251C题)Devu and Partitioning of the Array

    Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabytes ...