西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里( 三 )


在 fork 子进程之前先 Suspend 获取主进程中的线程拷贝,通过 fork 系统调用创建子进程让子进程拥有父进程的拷贝,然后 fork
出的子进程中调用 Hprof 的 DumpHeap 函数即可完成把耗时的 dump 操作在放在子进程 。由于 suspend 和 resume
是系统函数,我们这里通过自研的 native hook 工具对 libart.so hook 获取系统调用 。由于写入是在子进程完成的,我们通过
Android 供的 fileObsever 文件写入进行监控获取 dump 完成时机 。

西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里

文章插图

图 5.子进程 dump 流程图
# Hprof 分析时机
为了达到分析过程对于用户无感,我们在线上、线下配置了不同的分析时机策略,线下在 dump
分析完成后根据内存状态主动触发分析,线上当用户下次冷启退出应用后台且内存充足的情况下触发分析 。
# 分析策略
分析策略我们供了两种,一种在 Android 客户端分析,一种回传至 Server 端分析,均通过 MAT 分析引擎进行分析 。
# 端上分析
# 分析引擎
端上分析引擎的性能很重要,这里我们主要对比了 LeakCanary 的分析引擎 Shark 和 Haha 库的 MAT 。

西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里

文章插图

图 6. Shark VS MAT
我们在相同客户端环境对 160M 的 HPROF 多次分析对比发现 MAT 分析速度明显优于 Shark,另外针对 MAT
分析后仍持有统治者树占用内存我们也做了主动释放,对比性能收益后采用基于 MAT
库的分析引擎进行分析,对内存泄漏引用链路自动归并、大对象小对象引用链自动分析、大图线下自动还原线上过滤无用链路,分析结果如下:
# 内存泄漏

西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里

文章插图

图 7. 内存泄漏链路
对泄漏的 Activity 的引用链进行了聚合分析,方便一次性解决该 Activity 的泄漏链释放内存 。
# 大对象

西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里

文章插图

图 8. 大对象链路
大对象不止分析了引用链路,还递归分析了内部 top 持有对象(InRefrenrece)的 RetainedSize 。
# 小对象

西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里

文章插图

图 9. 小对象链路
小对象我们对 top 的外部持有对象(OutRefrenrece)进行聚合得到占有小对象最多的链路 。
# 图片

西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里

文章插图

图 10. 图片链路
图片我们过滤了图片库等无效引用且对 Android 8.0 以下的大图在线下进行了还原 。

西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里

文章插图

# 回传分析
为了最大限度的节省用户流量且规避隐私风险,我们通过自研 HPROF 裁剪工具 Tailor 在 dump 过程对 HPROF 进行了裁剪 。
# 裁剪过程

西瓜视频播放位置其他是哪里,西瓜视频的缓存文件在哪里

文章插图

图 11. Tailor 裁剪流程
去除了无用信息
* 跳过 header
* 分 tag 裁剪
* 裁剪无用信息:char[]; byte[]; timestamp; stack trace serial number; class serial number;
* 压缩数据信息
同时对数据进行 zlib 压缩,在 server 端数据还原,整体裁剪效果:180M--->50M---->13M
# 优化实践
# 内存泄漏
除了通过后台根据 GCROOT+ 引用链自动分配研发跟进解决我们常见的内存泄漏外,我们还对系统导致一些内存泄漏进行了分析和修复 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: