全网最佳IP代理服务商- 9.9元开通-稳定的代理服务
如果您从事外贸、海外视频博主、海外推广、海外广告投放,欢迎选择我们。
让您轻易使用国外主流的聊天软件、视频网站以及社交网络等等

奈飞ssr节点免费ssr订阅地址

当我们谈论Android应用程序的性能时,内存管理是一个至关重要的方面。当应用的:内存”存在不”合理的使用时,就容”易发生问,题,如OOM、应用存活;率、低、界面卡顿?等,等。优化内存使用可以显著提高。应用的响应,速度、稳定性、和用”户体验。过去一段时间我;们对司机端App的内!存问题做了大量!的治理,在此”分享治理的,过程,希望!能够为其;他团队提供一些经“验和启发。

线、上OOM设备、崩溃率最高为0.8‱,占整体崩溃率的20%,在整体Crash率中占据了大头。

在所有OOM崩溃上报的页面中,首页、车贴拍摄页占据了Top 2。首页作为APP的最重要的页面奈飞ssr节点,频繁崩溃会严重影响;用户体验;车贴拍摄页面作为公司的核心业务流程ssr免费分享节点网站,一旦异:常也会阻塞司机接单,导致频繁上报业务工单。

内存泄露的问题全靠研发自身的代码质量把控,线下没有任何的监控机制。经过多个版本的迭代,内存泄漏问题愈发严重。

通过长时间的内存治理,截止;最新版本,由于:内存溢出导致的;设备崩。溃率从最高。0.8‱降至0.01‱;线%;核心页面、核心?流程O。OM。崩溃率下降!至0。并且在线;下建立!有效的防劣化机制,成功拦截上报了多处的内存泄漏问题带到线上。

在做性能优化和技;术优化前,制定好整体的。策略方向往往会事半功,倍。针对我们Ap!p当前”的问题”现状,制定了以下的;优化。策略:

高、频OOM页面治理:从线上。用户,使:用体感”的角度考虑,高频OOM页、面时最急需解决的,此部分?的ROI最高,因此首先针对这些页面;做专项的治理。

Java内存泄漏治理:单个内存泄漏和大对象占用虽然不会立刻导致OOM,但随着应用的使用时长增。加,泄漏,的增多一样会增加OOM的概率。此部分主要解决Java层的内存泄、漏问题,包括,页面内存泄漏和不合理的大对;象引入。

Native内存泄漏治理:针对Native层导致的O”OM,在我们;项目中次”数较少,而且由于C/C++不像JVM拥有自己的内存管理机制,在内存管;理这块更?为复杂,治理成本较高分享自己收集的ssr订阅地址,此部分ROI较低,因此放在最后处理。

经过上述的治理阶段之后,一般都能取到不错的成果,但治理是长期的,如果没有一套长久有效的。防劣机制,往往很”快就会。打回原形。回过来看我们治理过程中的遇到的一些问题和实?践,我们针对,性的建立”了一?套多个维度的监控防劣机制。

高频问题一般都会有:相同的。特征,针对这类问题我?们处理的思路一般是:寻找共性特征-线下复现验证-定位问题点修复。这里分享一下我们两例高频OOM页面的排查过程。

我们通过抽查?几例首页OO”M;前的离线”日志,发现此类用户都命中了大量的新单推送弹窗展示,因此、推测与这,个弹窗的展示有关。

我们通过Android Studio提供的Profiler工具,可以看到运行”8分钟后(约240条),内存就上涨50MB,并且没有下降的趋势,对比线上”发生OOM的case,订单推送弹窗都是触发了2000+次以上,意味着上涨的内存会更多。基本可以确定线上首页的OOM问题是由这个弹窗大量展示引起。

我们现在已经;确定是订单推送弹?窗导!致的OO?M,但还未确定这个弹窗为什么导致内存上涨了。一样是通过Android Profiler通过dump测”试前后;的内存、快照信息:

查看该弹窗代码发现该Dialog!初始化时注册了Activ;ity的L!ifecycle监听,但未在dimiss时进行反注册,导致展示过的AppInPushNotificationDialog弹窗都没有被释放,又由于首页是常驻的,随着使用时长增加,推送弹窗会一直增!加,内存会?一直上;涨到O!OM。

定?位到问题之:后,修复方案就很简单了,只需一行代“码,在弹窗消失”的时候移,除掉。Lifecycle监听就能解决该问题。

上面首页的问题我们依靠回捞的离线日志明显看出共性特征(大量的推送弹窗展、示),但如果其他ca:se并没有这些明显的业务信;息呢?这种我们就比较难、去排查,原因。

比如这个车贴拍摄的场,景,这是一个通过相机实时识别车辆上车贴情况的业务场景,在此类case的离线日志中并没有拿到一些有用的信息。为了能拿到OOM案发现场时的内存快照信息,我们增加了一个上报策略,配合内存海绵方案(O!OM时清除堆内存大对象统计),在OOM时尝试dump内存快照信息上传到异常平台。

