1.问题的背景

 

 对于安卓应用来说,内存一直是一个重要的性能指标。过多的内存占用会影响应用程序的流畅性,甚至导致OOM,这将极大地影响用户体验。因此,内存优化一直是行业中一项重要而又困难的工作。

 

 q很久以前就开发了许多内存优化技术:

 

 1)自主开发的内存泄漏检测系统泄漏检测器天网:

 LeakInspector是一个完整的内存泄漏检测系统:它可以自动检测应用程序的内存泄漏问题;并提供底部回收和自动提货单功能;

 2)图片引用大图像报警:

 可以自动检测服务图片的不合理使用:例如,解码图片的大小是显示大小的两倍以上。促进业务的特殊优化;

 3)内存触摸顶部监控:

 它可以在内存不足时检测内存占用高的业务场景,并定位相应的页面以促进业务优化。

 

 这些技术取得了很好的内存优化效果,但它们的特点是:主要针对明显的内存问题,缺乏深入的内存分析。

 

 因此,手Q记忆的问题一直存在,主要表现在以下两个方面:

 

 1)手q的平均记忆一直在持续增长,并且在不同版本之间有很大的增长。Hand Q是1月份的一个版本,平均每个版本增加约530万;

 2)用户的OOM率约为0.1%。

 

 这一次,我们从监控和清洁的角度系统地优化了手Q记忆:

 

 1)统一的缓存监控:开发并实现一个全面的内存缓存监控系统,能够更加细致地监控内存缓存的使用情况,及时发现轻微的不合理问题,促进优化;

 2)内存清理在监控的基础上,开发并实现了一种自动清理机制:一方面,统一调度Q主动清理内存,另一方面,通过深入的技术研究,实现了系统内存清理技术。

 

 通过监控和清洗的配合,最终实现了优化手Q整体记忆和降低OOM率的效果。下面是一个详细的计划。

 2.相关文章

 

 腾讯技术共享:安卓手q线程死锁监控系统的技术实践

 “微信团队原创分享:iOS版微信内存监控系统技术实践”

 “微信团队原创分享:安卓内存泄漏监控和优化技巧总结”

 QQ音乐团队分享:安卓图像压缩技术详解(上)

 QQ音乐团队分享:安卓图像压缩技术详解(下)

 “安卓版微信安装包”瘦身“实战记录”

 “iOS版微信安装包”瘦身“实战记录”

 微信客户团队负责人技术访谈:如何启动客户绩效监控和优化

 3.统一缓存监控

 

 统一缓存监控主要包括两部分:图片缓存监控和业务对象缓存监控:

 

 1)图片缓存监控主要关注位图的引用和图片的定位问题;

 2)业务对象缓存监控,主要监控所有业务对象的缓存,及时发现缓存问题。

 

 3.1图片缓存监控

 

 对于安卓应用程序,位图总是占据大量内存。手里平均有300多个位图对象..

 

 统计显示,位图参考内存约占内存总量的40%;

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 为了减少图片占用的内存,有必要规范图片缓存的使用。在早期阶段,我们封装并实现了QQLruChe,一种专门的多级图片缓存,并要求所有企业使用全球图片专用缓存。一方面,可以方便的调整和控制图片缓存服务;另一方面,它可以通过消除和清理策略有效地控制图片缓存的大小。然而,由于有大量的Q服务,这些服务独立打开图片缓存的情况时有发生。为此,我们开发了一套图片缓存监控系统,能够及时发现隐藏图片的问题,并监控图片的其他不合理使用。

 

 图像缓存监控采用内存快照技术实现,分为两部分:终端数据采集和后台数据分析。

 

 过程如下:

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 终端数据采集:客户端实时检测当前可用内存,当可用内存不足时,自动生成内存快照文件并报告给后台。

 

 后台数据分析:后台实现了一套Hprof文件分析和位图引用合并技术,批量分析内存快照文件,输出位图引用链和分类统计,过滤全局图片专用缓存和视图层引用,分析隐藏图片缓存的业务。

 

 在实现图像缓存监控的过程中,我们主要遇到以下困难:

 

 1)内存快照文件很大,大约300兆:

 内存文件过多会导致上传流量和存储成本更高,并且上传需要很长时间。为了解决这个问题,一方面,我们对大规模用户进行采样和报告,提供良好的用户交互。另一方面,我们深入分析了内存快照收集的原理,开发了miniDump工具,通过本机钩子技术在生成内存快照时消除了tyte[]数据,从而将文件大小减少了70%;

 2)手动分析内存快照文件的成本很高;

 通过MAT对内存快照文件进行手动分析既费时又费力,而且分析的次数有限,因此用户报告的内存文件很多,无法找到最重要的问题。为了解决这个问题,我们深入研究了MAT插件技术、自主开发的引用链分析和位图引用合并工具,自动分析内存快照文件,并对位图图像引用进行分类。

 

 通过图像监控系统,我们可以有效地检测到以下业务问题:

 

 1)全局图片专用缓存占用空间大,具有优化空间:

 位图引用链合并发现全局图片专用缓存占了很高的比例。同时,我们还统计了OOM用户全局图片缓存的内存量,平均约为1000万。因此,当内存不足时,需要自动trimToSize来释放内存空间。

 2)业务缺陷——逻辑完成后,图片引用没有及时发布:

 业务逻辑存在问题,例如,有几种类型的业务在页面退出后无法及时发布背景地图资源引用;

 3)企业私自打开图片缓存:

 该服务独立打开缓存缓存位图,并且不使用全局图片专用缓存;

 4)业务缓存数据对象中的参考图片:

 业务内存缓存中的数据对象包含位图成员,这有很大的内存空间。可以优化缓存键,位图对象存储在全局图片专用缓存中;

 5)图片静态参考:

 定义静态位图或可绘制对象。在流程周期中,对象引用的资源不能被释放。

 

 在Q730版本中,图片缓存监控系统检测到32个业务问题和26张提货单,节省了大约23M的内存。

 

 3.2业务对象缓存监控

 

 业务对象缓存监控主要是通过实现定制的集合类,将每个业务内存缓存的使用情况实时报告给后台。在后台进行分析和合并,以定位服务缓存问题。

 

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 如上图所示,业务对象缓存主要分为三个部分:终端数据收集、后台数据分析和缓存清理:

 

 终端数据采集:自定义实现QQHashMap、QQConCurrentHashMap、QQLruCache等集合类,并在系统原有集合类的基础上实现包统计功能,实时统计程序运行过程中各缓存的内存索引:插入次数、查询次数、删除次数、遍历次数、命中次数、未命中次数、缓存利用率、内存占用等。

 后台分析:分析终端上报的用户数据,对每个业务缓存进行分类统计,统计平均内存占用、最大内存占用、中值内存占用、缓存命中率、缓存浪费率等指标;

 内存清洗:在监控的基础上,监控系统还增加了清洗界面。当检测到当前可用堆内存低并且用户处于高内存负载状态时,将统一调度清理逻辑以优化内存自清理。

  

 通过统一的缓存监控,我们发现了许多业务缓存问题,这些问题可以分为以下三类。

 

 1)高速缓存浪费率高:

 

 典型情况1:某类缓存的手Q表达式,平均浪费率超过88%,相当于缓存1000个对象,800+未被使用;

 典型情况2:红包模板缓存在存储后从不被访问,浪费率为100%。

 

 为了解决这些问题,我们敦促企业优化内存缓存结构,删除无用的缓存,并优化缓存方案以降低浪费率。

 

 2)大量缓存内存占用:

 

 典型案例1:手问新闻图片缓存,私人缓存位图,占用内存高达15M,占所有图片缓存的35%;

 典型情况2:钱包背景图像缓存,占用约1M内存,使用后未及时释放。

 

 针对这种问题,对于图片缓存服务,提升服务访问全局图片专用缓存;对于非图片服务,访问自动清理以及时释放内存空间。

 

 3)缓存结构有优化的空间:

 

 典型案例1:讨论组成员缓存,它被设计为LRUCache过时缓存,但用户从未完全使用过它。初始打开空间太大;

 典型情况2:未读消息缓存,极端用户缓存的数量超过9000,并且没有上限控制。

 

 为了解决这些问题,我们应该促进业务更新或优化缓存结构,并增加上限控制。

 4.内存清理

 

 统一监控,可以有效发现业务缓存问题,进行特殊优化。但是,监控有一定的滞后性,所以在监控的基础上,我们还增加了内存清理控制模块。

 

 内存清理主要分为业务内存清理和系统内存清理。业务内存清理包括统一图片缓存清理和业务缓存对象清理。这里已经简要介绍了这一点。接下来,我们将介绍下两种与系统相关的内存清理技术:系统类加载程序内存清理和系统预载图片清理。

 

 4.1系统类加载程序的内存清理

 

 在早期阶段,我们分析了许多内存快照,发现了一个常见的问题:内存快照中有一个ZipFile对象,它占用了超过26M的内存。系统类类装入器引用了zipFile。

 

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 通过分析系统源代码,我们发现ZipFile记录了安装包的所有类文件信息,在Q安装包中有超过15,000个文件。文件越多,zipFile占用的内存就越大。

 

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 我们进一步分析了ClassLoader的相关源代码,发现只有当调用ClassLoader的findResource方法来查找安装包中的资源(如图片)时,才会使用ZipFile的内容,而不会发现其他使用场景。同时,通过查找资源查找资源也有一些缺点:需要很长时间,不推荐在安卓系统上使用。

 

 有关详细分析,请参考:

 http://blog . nimbled roid . com/2016/04/06/slow-ClassLoader . GetResourceAsStream-zh . html

 

 综合评估表明,类加载器引用的内存可以被清除。

 

 清洁主要面临以下困难:

 

 1)安卓系统严重碎片化,兼容性问题更加突出:

 zipFIle成员变量的位置和变量名在不同的版本中是不同的。ZipFile初始化时间发生变化:当它在4.3之前被创建时,它将被初始化,并且它将在4.3之后第一次被初始化。各种制造商对系统应用编程接口的内部修改是不可预料的;

 2)强制清洗可能导致功能异常:

 系统的内部代码逻辑可能会受到影响,并且影响是不可预测的。Hand q当前使用ClassLoader查找资源的业务功能将受到影响。后期的新业务不可预料,清理会导致系统功能的失效;

 3)清洗后重新加载zipFile需要很长时间,这可能会导致堵塞。

 

 下图是我们清理系统类加载器的实现方案,通过代理、缓存、报告等方式逐一克服了上述困难。,很好地实现了清理系统类加载器内存的效果。

 

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 1)针对兼容性问题,我们通过反射代理用HookZipFile替换了系统的ZipFile,并在替换后清理了ZipFile内存。替换机制与系统的不同版本和特殊型号兼容,并且不影响系统逻辑。

 

 2)针对清洗造成的功能异常,我们实现了覆盖底部的功能,下次访问时会重新创建zipFile。

 

 3)为了解决耗时的问题,内部封装实现了缓存功能。此外,为业务访问增加了堆栈报告,以促进业务使用其他方式及时获取资源。

 

 内存清理方案已通过内部兼容性测试,外部网络在发布后没有崩溃问题。通过连续迭代,兼容率达到100%。内存清理效果明显,平均内存清理量约为2.6M

 

 4.2系统预载图片清洗

 

 系统预加载的图片缓存是一个通用的图片资源,在初始化zygote进程时通过预加载资源()预加载,后续的安卓应用进程都来自Zygote分支,所以它继承了这个预加载的图片资源。因为它是静态的强引用,这部分图片资源总是会占用内存空间。

 

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 预加载的优点是系统只在合子中执行一次加载操作,所有的应用程序都不用重新加载就可以使用这个资源,从而减少了资源加载的时间消耗。同时,sPreloadedDrawables是一个静态对象,它总是引用图片缓存,所以这种系统机制将占用很高的内存,在一些系统上,内存占用超过20M。

 

 因此,内存优化还有空间。当内存占用率较高时,可以主动清理这部分内存,从而释放大量堆内存空间,降低内存耗尽的风险。通过分析可绘制加载机制的源代码,我们知道如果在sPreloadedDrawables中找不到预加载的资源,它们将被解码并再次加载,而不会影响现有的功能。

 

 因此,清洗后的风险是可控的,主要困难是兼容性:

 

 1)系统应用编程接口有许多变化:

 数据结构类型、对象存储位置和不同的应用编程接口版本已经改变。

 2)制造商进行了许多定制修改:

 例如,小米7.0系统和华为的一些型号都扩展了资源导入模块的实现,并定制了自己的资源加载基类,这使得定位sPreloadDrawable变得不可能;;对于一些OPPO模型,修改了sPreloadDrawable类的属性。

 

 下图是我们清除系统预载图片缓存的实现方案。通过反射替换,系统的预加载图片缓存被截取并替换为自定义图片缓存,图片加载由内部管理。当内存不足时,会及时清除预加载的图片缓存。

 

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 为了解决兼容性问题,我们实施了一个完整的兼容性方案:

 

 1)更换前的兼容性检测;

 2)系统版本兼容性处理;

 3)特定模型的兼容处理;

 4)故障报告统计持续兼容。

 

 该系统预装了图像清理,通过连续迭代,它可以兼容几乎所有的模型。版本发布后,没有出现系统功能异常和外部网络崩溃问题。内存清理量相当大:平均大约15M,最大25M。

 5.优化后的效果

 

 5.1横向比较

 

 在灰色阶段,我们用ABTest测试用户,其中一半访问内存优化逻辑,而另一半没有。据市场报道的统计数据显示,优化用户的OOM率明显低于非优化用户,OOM率从0.09%下降到0.053%。

 

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 在内存分配方面,内存优化显著降低了高内存用户的比例。从3.05%到1.7%。高内存用户是指当前可用内存少于20%的用户,属于高OOM用户组。降低这些用户的比例可以有效降低OOM率。

 

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 5.2纵向比较

 

 我们从版本7.3.0访问了内存优化。从版本的迭代来看,优化效果显著:OOM率从0.09%左右下降到0.047%左右,下降了47%;

 腾讯技术共享:安卓手机的缓存监控与优化实践

 

 Q版本的平均内存增长率明显放缓,版本增长率从约580万降至约114万:

 腾讯技术共享:安卓手机的缓存监控与优化实践

 附录:微信和QQ上更多文章摘要

 

 [1]QQ和微信团队的原创技术文章:

 腾讯技术共享:安卓手机QQ的缓存监控与优化实践

 “微信团队共享:微信面向iOS的高性能通用关键价值组件技术实践”

 “微信团队共享:iOS版本的微信如何防止由特殊人物引起的群体爆炸和应用崩溃?》

 让互联网更快:分享腾讯新一代QUIC协议的技术实践

 “iOS后台唤醒战斗:微信收集和到达语音提醒技术总结”

 腾讯技术共享:社交网络图片带宽压缩技术的演进

 “微信团队共享:视频图像超分辨率技术原理及应用场景”

 “微信团队共享:微信每日实时音频和视频聊天背后的技术解密”

 腾讯团队分享:手机QQ人脸识别酷酷动画效果详解

 “腾讯团队分享:分享在手q聊天界面图片中显示的bug追踪过程”

 “微信团队共享:微信安卓版小视频编码填补的那些空白”

 “优化微信手机本地数据全文检索之路”

 企业微信客户端组织结构数据同步更新方案的优化

 “微信团队透露:微信界面卡死了超级臭虫”15。。。。“的来龙去脉”

 QQ 18年:解密8亿个月前的QQ后台服务接口隔离技术

 "每月活动8.89亿次的超级即时通讯微信如何进行安卓兼容性测试?"

 以手机QQ为例谈手机即时通讯中的“轻量级应用”

 “一篇文章得到微信开源手机数据库组件WCDB的一切!》

 微信客户团队负责人技术访谈:如何启动客户绩效监控和优化

 微信后台基于时序的海量数据冷热分层架构设计实践

 “微信团队原创共享:安卓版微信的臃肿困难和模块化实践之路”

 微信后台团队:微信后台异步消息队列的优化升级实践共享

 “微信团队原创分享:微信客户端SQLite数据库损坏修复练习”

 腾讯原创分享(一):如何在移动网络下大幅提高手机QQ的图片传输速度和成功率

 腾讯原创分享(2):如何在移动网络下大幅降低应用的流量消耗(下)

 腾讯原创分享(2):如何大幅降低移动网络下应用的流量消耗(上)

 “微信火星:微信内部使用的网络层封装库即将开源”

 “正如承诺的那样:微信使用的移动即时通讯网络层跨平台组件库——火星已经正式开通”

 “开源图书馆:后台框架的基石,支持微信8亿用户在一台机器上拥有数百万的连接(源代码下载)”

 微信新一代通信安全解决方案:基于顶级域名1.3的彩信顶级域名详解

 “微信团队原创分享:安卓版微信背景保活战斗分享(流程保活文章)”

 “微信团队原创分享:安卓版微信背景保活战斗分享(网络保活文章)”

 “安卓版微信技术从300千字节进化到300千字节(PPT讲座)[附件下载]”

 “微信团队原创分享:安卓版微信技术从300千字节进化到300千字节”

 "微信技术总监谈建筑:微信之路——走向简(演讲全文)"

 “微信技术总监谈建筑:微信之路——走向简(PPT讲座)[附件下载]”

 如何解读《微信技术总监谈建筑:微信之路——通向简》

 微信大用户后台系统存储架构(视频+PPT)[附件下载]

 “微信异步转型实践:8亿月度活动和单机连接背后的后台解决方案”

 "微信朋友圈海量技术PPT[附件下载]"

 微信对网络影响的技术实验与分析(论文全文)

 《微信后端技术架构概要》

 “架构方式:3名程序员在微信朋友圈(有视频)中平均每天发布10亿条消息。”

 “快速裂变:见证微信强大后台架构从0到1的演变(一)”

 “快速裂变:见证微信强大后台架构从0到1 (2)的演变”

 “微信版本升级iOS9遇到的各种“坑”的综合总结”

 “微信团队原创资源混淆工具:让你的APK领先100万”

 "微信团队原创安卓资源混淆工具:安卓卫士[带源代码]"

 “移动即时通讯实践:iOS微信界面点击监控方案”

 微信“红包照片”背后的技术问题

 “移动即时通讯实践:iOS版微信小视频功能技术解决方案记录”

 "移动即时通讯实践:如何大幅提升微信对安卓的互动性能(上)"

 "移动即时通讯实践:如何大幅提升微信对安卓的互动性能(二)"

 “移动即时通讯实践:安卓版微信智能心跳机制的实现”

 “移动即时通讯实践:WhatsApp、Line和微信心跳策略分析”

 移动即时通讯实践:谷歌信息推送服务研究(微信)

 “移动即时通讯实践:微信iOS版多设备字体适配方案探讨”

 “原创鸽子队:在iOS10上穿越信息推送(APNS)的陷阱”

 腾讯鸽子技术分享:数百亿条实时消息推送的实践经验

 > >更多类似的文章...

 

 [2]关于QQ和微信的技术故事:

 “技术过去:微信估值已经超过5000亿,雷军有机会收集张小龙和他的Foxmail。”

 QQ和微信的迅猛发展背后:腾讯网络基础设施的这些年

 八卦即时通讯:腾讯成长历史的本质是一部QQ成长历史

 “2017微信数据报告:9亿每日活跃用户和380亿每日信息”

 腾讯在开发微信上花了多少钱?技术难度真的这么大吗?困难在哪里?》

 《科技的过去:创业初期的腾讯——16年前的冬天谁动了马的代码》

 技术的过去:历史上最完整的QQ图标改变过程,追求即时通讯巨人的进化历史

 技术的过去:“QQ群”和“微信红包”是怎么来的?》

 “发展过去:深入讲述2010年至2015年,微信风雨背后”

 “发展过去:微信数千年不变的闪屏图片的起源”

 “发展过去:记录微信3.0版本背后的故事(微信1.0发布后9个月)”

 “微信实习生自我报告:我眼中的微信开发团队”

 第一个秘密:QQ实时视频聊天背后的神秘组织

 > >更多类似的文章...


----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯IM融云世界

IM即时通讯钉钉技术:企业IM钉钉在后端架构上的优越之处

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

企业IM即时通讯聊天办公APP钉钉技术分析交流

哇谷云-怎么样正确认识海外云服务器

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?