Android内存性能参数分析

1. Android 内存参数

Android系统内存性能分析, 可以分为系统级内存性能分析和应用级别内存性能分析。系统层面的内存性能分析主要从Android Dalvik配置、GC策略、LMK策略三点展开。 Android 应用级别内存性能分析方法主要遵循google官方推荐的高性能应用编程注意事项。

2.Android Dalvik参数

Dalvik虚拟机参数主要是用于Zygote初始化阶段用于初始化Dalivk heap的参数,参数的设定主要遵循“以时间换空间” 和 “以空间换时间”两种策略之间的权衡。

(1)startSize

参数含义: Dalvik虚拟机堆起始大小,同时也是DVM heap中Active heap的起始大小。

参数作用: heapstartsize设定越大,应用启动越快,但系统内存消耗越快;反之heapstartsize设定越小,应用启动越慢,但系统可用内存越多。

性能分析: heapstartsize缺省值4MB,可以通过系统属性值dalvik.vm.heapstartsize对其进行修改。 Heapstartsize越大,对应用启动阶段速度越快,同时消耗内存也会上升; Heapstartsize越小,对应用启动阶段速度较慢,对节省系统可用内存有利。 可参考设置如下,参数指标准要参考google 官网提供的不同场景原型机配置方案: Android内存性能参数分析

(2)growthLimit

参数含义: Dalvik虚拟机堆动态增长的最大“软上限”值,growthLimit可用来限制应用实际最大可用内存,取值范围必须要小于等于最大值heapsize。

参数作用: AndroidManifest.xml的application标签中largeHeap属性值为false时,堆的最大尺寸为growthLimit.growthLimit用来限制DVM Heap 中Active heap增长上限。

性能分析: growthLimit默认值为0 ,可以通过系统属性值dalvik.vm.heapgrowthlimit对其进行修改。 growthLimit越大,应用运行过程中越稳定,加载游戏和多媒体视频播放时越流畅性较为稳定;对于android市场中很多会启动多个Activity的应用更有利,代价是内存消耗过多,GC的触发更为频繁。 growthLimit越小,启动多个Activity的应用运行加载某个Activity过程中加载到上限而被out-of-memory 杀掉的几率越高,一旦被杀,应用的后台服务又会重启被杀的Activity,同时触发大量的GC回收内存,导致应用运行过程中较为卡顿,性能体验不佳,优点是对内存使用较为节省。 可参考设置如下,参数指标准要参考google 官网提供的不同场景原型机配置方案。

Android内存性能参数分析

(3)0maximumSize 参数含义: Dalvik虚拟机堆大小的最大值。 参数作用: AndroidManifest.xml的application标签中largeHeap属性值为true时,堆的最大尺寸为maximumSize。 Zygote 进程初始化Davlik heap阶段,会依赖于maximumSize大小从ashmem_create_region函数中创建堆的匿名共享内存。 性能分析: maximumSize默认值为16m ,可以通过系统属性值dalvik.vm.heapsize对其进行修改。Android系统是多进程系统,maximumSize的大小决定了系统当前最多可运行多少个虚拟机。 maximumSize越大,对启动多个Activity的应用运行越稳定,但消耗很多内存。在应用之间切换的过程中产生很多耗时,耗时主要GC和内核的内存回收策略去进行内存回收。 maximumSize越小,对使用largeHeap的应用存在规格限制,使用largeHeap较多的应用将无法稳定运行,一旦heap达到了上限,将会被out-of-memory杀掉;优点是对内存消耗更小,对内存碎片化越有利。可参考设置如下,参数指标准要参考google 官网提供的不同场景原型机配置方案。 Android内存性能参数分析 3.Android GC参数

Android Dalvik虚拟机使用Mark-Sweep算法来进行内存回收管理。 Dalvik虚拟机会启动GC线程执行和响应的GC的请求。 Dvm heap中Active heap主要为Activity 创建object和加载Bitmap图片资源文件提供内存,GC 线程主要对Active heap进行扫描和内存回收操作。

(1) GC 触发条件