在上报的内存快照文件中,发现byte数组的占比非常。高,达到了总体90%以上。

可以发现byte、数组大部分是由几个录制和图像相关的类创建并持有。可以推测跟相机的图像:录制逻辑有关。

在线下模拟拍摄过程中,虽然没有复现O。OM,但发现在拍摄过程该页面存在频繁的内存抖。动和GC。

以上持有byte数组引用的相关类是拍摄!过程中图像录制所使用,与对应的业务开发沟通发现大部分录制对象没有进,行复用和及时回收,而且识别功能的实;现是1秒回调多帧去进行识别,这样就导致了页面会频、繁创建对。象和GC,从而。引起内”存抖动。

后“续通过对象池复用等优化手段来“减少,录制对象的创建,大大减少了频繁GC,灰度上线验证后发现成功解决了该页面的OOM问题。

依赖,JVM的GC机制,能够将过期对象所占的内存空间释放,减少了内存“占用。既然有!GC。机制了,为什:么还;会泄漏:呢?因为GC!回。收是根据可达性:来判断,对象是否引用的,当GC动作发生时,如果一个对象被gc root对象持有,那么它是无法被回收的。

当一个对象所定义的生命周期结束了,仍有被GC ROOT对象所持有无法释、放,那我们就;认:为这个对象发生内存?泄漏。

在Android中;页面承载了大部分的内容,页面都有自己的生命周期,所以我们可以从这两个角度去排查和治理Java的内存泄漏问题。

工欲、善其事,必先?利其器。我们首先需要有方法去发现这些内存泄漏的问、题(页面泄漏、大对象占用),在Ja;va堆内存监控这一部分,行业上已经有不少成熟的方案和工具,在线上和线下都经过大量的稳;定性验证,读者可以根据自身项目的情况选!择接入使用奈飞ssr节点免费ssr订阅地址

经过调研,前期我们选择线上接入Koom-Java Heap泄漏监控工具进行检测,后期则替换”成部门自?研的内存监控工具(性能更好,采集策!略更合理)。通用的采集策略基本是定时轮询+内存超过阈值时触发采集,作为常规的线上内、存泄漏排查策略什么问题。但为了能更精准的发现OOM时用户内存泄漏的情况,我们选择化主动为被动,新增应用OOM时才进行采集分析上报(配合上文提到的内存海绵方案),这种策略“有以下两:个好处:

采用定时轮询+内存超过阈值时d:ump内存”的方式,会影响到没有内、存问题的用户App性、能,选择,在OOM时才尝试dump能,最小化地影响用户性能。

当内存超过阈值时不一定是有问题,但OOM时去dump发现问题的概率会更。高。

通过上述的各种采集策略回捞数据后,发现了多个业务模块都存在Java内存泄漏、和不合理大对象占用的现象,其中不少还是核心业务模块,触发泄,漏的、频率较高。

使用单?例对!象时,定义为接口;类型的成员变量(很容易隐式持有外部类引用)!在赋值使用后,需要及时!释放引用。

加载大图时,Bitmap使用之后未释放。如静态变量持有了Bitmap引用,在加载完图像之后没有释放引用。

大数组的占用。如Glide的缓存池就:使用了“集合数组进行维护,可以在选择合适的时机进行一定的释放。

不同于JVM的自动垃圾回收机制,C/C++层的对象内存申请和释放都需要开发者自行管理。大多数情“况下,开发者都通过mall,oc和free函数来申请和释放,或者是new和delete关键字,它最终的也是由malloc和free的函。数来实现。更高阶的实现方式,可以直接调用更底层的系统接口,如mmap。

就算我们能保证我们的代码质量不会出现这种错误。但大型的项目中都会引入不少的三方so文件,这一类的代码质量是不可控的,很容易就引入了Native泄漏。为了能把这些泄漏问题都暴露”出来,我们可以使用一些工具去做:监控和排查。

针对C/C++内存分配和方法需要自行管理的特点,从入口和出口来做切入点,大部分工具的原理都是通过hook内存分配和释放的方法函数,去捕;获泄漏”对象。以下是一些行业比较主流的工具:

相比于Java层的OOM,我们项目Nati!ve层的OOM较少,但也是存在一些上报。这一部分我们的思路是:

KOOM Native检测工具利用mark-and-sweep算法去分析整个进程 Native Heap,能够做到自动分析泄漏对”象,这个:特点很适合作:为线上监控能力。因此我们在线上接入了该工具,也发现了项目内多个so都存在不同程度的泄漏现象。

