ANDROID内存管理原理
我们一直听说Android是一个多进程操作系统,那么它是如何处理每一个进程呢?
大家可能已经发现 Android自身并没有所谓的关闭进程的说法 每当我们要退出一个进程回到桌面/打开另一个程序的时候我们只能按"返回键". 而当我们按下"返回键"后,该进程并没有真正的关闭,仍然保存在内存中. 这样在下次调用的时候可以更快的打开该程序.
要想真正的关闭一个已打开的进程,除了用第三方软件(例如advanced task manager)外,还有一个,那就是当Android系统认为当时已经没有足够的内存来运行新的进程,需要关闭一些虽然已经开着,但是没有用了(具体怎样一个进程才会被Android系统认为是"没有用"下面就要讨论到)的进程.
而下面要研究的就是这个Android内部的lowmemorykiller.
ActivityManagerService.java记录着每一个进程的优先级. 一个进程的oom_adj值也就代表了它的优先级. oom_adj值越高代表该进程优先级越低. 一个正在使用的进程的oom_adj值为0,一旦我们按下返回键,这个进程就会得到一个更高的oom_adj值(更低的优先级). 具体多少取决于该进程在LRU(last recently used) list的位置.(未证实)
具体的细节保存在Android源文件drivers/misc/lowmemorykiller.c里.
Android将进程分为6个等级,它们按优先级顺序由高到低依次是:. R
1. FOREGROUND_APP:? ? This is the process running the current foreground app.??We'd really rather not kill it!r
用户正在使用的程序. 这个设的太高,用户看到得就会是一个正在使用的程序莫名其妙的消失了,然后自动回到桌面..(因为它被系统kill了..) 所以最好别动它..
? ?
2. VISIBLE_APP:
This is a process only hosting activities that are visible to the user, so we'd prefer they don't disappear.
跟FOREGROUND_APP类似,用户正在使用/看得到. 它们的区别就是VISIBLE_APP可能不是用户focus的程序,但是用户看得到,或者没有覆盖到整个屏幕,只有屏幕的一部分. 所以可以适当的比FOREGROUND_APP高一点.
?3. SECONDARY_SERVER:
?This is a process holding a secondary server -- killing it will not have much of an impact as far as the user is concerned.
? ? 所有应用的service. 系统级的service比如PhoneService不属于这类,它们是绝不会被Android结束掉的. 所以这个可以适当的设高一点点~ 注意, HOME(SenseUI)也包括在这里 因此还是别设的太高. 要不每次返回桌面都得等它重新load,特别是widget多的..
4. HIDDEN_APP:. T
This is a process only hosting activities that are not visible, so it can be killed without any disruption.; o" A5 Y- Q4 \! V) r; }? ? 本来属于1或者2的程序, 在用户按了"back"或者"home"后,程序本身看不到了,但是其实还在运行的程序,它们就属于HIDDEN_APP了. 干掉没什么影响.. 不过要了解并不是所有属于这一类的就应该马上结束掉,像push mail,locale,闹钟,等都属于这一类. 因此还是别设的过高. 真正"应该"一点返回键就退出的程序(真正没用的程序)在下面.
5. CONTENT_PROVIDER:
This is a process with a content provider that does not have any clients attached to it.??If it did have any clients, its adjustment would be the one for the highest-priority of those processes.
5,6的区别具体不太了解..这个也是用处不大,但是还是比EMPTY_APP稍微有点用.. 所以高点没