[转帖]记录一次前端内存泄漏排查经历

记录,一次,前端,内存,泄漏,排查,经历 · 浏览次数 : 0

小编点评

**内存泄漏的定义:** 内存泄漏是指在应用程序运行过程中,未释放的内存资源导致系统资源枯竭或崩溃的现象。 **内存泄漏的常见原因:** * **闭包、匿名函数和事件绑定**:闭包、匿名函数和事件绑定经常导致内存泄漏。 * **内存分配错误**:分配或释放内存时出现错误或分配量不足的情况也会导致内存泄漏。 * **第三方库和框架的打包文件**:一些第三方库和框架包含包含内存泄漏的代码。 **如何判断内存泄漏:** * 观察应用的性能指标,例如 CPU 使用率、内存使用率等。 * 使用 Chrome Developer Tools 中的 Memory 选项监控内存使用情况。 * 查看 Performance monitorChrome64 中的折线图,观察资源的变化情况。 **如何排查内存泄漏:** * 使用 Chrome Developer Tools 的 Performance monitor 来监控内存使用情况。 * 跟踪内存使用情况的 #Delta 值,以识别新生成的内存是否来自于释放的内存。 * 查找内存泄漏问题,例如闭包、匿名函数或事件绑定。 * 审查第三方库和框架的代码,查找可能包含内存泄漏的代码。 **如何解决内存泄漏:** * 确定内存泄漏的根源。 * 修复内存泄漏的代码。 * 使用资源回收机制,释放被释放的内存。 * 优化应用程序的性能。

正文

https://juejin.cn/post/6844904019983335438

 

对于前端的“内存泄漏”这个东西,说实话我只在书上看到过:

闭包、匿名函数和事件绑定尤其容易造成内存泄漏。

然而这些操作造成的“内存泄漏”究竟是什么样子的?如何排查?虽然很好奇,却不得而知。直到这次公司应用频繁出现浏览器崩溃的情况,我受命解决这个问题,才开始研究内存泄漏的排查方法,及排查工具。

如何判断内存泄漏

我司的应用在客户现场反馈过来的问题是:在某几台固定的电脑上频繁出现浏览器崩溃的情况。我问现场要了机器的配置,发现这些问题机器的可用运行内存,连三个 G 都没有,在别的内存较大的机器上这种崩溃的情况较少发生。

如果浏览器频繁出现“崩溃”、“卡顿”等情况,则基本可以判断为浏览器内存占用较高,而 CPU 分配给浏览器的内存空间是很小且有限的,如果内存占用濒临极限,就会出现卡顿,如果内存占用溢出,浏览器就会崩溃。

工具排查

Chrome 浏览器,F12 打开开发者工具,涉及公司机密,我就先找了阮一峰老师的 ES6 网站演示。

Performance

点击这个按钮启动记录,然后切换到网页进行操作,录制完成后点击 stop 按钮,开发者工具会从录制时刻开始记录当前应用的各项数据情况

选中JS Heap,下面展现出来的一条蓝线,就是代表了这段记录过程中,JS 堆内存信息的变化情况。

关于“堆”和“栈”的概念,简单的说,开发者创建的对象都在堆里,栈空间是留给系统来分配的

有大佬说,根据这条蓝线就可以判断是否存在内存泄漏的情况:如果这条蓝线一直成上升趋势,那基本就是内存泄漏了

其实我觉得这么讲有失偏颇,JS 堆内存占用率上升并不一定就是内存泄漏,只能说明有很多未被释放的内存而已,至于这些内存是否真的在使用,还是说确实是内存泄漏,还需要进一步排查。

memory

开发者工具的 Memory 选项,可以更精确地定位内存使用情况。

当生成了第一个快照的时候,开发者工具窗口已经显示了很详细的内存占用情况。

字段解释:

  • Constructor — 占用内存的资源类型
  • Distance — 当前对象到根的引用层级距离
  • Shallow Size — 对象所占内存(不包含内部引用的其它对象所占的内存)(单位:字节)
  • Retained Size — 对象所占总内存(包含内部引用的其它对象所占的内存)(单位:字节)

将每项展开可以查看更详细的数据信息。

我们再次切回网页,继续操作几次,然后再次生成一个快照。

这边需要特别注意这个 #Delta ,如果是正值,就代表新生成的内存多,释放的内存少。其中的闭包项,如果是正值,就说明存在内存泄漏。

下面我们到代码里找一个内存泄漏的问题:

Performance monitor

