Android 内存管理原理
在Android开发中我们常常遇到app在后台长期不使用时被系统自动回收掉,Android系统是怎么实现这个功能的呢。我们不讨论如何让app保活的方法,主要来说说系统实现这一机制的原理
目前创新互联建站已为近1000家的企业提供了网站建设、域名、虚拟主机、绵阳服务器托管、企业网站设计、鸠江网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
在Android系统中使用oom_adj值来描述一个进程的重要程度,它是AMS的Process类型中的一个变量,oom_adj值越小,表示进程越重要,越不容易被杀掉。以下是AMS中定义的一些oom_adj值
可以看到一些运行核心服务的进程的oom_adj为-12(CORE_SERVER_ADJ),这类进程基本不会被杀死。其他未赋值的都在static块中进行了初始化,是通过system/rootdir/init.rc进行配置的:
可以看到前台进程的oom_adj值为0,这类进程时我们正在交互的进程,基本也不会被杀掉;空进程对应的值是15,当系统内存不足是最新杀掉的就是这类进程(这类进程一般指的是所有的activity都destory掉了,并且没有service在运行)。adj值下面描述的是各种内存阀值。比如当系统剩余内存小于6144 * 4kb(ro.EMPTY_APP_MEM)是emty 进程就会被回收掉。这些值对与每个手机厂商生产的手机都是不一样的。以下是oom_adj值对应的内存阀值
如上所说,当系统内存小于6144 * 4kb时empty进程将会被回收掉,而empty进程的oom_adj值为15。在Activity、service、contentProvider、Broadcast Android四大组件的状态的变化都会导致AMS更新对应进程oom_adj值,所以前台进程比后台进程更不容易杀掉,带有service的后台进程比没有service的进程更不容易被杀掉
LMK的全称是low memory killer,它是内核的一个模块。它里面保存了各个进程的pid以及对应的oom_adj,每次AMS调用updateOOmAdj函数更新进程的oom_adj时都会通知LMK模块。
LMK通过linux的shrinker模块来监听系统的内存变化,当系统的剩余内存达到某个阀值时就会杀掉oom_adj值大于这个阀值对应的oom_adj的进程。它会优先杀掉内存占用多的进程,如果杀掉这些进程内存回到了正常值将不会继续杀进程。所以让app不要占用大量的内存也可以起到保活的作用
如何管理Android手机剩余内存
大家知道要如何管理Android手机剩余内存吗?管理Android手机剩余内存有什么方法?下面一起来看看!
其实大家不用那么在意android手机剩余内存的大小。
很多人都是把使用其他系统的习惯带到了android手机上,不是所有的智能手机系统都一样的。android大多数应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系。如果你知道java,就能更清楚这机制了。其实和java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。但事实上他并不影响速度。相反加快了下次启动应用的速度。这本来也是android的优势之一,如果人为去关闭进程,没有太大必要。特别是自动关进程的软件。
为什么内存少的时候运行大型程序会慢呢?
其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。
进程管理软件到底还有存在的价值吗?
其实还是有的,在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度。但一些小程序,完全可交由系统自己管理。很多朋友还有个疑问,如果不关程序是不是会更耗电?这里也解释一下,android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重新进入,还会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务,服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,名字是service。所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个android的优点呢?
为什么android应用看起来那么耗内存?
大家知道,android上的应用是java,当然需要虚拟机,而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。
至于为什么开了大程序或者开了好几个程序之后切换会变慢,具体分析如下:
已经开启了一个大程序,占用70%内存,如果再想运行一个程序,此时还需要50%的内存,则就需要一个从大程序占用的内存中释放或者压缩的过程,所以表现出来的就是慢一会儿。
已经开启了几个程序共占用内存80%,运行新程序时又需要20%的内存,系统内存因为没见过剩余0的时候,也就是应该剩一部分空闲内存,那么就需要从之前开启的这几个程序中选择一个或者几个来关闭,这一过程也需要耗费系统资源,所以会慢一会儿。也就是说你手动去结束程序的时候,就是替系统在释放内存,就算你不去结束,在需要内存的时候系统也会自动结束程序释放内存。
不在后台运行的程序(没服务的),即使不结束也不会耗电。在后台运行的(有服务的`)程序,如一些播放器或实时监控的软件,自然会耗电。这就说明结束进程并不是没用,我们只需要看哪个带服务耗电哪个程序后台一直在运行,看服务就能看出来,这样的软件如果用不到的时候就结束了吧。
以QQ举例,正常的退出,会在进程管理里留下qq的运行过的状态,但不耗电不占 cpu,如果你只是切换出去(按房子键而不是退出)那么自然会耗电,因为程序还在运行,QQ还在线呢。
这里就有个要注意的地方了,虽然房子键和那个返回键都可以将程序切换出去,但是两者的效果差异是很大的,返回键可以视作程序已经退出了,而按房子键,则是将程序切换到了后台来运行,软件并没有退出哦!
以上这些设计都是为了确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现。大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,得不偿失。大家不妨换种观念习惯来使用android系统。
Android手机清理内存的方法
和PC用户一样智能手机用户也会遇到手机存储不足的问题,对于Android手机来说因为系统不支持安装程序到SD卡,手机配置的存储容量也有限,很多用户都碰到过安装程序太多系统内存不足的问题。虽然Android2.2系统开始已经支持Apps2SD功能,但是很多用户使用后发现Android2.2系统下仍然有很多应用程序无法安装到SD卡,即可程序支持移动到SD卡,但是还会保留一部分系统文件和隐私文件在手机内存里。另外还有一些程序像Widgets,动态壁纸和一些系统程序,如果安装在SD卡根本无法正常工作,内存不足依然是让很多用户感到棘手的问题。不过Android作为一种优秀的移动操作系统,提供了几种可以清理和释放内存空间的办法,我们总结了下面几点希望可以帮助用户解决燃眉之急。
清理大型应用程序的缓存数据。
1、通过清理程序的缓存文件,释放的内存空间会让你喜出望外。 2、进入手机设置选项,选择设置应用程序管理应用程序。 3、按一下Menu键,选择“按大小排序”选项(如果是Android2.2手机先要选择已下载标签),然后就可以按照应用程序大小排列所有手机安装的应用程序。 4、点击一款列表中的应用程序,如果程序有缓存文件可以显示大小,直接点击“清除缓存”选项就可以释放这些缓存文件占据的空间。 5、有一些应用程序的缓存文件可能多达数MB,比如GoogleMaps,Market,浏览器和相册程序,清理这几个程序的缓存文件就可以释放相当可观的空间。 6、很多手机厂商都在旗下手机预装了自己开发的UI程序,比如HTCSense,MOTOBLUR等,如果你打算使用LaunherPro或者ADW这样的launcher程序替代HTCSense,你可以清理甚至删除HTCSense的数据文件,这个操作可以让你的'手机多出几十MB空间。 7、另外AndroidMarket还提供一些自动清除缓存文件的应用程序,比如QuickAppCleanCache这款收费软件。对于已经取得root权限的手机用户,可以从Market下载CacheCleaner,CacheMate和MoveCache这些程序来快速方便的清除程序缓存文件。
删除那些你从来不用或者很少使用的应用程序这是很多用户都会面对的问题,默默忍受着手机内存不足的报警,甚至牺牲系统性能,就是舍不得删除那些从来不用或者极少使用的应用程序,这可能也是一种强迫症。删除这些程序你会发现手机从此海阔天空,而且你没有任何损失。移动所以可以移动的应用程序数据到SD卡运行Android2.2系统的手机支持安装应用程序到SD卡,确保检查所有你安装的应用程序如果支持appstoSD卡功能一定要移动到SD卡,对于一些大型软件特别是游戏程序节省的容量相当可观。
不过一定要注意Widgets程序,捆绑Widgets的程序,以及动态壁纸程序和那些需要在后台运行并且和系统进行交互的应用程序不要移动到SD卡存储,否则程序可能无法正常工作。如果觉得每个程序单独设置太麻烦,可以借助Apps2SD和SDMove这样的程序简化操作过程。对于那些动手能力比较强的用户可以通过网上的教程设置应用程序默认安装到SD卡,这样就可以一劳永逸。
android之ION内存管理器(1)-- 简介
回顾2011年末[2],LWN审查了android kernel patch[3],以期望将这些patch合并到kernel主线中。但是PMEM(android实现的 一个内存分配器)使这个愿望破灭了。为什么PMEM不被linux 社区接受的原因在[3]中有讲到。从那开始,PMEM很明确会被完全抛弃,取而代之的是ION内存管理器。ION是google在Android4.0 ICS为了解决内存碎片管理而引入的通用内存管理器,它会更加融合kernel。目前QCOM MSM, NVDIA Tegra, TI OMAP, MRVL PXA都用ION替换PMEM。
ION codes reside in drivers/gpu/ion
Specific usage examples on omap4:
ION 定义了四种不同的heap,实现不同的内存分配策略。
下图是两个client共享内存的示意图。图中有2个heap(每种heap都有自己的内存分配策略),每个heap中分配了若干个buffer。client的handle管理到对应的buffer。两个client是通过文件描述符fd来实现内存共享的。
定义了6种 ioctl 接口,可以与用户应用程序交互。
内核驱动也可以注册为一个ION的客户端(client),可以选择使用哪种类型的heap来申请内存。
Heap 接口定义 [drivers/gpu/ion/ion_priv.h]
这些接口不是暴露给驱动或者用户应用程序的。
ION 在/sys/kernel/debug/ion/ 提供一个debugfs 接口。
每个heap都有自己的debugfs目录,client内存使用状况显示在/sys/kernel/debug/ion/heap name
每个由pid标识的client也有一个debugfs目录/sys/kernel/debug/ion/pid
原文链接:
怎么管理Android手机的剩余内存教程
使用android手机的用户可能都安装了任务管理的软件,使用android手机真的有必要安装结束任务的软件吗?大家在使用中也都发现了,很多软件在被结束后,马上就会又出现在任务列表里,或是稍等一会自己也会出现,任务管理不停的结束后台程序,也没见给手机的运行速度带来多少提升,这是为什么呢?
其实大家不用那么在意android手机剩余内存的大小。很多人都是把使用其他系统的习惯带到了android手机上,不是所有的智能手机系统都一样的。android大多数应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系。如果你知道java,就能更清楚这机制了。其实和java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。但事实上他并不影响速度。相反加快了下次启动应用的速度。这本来也是android的优势之一,如果人为去关闭进程,没有太大必要。特别是自动关进程的软件。
可能有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。
那么,进程管理软件到底还有存在的价值吗?其实还是有的,在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度。但一些小程序,完全可交由系统自己管理。很多朋友还有个疑问,如果不关程序是不是会更耗电?这里也解释一下,android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重新进入,还会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务,服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,名字是service。所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个android的优点呢?
还有一点,为什么android应用看起来那么耗内存?大家知道,android上的应用是java,当然需要虚拟机,而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。
至于为什么开了大程序或者开了好几个程序之后切换会变慢,具体分析如下:
已经开启了一个大程序,占用70%内存,如果再想运行一个程序,此时还需要50%的内存,则就需要一个从大程序占用的内存中释放或者压缩的过程,所以表现出来的就是慢一会儿。
已经开启了几个程序共占用内存80%,运行新程序时又需要20%的内存,系统内存因为没见过剩余0的时候,也就是应该剩一部分空闲内存,那么就需要从之前开启的这几个程序中选择一个或者几个来关闭,这一过程也需要耗费系统资源,所以会慢一会儿。也就是说你手动去结束程序的时候,就是替系统在释放内存,就算你不去结束,在需要内存的时候系统也会自动结束程序释放内存。
不在后台运行的程序(没服务的),即使不结束也不会耗电。在后台运行的.(有服务的)程序,如一些播放器或实时监控的软件,自然会耗电。这就说明结束进程并不是没用,我们只需要看哪个带服务耗电哪个程序后台一直在运行,看服务就能看出来,这样的软件如果用不到的时候就结束了吧。
以QQ举例,正常的退出,会在进程管理里留下qq的运行过的状态,但不耗电不占 cpu,如果你只是切换出去(按房子键而不是退出)那么自然会耗电,因为程序还在运行,QQ还在线呢。
这里就有个要注意的地方了,虽然房子键和那个返回键都可以将程序切换出去,但是两者的效果差异是很大的,返回键可以视作程序已经退出了,而按房子键,则是将程序切换到了后台来运行,软件并没有退出哦!
以上这些设计都是为了确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现。大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,得不偿失。大家不妨换种观念习惯来使用android系统。
安卓手机如何快速清理内存
(一)打开文件管理
分别搜索temp,backup,cache,download,带有这四个选项下的均可删除(除特殊情况自己需要保存的文件外)
(二)打开微信,设置,帮助于反馈,点击右上角小扳手的符号,打开深度清理;再回到设置,通用,存储空间,点击清理缓存以及不需要的聊天记录,这样能够深度清理微信里面的垃圾。
分享题目:android的内存管理,Android 内存管理
链接URL:http://lswzjz.com/article/dscodje.html