Native的内存问题我“们不能只聚焦在泄漏监控修复这一维度,不合理的内存分配使用也很容易导致OOM。当我们把线上发。现的泄漏都修复后,发现还有零星的Native OOM上报。通过分析排查这些场景虽然不存在内存泄漏,但存在不合理的内存申请。

比如有个case是在发送图片之后就容易报Native层的OOM,经过线下模拟场景发现在发送图”片前后Native内存会发生突刺。

通过dump突刺的“内存信息,发现突刺的”原因是加载了一个大Bit!map,由于Android 8.0以后Bitmap得内存分配移到了Native heap,推测应该是大图,直接加载导致。

经“过代码”排查发现此部分存在,对图片作旋转的操作,直接加载了原图转化为Bitmap去执行,因此如果图片比较大就很容易造成内存突刺。

经过一系列的治理手段,线上的OOM次数和App的平均内存占用已经有了大幅度的下降。但如果没有制定一套完善的防“劣化监;控机制,随着时间的推移内存问题很容易就会继续恶化。

在QA侧会对每个版本的安装!包做基础的性能测试评估,但测试场景较少,检查项比!较单一,检测时长,较短,很难发现,内存问题。

线上A”pm“内存已:经有相!关的监控,可以覆盖“常”见的Java内存“泄漏和大对象。但为?了防止影“响App性能,触发采集的策略条、件较多,无法覆盖较多的,场景;而且纯依“赖线上Apm的监控免费ssr订阅地址,问题已经带到线上影响了用户,问题发现比较滞后;并且各业“务线由,于Native层、线程泄”漏较少,线上APM实现N“ativ“e层泄漏监控功能的!RO;I不高,因此也缺乏Na!tiv”e层相关的监控。

回顾我们在治理过程遇到的问题、场景和使用到的工具,我们做了一些整合和补!充,建立了一套线下的内存监控!体系:

秉着不。重复造轮子的前提,Ja、va内,存、Native内。存、线程泄漏行业上都有比较成熟的方案和原理讲解,直接集成使用排查过程中使用到的工具,此部分不再详述。

这一部分主要是为了监:控某;些页面频繁GC的问题。可以利”用JVMTI(ART TI)“ 提供的能力实现,JVMTI具有以下能力:

通过VMObjectAlloc与ObjectFree监听对象分配,收集内存抖动期间分配的对。象信息(类名路径、对象大小)。

这部分监控则是为了监控使用时长较长的一些页面(比如首页)内存持续上涨的问题。基本的实现思路是定时采集页面中,内存的数据作为样本,然后去验证这组样本数据是否呈上涨趋势。通常我们要验证;一组数据是否呈上涨趋势,可以采用**斜率法**的方式去进行判断计算。

当发现内?存问题时,应用会通。过吐司的“形式!告知研:发问题;类型,增加、研发感知,并通。过本地l”og输出详。细的排查信息,帮助?研发快速的修复内存问题。

为了避免“漏网之鱼,除了本”地的提醒告知之外,还会结合实时日志和自研的异常上报平台,自动统计上报内存问题。利用平台把问题?分配到对应的研发”修复,实现问题的闭环。

在治理。过程中,我们;也发现了不少内存?问题是“二方、三分。库引入的。SDK的引入和“变“更,目前内存这块是处于0卡口状态,只能依靠S;DK研发本身的;自测,而自测过程中更多关注的可能是Crash、Anr这种体感比较明显的问题,内存问;题比:较少去关:注。因此我们打通了MTC(自动化测试平台)的性能、报告,增加了一项SDK的内存问题报告,作为SDK变更”的准入卡口。后续在试验稳定之后,会补充到版本的性能报;告奈飞ssr节点,为QA侧提供更多维度的内存性能检测项。

通过以:上的防劣化机制,在平时开发和测试版本回。归阶段,我们监控收集到了很多新增的、线上未捕捉到、的内存问题,并通过本地提醒和异常平台上报告警的能力分配到各个业务!开发进行修复,成功避免了问题带到线上。

过去半?年,我们对历史的内存问题做了一次比较长时间的专项治理,也取得“了不错的成”果。在此;我们总结出以下经验:

专项治理前!可以“先制定。好总体的策略和方向,从用户体感、投入成本的角度去决定治理的优先级,循序渐进进行治理。

避免重复造、轮子。很多内存问题目前”已经有很多成熟的通用方案和工具,选择适合的即可,我们应该把!更多的精力”放到问题排查上。

长;治才能久、安。线上的问题、排查是很费时的,我们应该尽可能把问题在线下就暴露出来。因此做好防劣化的建设十分有必要。

目前Java层的OOM已趋于稳定,但Native层还有少部分的余量上报,后面会继,续更深入地进行研究和治理。

结合MTC自动化测试平台实现更多内存。相关的检测项能力,增加版本回归中性能报告的检测维度,减少人工自测的成本。

THE END
喜欢就支持一下吧
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称