`
yangguangfu
  • 浏览: 1542524 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解说Android系统内存管理的问题

阅读更多

有很多同学表示,自己的机子开机内存怎么只有200m啦,用一会怎么就变成100多m啦,怎么有很多程序在后台关都关不了啦。回答了很多遍,实在是麻烦,在这里开个贴解释一下。

首先你要知道Android系统 是 基于Linux 2.6内核开发的开源操作系统(linux是啥都不知道自己去百度吧),而linux系统的内存管理有其独特的动态存储管理机制。不过Android系统 对Linux的内存管理机制进行了优化,Linux系统会在进程活动停止后就结束该进程,而Android把这些进程都保留在内存中,直到系统需要更多内 存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户 再次激活这些进程时,提升了进程的启动速度。

如果你懂java,就会更容易理解Android系统的内存管理机制。与java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阈值, 只有低于这个值系统才会按一个列表来关闭用户不需要的东西。Android系统有六类进程:前台进程、可见进程、次要服务、后台进程、内容供应节点、空进 程。对于高手 而言可以用MinFreeManager之类的软件 进行进程管理,分别为六类进程设定不同的阈值来操纵系统的内存分配机制。不过对于一般用户而言,Android系统默认的分配机制已经可以满足使用需要,因此也不需要再去调整。

对于一些内存很低的低端Android机而言,系统默认的内存分配机制无法实现很完善的内存调配。所以在运行大型游戏 时需要先清理一下内存。然而对于我们的DEFY而言,512m的总内存和几十m的空余内存已经可以充分的满足系统自动调配的需要,因此完全没有必要老去杀进程、清内存。

有的兄弟 说后台挂着程序很费电,事实上Android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。至于QQ、音乐 播放之类的程序可以在后台运行,是因为这些程序在后台开启了服务,而服务可以后台运行,所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源。

Android系统这样的设计不仅非常适合移动终端的需要,而且减少了系统崩溃的可能,确保了系统的稳定性。老想着清理内存的同学完全是因为被塞班或者 Windows毒害太深,事实上,经常用Taskiller之类的软件关闭后台所有进程,很容易造成系统的不稳定。很多时候出现问题,只要重启就能解决 ,其原因也在于此。

说了这么多,总结起来很简单,牛B的人自己去操纵系统内存分配的阈值,而普通用户则是想怎么用就怎么用,完全不用去鸟剩余内存的问题,那些内存清理的程序完全可以扔到一边了。
PS:

1.按home退出,程序保留状态为后台进程;按返回键退出,程序保留状态为空进程。空进程的oom_adj评值高于后台进程,更容易被系统清理。所以推荐用返回键退出。

2.UC、愤怒小鸟、都市赛车之类程序本身提供关闭功能 的,还是尽量主动关闭。浏览器 、电子市场、opera mini等不提供关闭功能的,直接返回键退出就行。



    我想每个人第一次用Android的时候,不可避免的会去装个任务管理器,然后对里面时刻都停留着一大堆的程序表示触目惊心,然后会在桌面 上 建立一个快捷清空内存的按钮,时不时啪的按一下,看着内存剩余数量从30多变成100多然后很有快感...其实吧,Android是Linux的内核,每 一个程序都是一个独立的JAVA虚拟机,就和油汤里的油花一样互不干扰,这样充分保证了万一某个程序的JAVA虚拟机崩溃,系统依旧稳定正常运行.而 Android和传统Linux不一样的地方又在于,传统Linux在进程活动停止后就结束了,这就类似于我们用S60和WM一样,关闭程序,内存释放. 而Android会把这些进程保留在内存里,干嘛呢?为了保证你再次激活这些进程时候启动的更快,比如说我们挂在桌面的Widgets,具体一点我们拿新 浪微博举例吧.我刚看完,退出,突然我想我发一条微博吧,那么这个时候我可以直接在桌面Widgets上操作----设想一下如果我退出的时候这个进程就 终止了,那么我在桌面上点击Widgets的时候会不会卡顿一下甚至没有响应?----这就跟我们把Widgets挂在桌面的行为完全背离了,放在桌面上 就是为了能随时观察到程序运行的情况,以及随时可以快速调用程序.所以Android并没有在进程活动停止就释放对应的内存.那么也许你还是会有疑问,那 么内存够不够用呢?

512的内存被我用的只剩56M是不是很恐怖?其实系统一点也不卡的,蛋定蛋定

是的,我理解,因为大家这么多年Windows都用习惯了,Windows内存不足的时候机器卡的会让你想砸掉机箱,而且调用虚拟内存的时候硬盘喀喀喀想的让你肉疼.你肯定也会怕你的手机 明 明512M内存结果就剩下30来M把你卡到崩溃.事实上呢,Android会在系统需要更多内存的时候,去释放掉那些占用内存的进程----这个活动是智 能的.最早大家认为是有个排序,比如最近使用过哪些程序(LRU机制,Last Recently Used),然后结束最早的进程.不过并非如此,否则就变成我们上小学时候那样,个子高的块头大的男生跟班长下去拔草扛新书,女生们留在班里绣花吧... 这样很明显不公平而且没准会结束掉那些我们并不想结束掉的进程----譬如说这会儿我想切回到刚才后台的网页继续浏览结果悲怆的发现它被系统给我强制关闭 了...

Android把进程分成了一些优先级,比如
  前台进程(Foreground),比如我们正在看书,那么看书的程序就是前台进程,这些进程是不会被系统优先结束的.当我把它切到后台的时候,它就变成后台进程了.

  还有可见进程(Visible),这个怎么说呢,譬如输入法 程 序,你平时是看不见它的,但是在你打开输入界面的时候,它会很快的弹出来,而不是让你等啊等啊等,看不到的原因是透明度的机制,咱就不要钻牛角尖讨论为啥 我看不见了...还有桌面的Widgets,比如我们的桌面时钟,这个东西就是可见的,如果它被系统终止了会有什么样的结果?这个Widgets依然会显 示在桌面上,但是时针不走了...

  主要服务,比如说,电话 的拨号功能,你也不想正急着打电话呢结果人家给你卡半天吧,尤其像我这样联系人 上2000的,载入一遍真的很慢啊...所以这些主要服务平时也不会被系统自动结束,除非你非要关它,关了也会自己重新加载的.这也是你完全释放内存以后过一会就看着内存可用值又慢慢降低的原因.

  次要服务(secondary server),诸如谷歌 企业套件,Gmail,联系人,看着这些程序出现在任务管理器里可能你会非常的莫名其妙,丫的这都哪跟哪啊我没开啊...其实它们和一些系统功能也是息息相关的,比如Gmail的邮件推送,我们时常需要用到它们,所以系统也太会去终止它们.甚至于HTC 机器上著名的HTC Sense,这个也是次要服务,但是其实它承接着整个系统界面的运行,所以,如果你强行关闭所有进程的时候,你的屏幕 会变成一片白...然后慢慢等HTC Sense加载.

  后台进程(hidden),就是我们通常意义上理解的启动后被切换到后台的进程,比如如浏览器和阅读器.后台进程的管理策略有多种,但是一般来讲,系 统都会视内存情况,尽可能多的保留后台程序,这样会影响到你启动别的程序的运行速度----我想这个很好理解,因为内存确实不够了,而且你还没让系统自动 释放内存.但好处是,你再次切换到这些已启动的程序时几乎是无缝的,速度绝对比你从0开始启动它要快得多.所以,这种后台进程在内存极度不够的时候,肯定 会被系统选择性的干掉的.

  内容供应节点(content provider),没有程序实体,仅提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等.在系统自动终止进程时,这类程序享有优先的被干掉权...

  空进程(empty),没有任何东西在内运行的进程,有些程序在退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息.这部分进程无疑是系统最先终止的.
说了这么多,其实还是要结合实际的程序来看一下的,比如Android这个很有名的自动内存调配的软件,Auto Memory Manager,它的设置 和 帮助界面就如上面所说的,它自动提供了多种默认配置,例如极速模式,这个模式下,会帮助你在设定好的临界值区间上,结束空进程以及内容供应节点等等低优先 级保留权的进程,来给你腾出更多的内存,加速新运行程序打开的速度,但是它也说明了这种模式的弊端,就是一些可能你不想被关闭的进程会被过早的关闭,比如 说,闹钟----在G2 G3还很火爆的2009年,很多用户在买完手机后给我抱怨,哎呀这个机器闹钟怎么老不响啊...上班老迟到...其实这就是因为手动结束进程的时候结果把 闹钟也给干掉了.系统的时间 是会一直走的,这属于主要服务,而闹钟呢,只是主要服务的一个附属品,所以被结束后,是不会自动被启动的,既然没有启动自然就不会响了.与此类似的例子就是里程碑 不充电的BUG,这是因为Moto的机器里有个USB的进程,如果你把它结束后,理论上会重新启动的但是也会不启动,后面这种情况出现的结果就是你插充电器 没反应,插数据线电脑 没反应...重启手机就好了.

当然我知道大家的洁癖很多,有的人就是见不得内存值太小...好吧如果你不想一些被系统认为不太重要而你又很需要的进程被你自己亲手扼杀的话,那么我推荐 你使用高级任务管理器这个程序,你可以把一些进程自动隐藏起来,也就是说当你挥起狼牙棒横扫一堆进程的时候,你设置好的几个进程是不会受任何影响的,比如 桌面Launcher,比如闹钟,比如USB,等等等等.但话说回来,我是不建议大家去手动管理Android的内存,也许你会不习惯----我也没啥好 劝告的,总之,不要把你的智能机想的那么笨就行了.
刚才全杀掉进程后,过了一会,我的DEFY又变成剩余60M内存,还是没啥鸭梨啊...如果你感兴趣可以做个试验,内存很少的时候,你打开一个大游戏,然后退出,你会发现...

2
5
分享到:
评论
1 楼 r8HZGEmq 2012-09-25  
哥们,,你真的很牛叉。。。膜拜一下

相关推荐

    android 常用类解说

    5. **Linux Kernel(Linux内核)**:作为整个系统的底层,Linux内核提供了内存管理、进程调度、网络栈、驱动模型等功能,为上层提供了稳定、高效的运行环境。 ### Android 的四大组件 Android平台中有四个主要的...

    基于android手持设备的景区导览系统应用开发概要设

    系统需考虑手持设备的内存、处理能力和电池寿命限制,同时遵循Android应用开发的最佳实践,确保软件性能和用户体验。 1.6 设计原则和设计要求 1) 用户友好:系统界面简洁直观,易于操作。 2) 可扩展性:方便添加新...

    基于android手持设备的景区导览系统设计.docx

    基于Android手持设备的景区导览系统设计是一种利用移动技术为游客提供智能化、便捷化游览体验的应用。这样的系统通常包括地图导航、景点介绍、语音导游、游客服务等功能,旨在提升景区的信息化水平,优化游客的游览...

    基于android手持设备的景区导览系统需求分析说明书.docx

    项目可能面临的技术风险包括Android平台的兼容性问题、网络连接的稳定性、用户界面设计的吸引力以及系统性能优化等。需要在开发过程中进行持续的风险评估和管理。 1.3 文档约定 本说明书遵循标准的软件需求规范,...

    基于安卓设备的景区导览系统.docx

    - 客户端:支持Android系统的智能移动设备,配备WiFi模块和GPS定位功能,触摸屏界面,支持音频输出。 - **软件环境**: - Android操作系统及其后续版本。 #### 四、功能需求分析 - **功能用例图**:系统设计中...

    LWUIT精简解说21条

    13. **内存优化**: LWUIT设计时考虑了内存占用,尽量减少对有限的移动设备资源的消耗。 14. **兼容性**: 虽然主要面向Java ME,但LWUIT也兼容部分Java SE和Android平台,增强了跨平台开发的可能性。 15. **图形...

    Cross Platform Replay Kit Easy Screen Recording on iOS Android 1

    然而,对于Android平台,开发者需要寻找类似的功能实现,因为Android系统并没有直接提供等效的API。 3. **Cross Platform Replay Kit介绍** "Cross Platform Replay Kit"正是解决这个问题的工具,它为Unity3D提供...

    安卓开发以及软件开发所用到的小工具类

    - `Logcat`是Android系统提供的日志查看工具,它收集并显示应用和系统的日志信息,对于调试和故障排查非常有用。 9. **自动化测试工具**: - Espresso和JUnit等工具可以编写和运行自动化测试,确保代码质量与应用...

    UiAutomator详细解说

    - Android Studio:集成开发环境,内置SDK Manager,方便管理Android SDK。 - Android Debug Bridge (ADB):用于连接设备或模拟器,执行命令。 - Java Development Kit (JDK):Java编程的基础环境。 安装完成后,...

    [Android开发从零开始].18.消息处理详解.docx编程资料

    **MessageQueue** 是Android系统中的一个重要组件,主要负责管理消息队列。每当有新的消息(Message)被加入时,MessageQueue会将其存储起来并按照顺序排队。这些消息会被Looper不断地从队列中取出,并交给相应的...

    凯斯MTK基础提高篇(MTKOS.com内部资料)

    6. **性能调优**:在MTK平台上,性能优化是必不可少的环节,包括内存管理、CPU调度、功耗控制等方面。教程将提供具体的优化案例和实践指导。 7. **故障排除与常见问题**:针对开发过程中可能遇到的问题,教程会列出...

    基于Android的中国象棋手机APP设计与实现.docx

    ### 基于Android的中国象棋手机APP设计与实现 #### 一、背景与意义 随着移动互联网技术的快速发展,智能手机已经普及到人们的日常生活中,成为不可或缺的一部分。手机游戏作为移动互联网的重要组成部分,不仅为...

    Fragment生命周期讲解

    2. **onCreate()**: 在这里,系统会为Fragment分配内存,并初始化基本成员变量。通常用于设置布局或创建数据对象,但不应在此处执行耗时操作,因为这会影响UI的响应性。 3. **onCreateView(LayoutInflater, ...

    展讯平台MOCOR09A平台 入门文档

    开发者需要理解Android系统的组件模型,并能熟练运用AndroidManifest.xml文件来声明和配置这些组件。 压缩包中的文件名称列表显示,文档涵盖了从基础到进阶的不同阶段,例如"展讯学习概要至5.7章菜单的添加.doc...

    Google Chrome 6.0.451.0 Dev 版(一个由Google公司开发的网页浏览器)

    ”在此之前,谷歌已经推出了手机操作系统Android,另外,数款上网本也使用了这款操作系统。  长期以来,谷歌一直致力于计算机软件对于互联网的兼容性,以取代以计算机为中心的软件开发方式。谷歌希望,能够开发出...

Global site tag (gtag.js) - Google Analytics