Android 客户端启动速度优化之「垃圾回收」

  • 时间:
  • 浏览:0
  • 来源:大发5分PK10APP下载_大发5分PK10APP官网

前言

这里都要注意的是,在热点函数里使用你这个框架提供的 pre_hookpost_hook 的性能开销非常大。

{

《支付宝客户端架构解析》系列将从支付宝客户端的派发方案入手,细分拆解客户端在“容器化框架设计”、“网络优化”、“性能启动优化”、“自动化日志派发”、“RPC 组件设计”、“移动应用监控、诊断、定位”等具体实现,带领亲戚亲戚让我们歌词 歌词 歌词 歌词 进一步了解支付宝在客户端架构上的迭代与优化历程。

GC 抑制的前提是 Dalvik 比较熟悉,知道怎么才能 才能 改变 GC 的行为,防止方案大致如下:首先在源码级别找到抑制GC的修改法律方法,相似改变跳转分支,其次,在二进制代码里找到 A 分支条件跳转的"指令指纹",以及用于改变分支的二进制代码,假设为 override_A,应用启动后扫描内存中的 libdvm.so,根据"指令指纹"定位到修改位置,怎么才能 让用 override_A 覆盖,这里都要注意的是,"指令指纹"的定义都要有很多很多编译器和 arm 指令集知识,实现 GC 抑制主要实现了以下 4 个次要:

本文里的设计只会用到一次 pre_hook,很多很多很多很多不指在性能那些的问提。

看得人的这里读者可能性会问,你这个通过“指令指纹”的法律方法靠谱么?我的答案是,漏判不影响正确性,误判理论上指在但概率极小(误判指“指令指纹”定位到错误代码位置)。即使误判指在了,亲戚亲戚让我们歌词 歌词 歌词 歌词 还有最后一层保障——基础架构组同学实现的容灾机制。当误判原应 应用程序池池异常无法完成正常启动时,重启支付宝怎么才能 让在后续的启动中直接放弃 GC 抑制。

* garbage collector.

x怎么才能 才能 改进 Dalvik,缩短启动时间

基于以上两点,提出了三种设想:启动时 GC 抑制,允许堆老会 增长,直到开发人员主动停止 GC 抑制可能性 OOM 停止 GC 抑制,这是三种"空间换时间"策略,用更多的内存消耗来换取启动时间的缩短,你这个策略可行一有一个多多多前提:一是设备厂商那么加密内存中的 Dalvik 库文件,二是设备厂商那么改动 Google 的 Dalvik 源码(可能性大量的改动),理论上通过白名单的法律方法还都还可不能能覆盖所有设备,怎么才能 让实现和维护成本都非常高。

if (heap->bytesAllocated + n > hs->softLimit) {

第一有一个多多那些的问提答案是肯定的,Android 系统的设计思路是每个 Android 应用应用程序池池与否独立的 Dalvik 实例,应用启动还都还可不能能并能修改个人的应用程序池池空间里的代码和数据,怎么才能 让支付宝通过修改内存中的 Dalvik 库文件 libdvm.so 影响 Dalvik 的行为。

76172: e057 b.n 76224 <_Z18dvmHeapSourceAllocj+0xd0>

3. 收回GC例程函数

1. 收回 softlimit 检测:

收回 GC 应用程序池的唤醒

* if the heap is full.

收回 softlimit 检测

/

void* dvmHeapSourceAlloc(size_t n)

dvmSignalCond(&gHs->gcThreadCond);

4. OOM 停止GC抑制的实现

实现同样采用传统的钩子技术。在钩子函数 dvmCollectGarbageInternal 里:



OOM 停止 GC 抑制的实现

*/

76226: e8bd 83f8 ldmia.w sp!, {r3, r4, r5, r6, r7, r8, r9, pc}

收回 GC 例程函数采用钩子技术来实现,亲戚亲戚让我们歌词 歌词 歌词 歌词 将 GC 抑制封装成了一有一个多多 native 接口 doStartSuppressGCdoStopSuppressGC;怎么才能 让进一步封装为 JNI 接口,便于开发者在 Java 里调用。一般的应用法律方法是,开发者通过日志看得人支付宝在某个场景会触发大量的 GC 且你这个 GC 影响用户体验(响应时间慢可能性动画卡顿),怎么才能 让在你这个场景前后插入 doStartSuppressGCdoStopSuppressGC

/*

return NULL;

x条件满足时,收回钩子且执行那么 的 dvmCollectGarbageInternal

GC 抑制的实现

if (heap->bytesAllocated > heap->concurrentStartBytes) {

背景

第有一个那些的问提的难点在于投入产出比:修改应用程序池池空间的代码和数据是面向二进制,难度远远大于源代码,也可是我说稍微繁复的 Dalvik 改进工作是可能性性的。

...

可能性仅仅考虑在支付宝启动过程中抑制 GC,不都要考虑 OOM 停止 GC 抑制的实现,可能性支付宝启动不足英文以触发 OOM。怎么才能 让亲戚亲戚让我们歌词 歌词 歌词 歌词 希望 GC 抑制成为一有一个多多基础模块,并能应用到更多场景中。可能性应用程序池池在调用 doStopSuppressGC 前触发了 OOM,则都要在 OOM 指在前停止 GC 抑制。和前面简单的改变分支跳转方向不同,都要在 OOM 指在前注入一有一个多多新的的分支跳转,你这个新分支的代码由亲戚亲戚让我们歌词 歌词 歌词 歌词 来实现。新分支主要功能是,调用 doStopSuppressGC,怎么才能 让再加注入的新分支,最后跳回 Dalvik 执行 OOM。

应用启动时间是移动 App 一有一个多多重要的用户体验环节,相对于普通的移动 App,支付宝过于庞大,必然会影响启动下行速率 ,很多很多常规的优化手段在支付宝中可能性做得比较完善了,本篇文章尝试从 GC 的层面来进一步优化支付宝的启动下行速率 。

7617e: 7d1a ldrb r2, [r3, #20]

原文发布时间为:2018-11-27

实现中使用了开源的二进制注入框架:https://github.com/crmulliner/adbi 。



76224: 4620 mov r0, r4

76220: f7a9 ed0e blx 1fc40

76170: 2400 movs r4, #0

以支付宝冷启动场景为例,亲戚亲戚让我们歌词 歌词 歌词 歌词 在容器 Quinox 的 attachBaseContext 函数里插入 doStartSuppressGC,在首页加载时候时候刚开始 时插入 doStopSuppressGC

收回 GC 应用程序池唤醒的目的是防止 GC 应用程序池频繁唤醒原应 的应用程序池抖动。下图是对应的 C++ 代码和 arm 指令片段,这段代码同样指在 dvmHeapSourceAlloc 函数中。在具体实现里亲戚亲戚让我们歌词 歌词 歌词 歌词 会依次扫描 libdvm.so 的 dynstr、dynsym、rel.plt 和 plt 区域获取 pthreadcondsignal@plt 的地址,怎么才能 让遍历 dvmHeapSourceAlloc 中的所有分支跳转,计算跳转目的地址。

本文作者:入弦

效果

}

/

相对于 C 语言来说,Java 语言有很多很多型态,相似开发人员不需要考虑内存的分配和回收,然而,应用程序池池内存管理又是必不可少的环节,妥协的结果是 Java 语言的设计者们把对象分配和回收插进了 Java虚拟机,这里希望明确一有一个多多概念:GC 是有代价的,你这个代价包括:阻塞 Java 应用程序池池的执行,占用 CPU 资源,占用额外内存等,谷歌的工程师意识到了 GC 对应用的影响,很多很多很多很多把 GC 的日志默认输出到了 Logcat,亲戚亲戚让我们歌词 歌词 歌词 歌词 老会 并能看得人 Logcat 里输出以下几种 GC 日志:

7616e: d901 bls.n 76174 <_Z18dvmHeapSourceAllocj+0x20>

设计思路

7616c: 42a1 cmp r1, r4

7617a: f853 4009 ldr.w r3, [r3, r9]

支付宝是 Android 系统的一有一个多多应用应用程序池池,怎么才能 才能 并能通过影响 Dalvik 的 GC 行为来缩短启动时间呢?你这个那些的问提还都还可不能能分解为两步:

x当条件不满足时直接返回,达到收回 GC 的目的;

76178: 6a28 ldr r0, [r5, #32]

76174: f8df 90bc ldr.w r9, [pc, #188] ; 76234 <_Z18dvmHeapSourceAllocj+0xe0>

本节将介绍支付宝 Android 客户端启动下行速率 优化下的「垃圾回收」具体思路。

* We have exceeded the allocation threshold. Wake up the

GC_FOR _ALLOCK:是分配对象失败时触发的 GC,你这个 GC 会将应用所有的 Java 应用程序池暂停运行,直到 GC 时候时候刚开始 。GC_CONCURRENT:是 Java 虚拟机根据堆的当前情况触发的 GC,你这个 GC 在 Dalvik 单独 GC 应用程序池里运行,在次要时间里不影响应用 Java 应用程序池的运行。

支付宝启动是一有一个多多典型的关键路径场景,亲戚亲戚让我们歌词 歌词 歌词 歌词 希望看得人尽可能性少的 GC_ CONCURRENT(可能性可能性,GC_ FOR_ ALLOCK 也应该缩减到大约),然而,通过 Logcat 亲戚亲戚让我们歌词 歌词 歌词 歌词 会看得人非常糟糕的 GC 行为—大量的 GC_ FOR_ ALLOCK 以及触目惊心的 Java 应用程序池被 WAIT_ FOR_ CONCURRENT_ GC 阻塞,如下图所示,通过简单统计那些GC消耗的时间,亲戚亲戚让我们歌词 歌词 歌词 歌词 并能得出GC严重影响应用启动时间的结论。

7621c: 64000 ldr r0, [r0, #0]

收回 softlimit 检测的目的是最大限度的分配对象,下图为 softlimit 检查对应的 arm 指令片段,指在 dvmHeapSourceAlloc 函数中,OXE057 对应于"return NULL"的分支,可能性亲戚亲戚让我们歌词 歌词 歌词 歌词 想永远不进入"return NULL"分支,还都还可不能能改变 cmp 指令的结果,在具体实现里亲戚亲戚让我们歌词 歌词 歌词 歌词 把"0X42"作为"指令指纹"来识别怎么才能 让修改为 "cmp r0, r0",那么 就还都还可不能能实现收回 softlimit 检查。

收回 GC 例程函数

x支付宝与否能影响自身 Dalvik 的行为

可能性发现 pthreadcondsignal@plt 和当前分支跳转目的地址配置,擦除这条指令即可。

* This allocation would push us over the soft limit; act as

7621e: 400b4 adds r0, #1400 ; 0xb4

上图的启动时间的数据是在内部内部结构的 Android 4.x 测试设备上获得的(那么标注 release 表示 debug 版本)。从图表上来看,支付宝客户端的启动时间缩短了 15%~400%。

猜你喜欢

一个是很爱你的男生,他爱你,对你好,尊重你,但是你并没有那么爱他,和他在一起,你很矛盾,很有压力,

扫描二维码下载为你推荐:可选中有一5个 多或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个疑问。 我来答本回答由女女网友推荐看你人个比较喜欢谁了确实越来越

2020-01-18

他说他爱上了别人,为了孩子不和我离婚,让我感谢孩子,这样的婚姻能继续吗

本回答由提问者推荐继续也很辛苦。人家身在曹营心在汉,不可能 嘴笨 不行就分了吧!孩子都看亲戚亲戚朋友从前,心里更有阴影追答追问追答追问追问追答追答追问追问追答

2020-01-18

我跟老公是初中同学,毕业以后我们就在一起谈恋爱了,那时候我爸妈非常不同意我们在一起可是我爱他我不管

本回答由提问者推荐扫描二维码下载追问追答追答追问可选中有另另一五个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个疑问报告 。追答追答追问这是多方面的导致

2020-01-18

我和我男友分手了 我们一起一年,在分手前一两天还好好的,突然就分

展开完整你对你这俩回答的评价是?展开完整收起更多回答(3)展开完整追问扫描二维码下载你对你这俩回答的评价是?本回答由提问者推荐展开完整换一换你对你这俩回答的评价是?使用百度知

2020-01-18

与unity时间显示方式相关精彩内容

作者:chinar-yunxi1705人浏览函数LOGUIstringDateTime详解Unity获取系统时间为什么么么获取系统时间DateTime教程unity时间显示最好

2020-01-18