Android系统如何管理自己内存的?

简介:                             本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!        机缘巧合写下这篇博客,作为个人工作经验的总结,不足之处,随后补上。



                            本文来自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即可。

目录
相关文章
|
11月前
|
Linux 测试技术 语音技术
【车载Android】模拟Android系统的高负载环境
本文介绍如何将Linux压力测试工具Stress移植到Android系统,用于模拟高负载环境下的CPU、内存、IO和磁盘压力,帮助开发者优化车载Android应用在多任务并发时的性能问题,提升系统稳定性与用户体验。
868 6
|
11月前
|
Java 数据库 Android开发
基于Android的电子记账本系统
本项目研究开发一款基于Java与Android平台的开源电子记账系统,采用SQLite数据库和Gradle工具,实现高效、安全、便捷的个人财务管理,顺应数字化转型趋势。
|
12月前
|
缓存 监控 Linux
CentOS系统如何查看当前内存容量。
以上方法都不需要特殊软件或者复杂配置即可执行,在CentOS或其他Linux发行版中都适合运行,并且它们各自透露出不同角度对待问题解答方式:从简单快速到深入详尽;从用户态到核心态;从操作层数到硬件层数;满足不同用户需求与偏好。
844 8
|
存储 缓存 监控
手动清除Ubuntu系统中的内存缓存的步骤
此外,只有系统管理员或具有适当权限的用户才能执行这些命令,因为这涉及到系统级的操作。普通用户尝试执行这些操作会因权限不足而失败。
2180 22
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
545 1
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
523 27
|
安全 搜索推荐 Android开发
Android系统SELinux安全机制详解
如此看来,SELinux对于大家来说,就像那位不眠不休,严阵以待的港口管理员,守护我们安卓系统的平安,维护这片海港的和谐生态。SELinux就这样,默默无闻,却卫士如山,给予Android系统一份厚重的安全保障。
538 18
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
1260 38
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
794 3
|
Android开发
Android 跳转到系统应用管理
Intent i = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");String pkg = "com.android.settings";String cls = "com.
6037 0