掘力计划第25期 基于定制Chromium的前端内存泄露监控分析实践

9月23日,本期掘力计划以"性能专场"为主题,邀请了来自字节跳动 Web Infra 团队的浏览器内核开发工程师庞进林,为我们带来题为《基于定制 Chromium 的前端内存泄露监控分析实践》的演讲。

庞进林讲师来自字节跳动的 Web Infra 团队,2020年加入字节跳动,三年来一直从事基于谷歌 Chromium 内核对公司移动端 Android WebView、桌面端 Electron、爬虫 Headless 进行内核级性能优化、稳定性优化、功能增强等工作,他在浏览器内核定制方面具有丰富的实践经验。

本次演讲的主题是基于定制 Chromium 的前端内存泄露监控分析实践。内存泄露一直是影响前端性能的重要因素,严重时可能导致浏览器崩溃,严重影响用户体验。演讲从内存泄露的业务背景和技术背景出发,介绍了字节跳动在内存泄露监控、自动化测试、DevTools 扩展等方面的实践,以更好地发现、定位和修复内存泄露问题,保证良好的用户体验。

视频回放:juejin.cn/live/jpower...

Electron内存泄露背景

庞进林讲师从业务和技术两个方面分析了 Electron 应用内存泄露的背景。首先从业务背景来看,内存泄露直接导致的应用崩溃,是 Electron 应用中最严重的稳定性问题之一。比如某产品 PC 版过去半年 OOM 崩溃率大幅下降 90% 以上,可见内存泄露的严重影响。

内存泄露还会间接导致页面卡顿、用户机器发热等用户体验问题。所以内存泄露不仅影响稳定性,还关系到用户体验。

从技术背景来看,Electron 应用天生就存在内存泄露的风险:

  • 第一,Chromium 内核本身内存占用就比较高,即使一个 Hello World 的网页也需要占用 500M 内存。
  • 第二,前端开发者更关注 Node.js 和 Web 开发,对底层浏览器内核不够了解。不太清楚资源加载对应的内存大小。
  • 第三,Web 开发更追求速度,不像原生开发会细致控制内存。并且 JS 有自动回收机制,开发者并不特别关心回收策略。
  • 第四,Web API 中很少有内存监控的接口,只有简单的 performance.memory 接口。不能获取细粒度的内存分布数据。但是 Chromium 内核本身提供了非常丰富的内存调试接口,可惜没有被前端消费。
  • 第五,Chrome DevTools 中的内存工具也较难上手,前端开发者缺少低成本的内存测试调试手段。

综上所述,Electron 应用存在明显的内存泄露风险,有必要从内核级别进行一些改进和优化。

内存监控数据指标体系

第一,构建可还原 OOM 崩溃场景的指标体系。通过定制的崩溃上报组件,可以在网页崩溃时收集各种内存指标,尽可能还原崩溃场景。这些指标可以分为四类:

  1. 系统级别和模块级别的内存消耗监控
  2. V8 和 PartitionAlloc 等内存分配器的细粒度内存消耗
  3. 崩溃发生时的场景信息,如当前页面、版本、操作等
  4. 各类网页对象的数量,如 DOM 节点、事件监听器等

第二,构建通用的运行时内存监控指标体系。使用 PerfMonitor 组件持续采集一些通用内存指标,平衡监控性能。

第三,基于数据指标实现防劣化监控、报警、数据分析。借助公司数据中台,进行精准的内存数据分析,配置指标报警,并推送给相关负责人,实现内存问题的闭环。

通过构建全面的内存数据指标体系,可以更及时发现内存泄露问题,并采取有针对性的优化措施。这是 Electron 应用优化内存的重要一环。

自动化内存测试能力介绍

构建的自动化 UI 测试用例,主要基于两类场景:一是用户高频操作场景,比如视频播放;二是从线上 OOM 数据分析出的易泄露场景,比如弹幕发送。

在自动化测试运行时,会收集非常丰富的内存数据指标,比如系统内存、Chrome Tracing 数据、JS 堆内存快照等。收集到的数据会进行自动化消费和分析,产出测试报告。报告中会包含堆内存快照分析、Tracing 分析、MemLab 等自动化分析结果,可以直观发现内存泄露问题。

除了产出报告,还会配置实时的数据看板,观察测试过程中内存指标的实时变化,比如监控播放器相关内存的增长情况。

通过上述自动化内存测试的能力,可以大幅提升内存问题检测效率,使内存泄露可以在代码合入到主分支之前就被发现和修复,避免影响到线上用户。

DevTools 内存调试工具扩展介绍

庞进林讲师介绍了 Chrome DevTools 现有的内存调试工具,包括 Memory 面板、Performance 面板和 Performance Monitor。这些工具功能各有侧重,但整体来说内存指标不够丰富和直观。

在此基础上,TTElectron 团队开发了 EDT 扩展,以 DevTools 插件形式增加了内存调试能力。EDT 提供丰富的内存指标,并以图表形式实时展示指标变化趋势,更直观。EDT 扩展支持自定义指标面板,用户可以根据自己场景选择不同内存数据进行关注。

最后介绍了 EDT 的最佳实践,即熟悉各指标含义,通过 EDT 观察内存异常走势,利用 Memory 面板分析快照关联对象,最终定位代码导致内存泄露的根源。EDT 扩展与 DevTools 的 Memory、Performance 面板互为补充,共同构成了一套更强大的内存调试方案,可以显著提高内存问题定位和修复效率。

通过 DevTools 功能扩展,前端开发者可以在日常开发过程中就高效发现和定位内存泄露问题,无需等待自动化测试或线上监控才进行排查。

总结

本次演讲系统地介绍了字节跳动基于定制 Chromium 在内存泄露监控和分析方面的实践。这些实践为提高 Web 应用的性能,改善用户体验提供了有价值的参考。相信对于广大 Web 开发者,特别是使用 Electron 和 WebView 的开发者来说,都能从中获益匪浅,学习到许多优化 Web 应用性能的方法和经验。

掘力计划

掘力计划由稀土掘金技术社区发起,致力于打造一个高品质的技术分享和交流的系列品牌。聚集国内外顶尖的技术专家、开发者和实践者,通过线下沙龙、闭门会、公开课等多种形式分享最前沿的技术动态。

相关推荐
zhanghaisong_201524 分钟前
Caused by: org.attoparser.ParseException:
前端·javascript·html·thymeleaf
Eric_见嘉27 分钟前
真的能无限试(白)用(嫖)cursor 吗?
前端·visual studio code
DK七七1 小时前
多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码
开发语言·前端·微信小程序·小程序·php
老赵的博客1 小时前
QSS 设置bug
前端·bug·音视频
Chikaoya1 小时前
项目中用户数据获取遇到bug
前端·typescript·vue·bug
南城夏季1 小时前
蓝领招聘二期笔记
前端·javascript·笔记
Huazie1 小时前
来花个几分钟,轻松掌握 Hexo Diversity 主题配置内容
前端·javascript·hexo
NoloveisGod2 小时前
Vue的基础使用
前端·javascript·vue.js
GISer_Jing2 小时前
前端系统设计面试题(二)Javascript\Vue
前端·javascript·vue.js
海上彼尚2 小时前
实现3D热力图
前端·javascript·3d