安卓系统内存优化方法及装置与流程

文档序号:18544116发布日期:2019-08-27 21:30阅读:656来源:国知局
安卓系统内存优化方法及装置与流程
本发明涉及一种内存优化方法及装置,尤其是指一种安卓系统内存优化方法及装置。
背景技术
:现有技术android-64位系统需要在1g的内存环境中运行,造成了硬件成本高,在当前激烈的市场竞争中不占优势。从硬件上降成本,是提高产品竞争力的必要手段。在512m内存中运行android-64位系统是硬件降成本的重要措施,但要使得android-64位系统在512m内存中运行流畅,需要对安卓系统内存进行优化。技术实现要素:本发明所要解决的技术问题是:提供一种安卓系统内存优化方法及装置,旨在实现android-64位系统能够在512m内存中流畅运行的情况下,保证应用程序能够在512m内存中重度使用。为了解决上述技术问题,本发明采用的技术方案为:一种安卓系统内存优化方法,所述安卓系统内存优化方法包括以下步骤,s10、设置安卓虚拟机的堆内存参数,所述堆内存参数包括堆分配的初始大小、受控情况下的极限堆大小、不受控情况下的极限堆大小、回收内存最大值及回收内存最小值;s20、将zram的大小设置在150-170m之间;s30、开启一个监控服务,对zram的使用率进行监控,当监控到zram的使用率大于预设值时,监控服务将后台进程杀掉,保留前台进程和系统进程,并记录下此刻的前台进程;s40、系统灭屏后,监控服务再将记录下的前台进程杀掉。进一步的,所述步骤s10具体包括,将堆分配的初始值设为8m,受控情况下的极限堆大小设为54m,不受控情况下的极限堆大小设为64m,回收内存最大值设为2m,回收内存最小值设为512k。进一步的,所述步骤s30中,当监控到zram的使用率大于90%时,监控服务将后台进程杀掉,保留前台进程和系统进程。进一步的,所述步骤s20中,将zram的大小设置在160m。为了解决上述技术问题,本发明采用的另一个技术方案为:一种安卓系统内存优化装置,所述安卓系统内存优化装置包括,堆内存参数设置模块,用于设置安卓虚拟机的堆内存参数,所述堆内存参数包括堆分配的初始大小、受控情况下的极限堆大小、不受控情况下的极限堆大小、回收内存最大值及回收内存最小值;zram设置模块,用于将zram的大小设置在150-170m之间;后台进程管理模块,用于开启一个监控服务,对zram的使用率进行监控,当监控到zram的使用率大于预设值时,监控服务将后台进程杀掉,保留前台进程和系统进程,并记录下此刻的前台进程;前台进程管理模块,用于系统灭屏后,监控服务再将记录下的前台进程杀掉。进一步的,所述堆内存参数设置模块具体用于,将堆分配的初始值设为8m,受控情况下的极限堆大小设为54m,不受控情况下的极限堆大小设为64m,回收内存最大值设为2m,回收内存最小值设为512k。进一步的,所述后台进程管理模块,还用于当监控到zram的使用率大于90%时,监控服务将后台进程杀掉,保留前台进程和系统进程。进一步的,所述zram设置模块,还用于将zram的大小设置在160m。本发明的技术效果在于:设置安卓虚拟机的堆内存参数,使得应用的内存得到限制,保证安卓系统能够在512m的内存上流畅运行,将zram的大小设置在150-170m之间,使得应用程序能够流畅地运行;通过开启一个监控服务,对zram的大小进行监控,当监控到zram的使用率大于预设值时,监控服务将后台进程杀掉,保留前台进程和系统进程,并记录下此刻的前台进程,使得应用程序能够在512m内存的android设备上进行重度使用;在系统灭屏后,监控服务再将记录下的前台进程杀掉,使得系统耗电量更少;使用512m的内存,能够有效降低硬件成本。附图说明下面结合附图详述本发明的具体结构。图1为本发明一具体实施例的安卓系统内存优化方法流程图;图2为本发明一具体实施例的安卓系统内存优化装置模块框图。具体实施方式为详细说明本发明的技术内容、构造特征、所实现目的及效果,以下结合实施方式并配合附图详予说明。如图1所示,本发明的一具体实施例为:一种安卓系统内存优化方法,所述安卓系统内存优化方法包括以下步骤,s10、设置安卓虚拟机的堆内存参数,所述堆内存参数包括堆分配的初始大小、受控情况下的极限堆大小、不受控情况下的极限堆大小、回收内存最大值及回收内存最小值;s20、将zram的大小设置在150-170m之间;s30、开启一个监控服务,对zram的使用率进行监控,当监控到zram的使用率大于预设值时,监控服务将后台进程杀掉,保留前台进程和系统进程,并记录下此刻的前台进程;s40、系统灭屏后,监控服务再将记录下的前台进程杀掉。优选地,所述步骤s10具体包括,将堆分配的初始值设为8m,受控情况下的极限堆大小设为54m,不受控情况下的极限堆大小设为64m,回收内存最大值设为2m,回收内存最小值设为512k。优选地,所述步骤s30中,当监控到zram的使用率大于90%时,监控服务将后台进程杀掉,保留前台进程和系统进程。优选地,所述步骤s20中,将zram的大小设置在160m。本实施例中,实现android-64位系统能够在512m内存中流畅运行;在以上基础上实现特定应用在512m内存中流畅运行;保证特定应用在重度使用的情况能够在512m内存中流畅运行。一、实现android-64位系统能够在512m内存中流畅运行让android-64位系统在512m内存中流畅运行的目标就是让android的系统核心服务和相关的java应用能够运行。由于与java相关,所以需要设置android系统的dalvik虚拟机的相关参数。1、android内存管理的相关原理:1)android系统通过下面几种方式来实现共享内存:android应用的进程都是从一个叫做zygote的进程fork出来的。zygote进程在系统启动,并载入通用的framework的代码与资源之后开始启动。为了启动一个新的程序进程,系统会forkzygote进程生成一个新的进程,然后在新的进程中加载并运行应用程序的代码。这就使得大多数的rampages被用来分配给framework的代码,同时促使ram资源能够在应用的所有进程之间进行共享。大多数static的数据被mmapped到一个进程中。这不仅仅让同样的数据能够在进程间进行共享,而且使得它能够在需要的时候被pagedout。常见的static数据包括dalvikcode、appresources、so文件等。大多数情况下,android通过显式的分配共享内存区域(例如:ashmem或gralloc)来实现动态ram区域能够在不同进程之间进行共享的机制。比如,windowsurface在app与screencompositor之间使用共享的内存,cursorbuffers在contentprovider与clients之间共享内存。2)分配与回收内存:每一个进程的dalvikheap都反映了使用内存的占用范围。这就是通常逻辑意义上提到的dalvikheapsize,它可以随着需要进行增长,但是增长行为会有一个系统为它设定上限。逻辑上讲的heapsize和实际物理意义上使用的内存大小是不对等的,proportionalsetsize(pss)记录了应用程序自身占用以及与其他进程进行共享的内存。android系统并不会对heap中空闲内存区域做碎片整理。系统仅仅会在新的内存分配之前判断heap的尾端剩余空间是否足够,如果空间不够会触发gc操作,从而腾出更多空闲的内存空间。在android的高级系统版本里面针对heap空间有一个generationalheapmemory的模型,最近分配的对象会存放在younggeneration区域。当这个对象在该区域停留的时间达到一定程度,它会被移动到oldgeneration,最后累积一定时间再移动到permanentgeneration区域。系统会根据内存中不同的内存数据类型分别执行不同的gc操作。3)限制应用的内存:为了整个系统的内存控制需要,android系统为每一个应用程序都设置一个硬性的dalvikheapsize最大限制阈值,这个阈值在不同的设备上会因为ram大小不同而各有差异。如果你的应用占用内存空间已经接近这个阈值,此时再尝试分配内存的话,很容易引发outofmemoryerror错误。activitymanager.getmemoryclass()可以用来查询当前应用的heapsize阈值,这个方法会返回一个整数,表明应用的heapsize阈值是多少mb(megabates)。4)应用切换操作:android系统并不会在用户切换应用的时候执行交换内存操作。android会把那些不包含foreground组件的应用进程放到lrucache中。例如,当用户开始启动一个应用时,系统会为它创建一个进程。但是当用户离开此应用,进程不会立即被销毁,而是被放到系统的cache当中。如果用户后来再切换回到这个应用,此进程就能够被马上完整地恢复,从而实现应用的快速切换。如果你的应用中有一个被缓存的进程,这个进程会占用一定的内存空间,它会对系统的整体性能有影响。因此,当系统开始进入lowmemory的状态时,它会由系统根据lru的规则与应用的优先级,内存占用情况以及其他因素的影响综合评估之后决定是否被杀掉。2、android应用运行时的内存模型:android原生开发以java为主,而java程序都是运行在java虚拟机(jvm)之上的且内存全权交给虚拟机去管理,那虚拟机的运行时内存模型包括堆和栈,但这只是对内存粗略的一种划分,其中“堆”对应内存模型的java堆;“栈”则是指虚拟机栈,但是实际上java运行时内存模型比这复杂多了,在sun制定的java虚拟机规范中,运行时内存模型,分为线程私有和共享数据区两大类,其中线程私有的数据区包含程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包含java堆、方法区(又称为静态存储区,方法区内还有一个常量池),设置dalvik虚拟机heap(堆)的相关参数是限制android应用内存使用的核心。3、dalvik虚拟机heap(堆)的重要参数:1)dalvik.vm.heapstartsize,堆分配的初始大小,调整这个值会影响到应用的流畅性和整体内存消耗。这个值越小,系统内存消耗越慢,但是由于初始值较小,一些较大的应用需要扩张这个堆,从而引发垃圾回收(gc)和堆调整的策略,会让应用反应更慢。相反,这个值越大系统内存消耗越快,但是程序更流畅。2)dalvik.vm.heapgrowthlimit,受控情况下的极限堆(仅仅针对dalvik堆,不包括native堆)大小,dalvikheap是可增长的,但是正常情况下dalvikheap的大小是不会超过dalvik.vm.heapgrowthlimit的值。这个值控制那些受控应用的极限堆大小,如果受控的应用dalvikheapsize超过该值,则将引发oom(outofmemory)。3)dalvik.vm.heapsize,不受控情况下的极限堆大小,这个就是堆的最大值。不管它是不是受控的。这个值会影响非受控应用的dalvikheapsize。一旦dalvikheapsize超过这个值,直接引发oom(outofmemory)。4)dalvik.vm.heapmaxfree,对虚拟机垃圾回收的频率有影响。4、经过大量的试验,在512m内存的情况下,android-64位系统的虚拟机参数如下:[dalvik_512m]dalvik.vm.heapsize=64m;dalvik.vm.heapstartsize=8m;dalvik.vm.heaptargetutilization=0.85;dalvik.vm.heapminfree=512k;dalvik.vm.heapmaxfree=2m;dalvik.vm.heapgrowthlimit=54m;dalvik.vm.dex2oat-flags=--no-watch-dog;dalvik.vm.jit.codecachesize=0;二、实现特定应用在512m内存中流畅运行主要措施是:设置zram的大小1、相关原理:android系统是基于linux平台的操作系统,android应用本质是运行在linux用户空间的程序,在内存中大体上分为代码段、文件资源和数据段。对于linux来说,代码段和文件资源所在的内存页面称之为有文件背景的页面,数据段所在的内存页面称之为没有文件背景的页面,也称为匿名页。当内存紧张的时候,linux会将应用程序代码段的页面丢弃,文件资源的相关页面回写进存储设备并回收页面,数据段相关的匿名页进入交换分区(swappartition)并释放内存。交换分区在不同的设备有着不同的存在方式。在电脑中,交换分区就是硬盘上的一段区域;在android系统的手机和平板上,交换分区则是内存的一片区域,这个内存区域称之为zram。zram(也称为zram,先前称为compcache)是linux内核的一项功能,可提供虚拟内存压缩。zram通过在ram内的压缩块设备上分页,直到必须使用硬盘上的交换空间,以避免在磁盘上进行分页,从而提高性能。由于zram可以用内存替代硬盘为系统提供交换空间的功能,zram可以在需要交换/分页时让linux更好利用ram,在物理内存较少的旧电脑上尤其如此。zram仍有利于嵌入式设备、上网本和其它相似的低端硬件设备。这些设备通常使用固态存储,它们由于其固有性质而寿命有限,因而避免以其提供交换空间可防止其迅速磨损。此外,使用zram还可显著降低linux系统用于交换的i/o。2、配置zram:1)配置linux内核;需要在内核的config文件中配置:config_swapconfig_cgroup_mem_res_ctlrconfig_cgroup_mem_res_ctlr_swapconfig_zram2)在fstab.[project_name]文件中修改;/dev/block/zram0noneswapdefaultszramsize=167772160;3)在init.[project_name].rc文件添加onearly-fsswapon_all/fstab.[project_name]3、测试验证:经过大量的试验,将zram的大小设置160m,特定应用能够流畅地运行起来。三、保证特定应用在重度使用的情况能够在512m内存中流畅运行(一)android系统lowmemorykiller机制如下表1,在android系统中用户空间的每一个进程都对应一个oom_adj,oom_adj划分为16级,从-17到16之间取值。adj值越大,优先级越低,adj<0的进程都是系统进程。表1:512m内存的android设备lowmemorykiller的参数如下:表2:oom_adjoom_score_adj剩余内存151000141m9529104m317668m211754m15843m008m如上表2所示,对于oom_adj与oom_score_adj通过方法lowmem_oom_adj_to_oom_score_adj()建立有一定的映射关系:当oom_adj=15,则oom_score_adj=1000;当oom_adj<15,则oom_score_adj=oom_adj*1000/17;根据上表2,可以看出:当内存剩余141m时,系统会杀掉oom_adj>=15的进程;当内存剩余104m时,系统会杀掉oom_adj>=9的进程;当内存剩余68m时,系统会杀掉oom_adj>=3的进程;当内存剩余54m时,系统会杀掉oom_adj>=2的进程;当内存剩余43m时,系统会杀掉oom_adj>=1的进程;当内存剩余8m时,系统会杀掉oom_adj>=0的进程。由此可以看出:1.android系统管理大概3类进程:1)系统进程(oom_adj<0的进程),系统进程不能杀,杀掉系统进程会导致整个系统重启;2)前台进程(oom_adj=0的进程),前台进程通常是用户正在使用的应用;3)后台进程(oom_adj>0的进程),杀掉后台进程,用户是无法感知的2.oom_adj是动态变化的比如用户正在玩微信,那么此时微信的oom_adj就为0;用户不想玩微信了,跑去看头条新闻,那么头条新闻的oom_adj就为0,微信的oom_adj就大于0了。(二)对lowmemorykiller的补充在特定应用被重度使用时,android系统为了特定应用能够正常运行,会将暂时不使用的匿名页回收进zram,zram会慢慢地达到上限。此时特定应用继续重度使用的话,我们会发现zram已经耗尽,整个系统性能急剧下降。此时有一个很有趣的现象,剩余的内存在100m以上,没有达到触发android系统lowmemorykiller杀掉oom_adj>=1进程的条件。所以需要一个新的机制来将内存从zram中释放出来。经过大量试验发现,当zram耗尽时,我们将占用zram的进程杀掉,将释放进程占用zram的空间。只要zram有足够的空间进行匿名页的回收,系统就能正常运行。于是我们根据实际情况,制定了如下策略:在系统进程(system_server)中开启一个新的服务,该服务实时监控zram的使用情况。1、当zram的使用率大于90%,实际上需要杀掉除系统进程以外前台和后台进程。但是此时的前台进程是不能杀掉的,因为用户正在使用。所以此时只能将后台进程杀掉,并记录下此刻的前台进程。2、当系统灭屏后,说明用户已经没有使用终端设备了。如果在1中记录下的前台进程已经到了后台,那么监控服务会直接杀掉该进程;如果在1中记录下的前台进程仍然在前台,监控服务会将特定的安卓桌面(launcher)切换到前台,再将1中记录下的前台进程(由于安卓桌面已经在前台,该进程此时已经不是前台进程)杀掉。(三)测试验证经过大量的自动化压力测试,特定应用能够512m内存的android设备上进行重度使用了。如图2所示,本发明的另一具体实施例为:一种安卓系统内存优化装置,所述安卓系统内存优化装置包括,堆内存参数设置模块,用于设置安卓虚拟机的堆内存参数,所述堆内存参数包括堆分配的初始大小、受控情况下的极限堆大小、不受控情况下的极限堆大小、回收内存最大值及回收内存最小值;zram设置模块,用于将zram的大小设置在150-170m之间;后台进程管理模块,用于开启一个监控服务,对zram的使用率进行监控,当监控到zram的使用率大于预设值时,监控服务将后台进程杀掉,保留前台进程和系统进程,并记录下此刻的前台进程;前台进程管理模块,用于系统灭屏后,监控服务再将记录下的前台进程杀掉。优选地,所述堆内存参数设置模块具体用于,将堆分配的初始值设为8m,受控情况下的极限堆大小设为54m,不受控情况下的极限堆大小设为64m,回收内存最大值设为2m,回收内存最小值设为512k。优选地,所述后台进程管理模块,还用于当监控到zram的使用率大于90%时,监控服务将后台进程杀掉,保留前台进程和系统进程。优选地,所述zram设置模块,还用于将zram的大小设置在160m。本发明的装置实施例包含方法实施例的全部内容,具有与方法实施例相同的技术效果,因此不再对此进行赘述。综上所述,本发明的技术效果在于:设置安卓虚拟机的堆内存参数,使得应用的内存得到限制,保证安卓系统能够在512m的内存上流畅运行,将zram的大小设置在150-170m之间,优选地,将zram的大小设置在160m,使得应用程序能够流畅地运行;通过开启一个监控服务,对zram的大小进行监控,当监控到zram的使用率大于预设值时,监控服务将后台进程杀掉,保留前台进程和系统进程,并记录下此刻的前台进程,使得应用程序能够在512m内存的android设备上进行重度使用;在系统灭屏后,监控服务再将记录下的前台进程杀掉,使得系统耗电量更少;使用512m的内存,能够有效降低硬件成本。此处第一、第二……只代表其名称的区分,不代表它们的重要程度和位置有什么不同。此处,上、下、左、右、前、后只代表其相对位置而不表示其绝对位置。以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的
技术领域
,均同理包括在本发明的专利保护范围内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1