《Android 中LMK机制分析》.docx
文本预览下载声明
Android 中LMK机制分析一、Android进程管理Android是一个多任务系统,当启动一个程序时会消耗一定的时间。为了加快运行速度,当退出一个程序时,Android并不会立即杀掉它。这样当用户重新运行该程序时,可以很快地启动。但随着系统中保留的程序越来越多,内存肯定会出现不足,此时就有了Android的低内存管理(Low Memory Killer)机制。Android根据进程的重要性,将进程分为以下几类:前台进程(forground process),用户正在做的事情相关的进程,具体包括:正在和用户交互的Activty,即该Activity的onResume()已经执行过。包含一个service,该service正在服务于和用户交互的Activity。包含一个service,该service正在执行onCreate(),或者onStart(),onDestroy()。包含一个BroadcastReceiver,正在执行onRceive()函数可见的进程(visible process),尽管没有和用户交互,但是却可以影响用户所能看得到的内容。尽管没有包含和用户交互的Activity,但是用户却可以看得见该Activity的窗口,比如一个Activity上面弹出一个对话框的情况包含一个service,该service服务于可见的Activity。服务进程(service proces),凡是使用startService()所启动的service对象,其所在的进程都称之为服务进程。当然,如果该service满足上面两个优先级中的条件,则会上升为相应的优先级后台进程(background process),不满足以上任何一个条件的进程,同时该进程中还包含一些不可见的Activity,这些进程不影响正在和用户交互的Activity。空进程(empty process),进程中不包含任何component,包括Activity、service、receiver对象。之所以还保留这些进程的原因是为了减少重新创建进程的开销。以上每个进程都会有个oom_adj值。二、oom_adj的值是如何赋予的进程的adj类型,可以在ActivityManagerService中清楚的看到: static final int EMPTY_APP_ADJ; static final int HIDDEN_APP_MAX_ADJ; static final int HIDDEN_APP_MIN_ADJ; static final int HOME_APP_ADJ; static final int BACKUP_APP_ADJ; static final int SECONDARY_SERVER_ADJ; static final int HEAVY_WEIGHT_APP_ADJ; static final int PERCEPTIBLE_APP_ADJ; static final int VISIBLE_APP_ADJ; static final int FOREGROUND_APP_ADJ; static final int CORE_SERVER_ADJ = -12; static final int SYSTEM_ADJ = -16; ActivityManagerService定义各种进程的oom_adj,CORE_SERVER_ADJ代表一些核心的服务的omm_ad,数值为-12,这类进程永远也不会被杀死。其他未赋值的都在static块中进行了初始化,是通过system/rootdir/init.rc进行配置的:在init.rc中:# Define the oom_adj values for the classes of processes that can be# killed by the kernel. These are used in ActivityManagerService. setprop ro.FOREGROUND_APP_ADJ 0 setprop ro.VISIBLE_APP_ADJ 1 setprop ro.SECONDARY_SERVER_ADJ 2 setprop ro.HIDDEN_APP_MIN_ADJ 7 setprop ro.CONTENT_PROVIDER_ADJ 14 setprop ro.EMPTY_APP_ADJ 15# Define the memory thresholds at which the above process classes will# be killed. These numbers are in pages (4k). setprop ro.FOREGRO
显示全部