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的出现,对于每一个程序员来说确 ...
随机推荐
- Connect the Campus (Uva 10397 Prim || Kruskal + 并查集)
题意:给出n个点的坐标,要把n个点连通,使得总距离最小,可是有m对点已经连接,输入m,和m组a和b,表示a和b两点已经连接. 思路:两种做法.(1)用prim算法时,输入a,b.令mp[a][b]=0 ...
- Entity Framework介绍和DBFirst开发方式
一.ORM概念 什么是ORM? 对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术.简单来说,就是将关系型数 ...
- <QT障碍之路>QApplication:No such file or directory
原因:QT5将很多部件都移动了QT widgets模块中. 解决方法: 在.pro文件中添加 greaterThan(QT_MAJOR_VERSION, ): QT += widgets
- 51nod 最大子段和问题
给出一个整数数组a(正负数都有),如何找出一个连续子数组(可以一个都不取,那么结果为0),使得其中的和最大? 用f[i]表示以i为结尾的最大字段和,也就是说i一定要取, 那么f[i] = max(a[ ...
- [Python] Manipulate Data with Dictionaries in Python
Dictionaries may be familiar to you as hash maps. In this lesson, you will learn how to create them, ...
- [当我在研究Cocos-2dx的源代码时,我在想什么]-Ref类,一切的起源
[名词解释] 引用计数:引用计数是现代内存管理中常常使用到的一个概念.它的基本思想是通过计数方式实现多个不同对象同一时候引用一个共享对象,详细地讲,当创建一个对象的实例并在堆上分配内存时,对 ...
- {head first} --- networking 3
Chapter 10 无线网络 续 .. Chapter 11 网络安全 Chapter 12 设计网络 涉及到物理的设计网络布局等.我没细看. 附录
- Image与byte[]数组的相互转换
近期项目有个需求是关于图片操作的,须要将图片保存到数据库中.经过尝试才知道Image类型文件是不能直接存储到数据库中的.保存之前须要我们做一步转换:将Image转换成字节数组类型Byte ...
- vim-进入插入模式快捷键
vim中有一些命令,是同时包含有大小写两种的.现在就集中测试下他们的区别: 1.A 跟a A-光标所在行的末尾插入 a-光标后插入 2.I 跟i I-光标所在行的非空字符前插入 i-光标前位置 ...
- ble_app_hrs心率程序 nrf51822
所用程序为: H:\keil\ARM\Device\Nordic\nrf51822\Board\pca10001\s110\ble_app_hrs 上面的路径是安装sdk之后生成在keil软件所在目录 ...