当Active heap已分配内存大小超过预设Concurrent GC阀值时,线程被唤醒执行Concurrent GC; 当Active heap中分配内存失败时,会唤醒GC线程执行GC_FOR_ALLOC内存回收; 当GC线程睡眠5000毫秒后,主动对Active heap进行大小调整,释放一部分没用的内存; 应用显示调用GC 进行内存回收。

(2)GC性能影响

Dalvik GC线程对Active heap执行Mark扫描和内存回收过程中,会对heap进行上锁和解锁的操作,这会导致所有在heap上创建object的Java线程被suspend挂起。GC过程越长或者GC触发的越频繁,会导致应用性能下降,直观上造成前台Activity的卡顿。

(3)系统级GC参数调优

Dvm heap参数中有三个参数对GC的回收频率,如下表所示:

Android内存性能参数分析

Android内存性能参数分析

当Target 超过次区间后,GC会选择 [heap->bytesAllocated + heapmaxfree]作为heap当前可以使用的最大内存,同时减去固定大小[200K ~ 500K] 作为GC_CONCURRENT触发阈值。 由Concurrent GC触发的逻辑公式中可以得到三个因素对GC的影响关联如下: heaptargetutilization、heapmaxfree 和 heapminfree越小,Concurrent GC触发越频繁; heaptargetutilization、heapmaxfree 和 heapminfree越大,Concurrent GC触发频率越低,但一次GC过程时间会越长,对整个系统尤其是前台应用较为卡顿。因此调优的权衡在于既让GC触发频率降低,又要避免GC一次触发耗时过长。

(4)应用级别GC调优

应用内存使用不当,将直接引发GC对其造成非常差的性能体检,例如应用在代码for循环中集中性的申请heap和加载未进过优化的图片等等,google针对GC的负面影响,专门针对应用开发者提供了指导手册,例如如何编写高性能应用等,在后面充分研究GC机制和Java编程后再做补充。

4. Android LMK参数 (1)LowmemoryKiller策略引入

Andorid 启动加载一个应用,会经历Zygote fork、预加载odex可执行文件和加载图片等资源文件,这个过程会产生一系列的系统调用、缺页中断和IO消耗,造成一定的耗时。因此Android采用了一种策略,当应用Activity退出后,AMS将应用进程放在后台挂起,只释放一部分进程资源。当应用再次被启动的时候,后台进程会快速切换到前台,极大的增加了客户体验。 当后台存放了太多的进程,消耗了系统大量内存。一旦系统内存消耗殆尽,linux内核会触发OOM紧急内存回收,OOM会选择用户空间内存占据最多的进程进行kill,以此挽救系统。但OOM机制无法对用户空间进程的重要级别进行判断,一旦kill掉Android系统进程,将会导致系统重启。 由此Android 引入LowmemoryKiller策略,根据系统当前的内存使用状况,调整后台进程数量。在linux 内存回收过程中,按照重要级别逐一回收后台进程。

(2)LowmemoryKiller策略 (3)LowmemoryKiller性能参数调优

Android内存性能参数分析

如图所示, Lowmemorykiller minfree阈值和adj等级的设定主要取决于系统内存大小、系统后台应用数量、系统cache和内核zone watermark水位线共同去权衡。可遵循以下规则进行配置:

1). 系统cache曲线 Cache 是Lowmemorykiller 判断因素之一,minfree的选取首先考虑系统cache驻留量,如果minfree阈值分布集中在cache驻留变化曲线最低点以下,linux 内存回收将频繁触发,kswap负载上升,系统内存申请非常耗时。等级较低的adj对应的Minfree需要在cache上升曲线上发散分布,等级较高的adj对应的minfree需要在cache理论最低点以下。

2). 系统内存水位线区间 高等级adj对应的minfree不能低于watermark[min] 水位线。 较低等级adj对应的minfree需要分布在 watermark[low]以上,分布点间距呈渐疏型,避免过于集中的被回收,造成系统和前台应用的卡顿。 中等等级adj对应的minfree需要分布在watermark[low]以下,避免频繁被回收造成性能体验过差。

免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:Android内存性能参数分析 https://www.yhzz.com.cn/a/12635.html

上一篇 2023-05-09
下一篇 2023-05-09

相关推荐

联系云恒

在线留言: 我要留言
客服热线:400-600-0310
工作时间:周一至周六,08:30-17:30,节假日休息。