Android内存性能参数分析

free-jdx 2021-04-15 14:30:22 6556
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 官网提供的不同场景原型机配置方案:

(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 官网提供的不同场景原型机配置方案。

(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 官网提供的不同场景原型机配置方案。
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的回收频率,如下表所示:

当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性能参数调优

如图所示, 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]以下,避免频繁被回收造成性能体验过差。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
free-jdx
红包 97 9 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
free-jdx
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区