Chrome64 新增的一个 Performance monitor 可以帮助我们实时监听 performance 的变化情况。一般而言,浏览器的垃圾收集会每个一段时间运行一次,届时会释放大量资源,我们能在 Performance monitor 的折线图上看到折线断崖式下跌。一边操作页面,一边观察资源的变化可以帮助我们更快地定位问题。

哪些应用更容易内存泄漏

单页应用容易出现这个问题。

如果是普通网站,切换菜单页面就刷新了,所有内存会被回收,进行再分配,不太会出现严重的内存泄漏问题。

总结

最后,关于内存泄漏,我发现几乎所有网站都存在这个问题,并且有很多的内存泄漏,都是第三方库和框架的打包文件带来的。所以说,对于内存泄漏,只要不是特别严重,开发者是没有单独处理的必要的。

然而我司的应用就另当别论了,,

别问我有多少内存泄漏。

五十三万个,我日。。

与[转帖]记录一次前端内存泄漏排查经历相似的内容:

[转帖]记录一次前端内存泄漏排查经历

https://juejin.cn/post/6844904019983335438 对于前端的“内存泄漏”这个东西,说实话我只在书上看到过: 闭包、匿名函数和事件绑定尤其容易造成内存泄漏。 然而这些操作造成的“内存泄漏”究竟是什么样子的?如何排查?虽然很好奇,却不得而知。直到这次公司应用频繁出现浏

[转帖]Redis 运维实战 第05期:RDB 持久化

https://cloud.tencent.com/developer/article/1986826 前面一节,我们聊了 AOF,AOF 有个不足点就是:进行数据恢复时,需要逐一把日志都执行一遍,非常耗时间。 Redis 还有另外一种持久化方法:内存快照。指内存中的数据在某一时刻的状态记录,这个快

[转帖]人大金仓数据库的备份与还原

人大金仓数据库的备份与还原 文章目录 人大金仓数据库的备份与还原前言备份sys_dump 命令 还原ksql 命令sys_restore 一. 从人大金仓数据库备份还原到人大金仓数据库二 从postgresql数据库备份还原到人大金仓数据库 后记 前言 本文记录一次使用人大金仓数据库(Kingbas

[转帖]记一次使用nacos2踩到的坑

https://cloud.tencent.com/developer/article/2077110?areaSource=104001.26&traceId=7WZNP412yK3vh7ebw4th0 前言 本文素材来源朋友学习nacos2.1.1踩到的坑。直接上正菜 坑点一:出现端口被占用 因

[转帖]SSL 配置优化的若干建议

转载自本人博客:https://dev.tail0r.com/ssl-optimization/ 如果你配置SSL只是为了网站的网址前有一把锁的标志,那不如直接送你把锁好了。 别想了,这句话不是哪个安全专家说的,是我说的(逃) 今天写一篇文章记录一下自己 SSL 的配置优化过程。以下设置均为 Ngi

[转帖]优秀后端都应该具备的开发好习惯

https://juejin.cn/post/7157508782874968094 前言 大家好,我是捡田螺的小男孩。 记录一下一个优秀的后端开发程序员,应该有哪些好的开发习惯。 公众号:捡田螺的小男孩 github地址,感谢每颗star:github 1.注释尽可能全面,写有意义的方法注释 接口

[转帖]Linux小技巧:获取前一天日期、前一个月日期

最近脚本需要获取Linux前一天时间格式,用于设置日志文件名,网上查了查资料,这里记录一下。 1.date命令 1.1 date命令使用格式 date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--s

[转帖]tidb之旅——tidb架构选择

https://zhuanlan.zhihu.com/p/641650168 前言 从4月份开始利用tidb改造了我们公司bi系统。这个过程中,我感觉到了tidb的强大。也打算记录一下整个改造过程。我打算从4个方面来记录这个改造过程。tidb架构选择,dm工具的使用——这两个部分还是tidb6.5.

[转帖]一文带你搞懂xxl-job(分布式任务调度平台)

https://zhuanlan.zhihu.com/p/625060354 前言 本篇文章主要记录项目中遇到的 xxl-job 的实战,希望能通过这篇文章告诉读者们什么是 xxl-job 以及怎么使用 xxl-job 并分享一个实战案例。 那么下面先说明什么是 xxl-job 以及为什么要使用它。

[转帖]深入理解mysql-第五章 InnoDB记录存储结构-页结构

前言: 页是InnoDB管理存储空间的基本单位,上一章我们主要分析了页中的主要的构成行的存储结构-行格式,其中简单提了一下页的概念。这章我们详细讲解一下页的存储结构。 一、数据页结构 前边我们简单提了一下页的概念,它是InnoDB管理存储空间的基本单位,一个页的大小一般是16KB。和存储一条条数据的