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-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建
联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务
公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?