一次关于前端的内存泄漏

  • 最近发现了公司的前端框架存在内存泄漏的问题,启动会占用浏览器大量的内存,并且时不时崩溃。排查发现,确实存在大量的内存泄漏,而且仅仅翻页,就会将内存从28.7慢慢的加到189。
    在这里插入图片描述
    通过查看Chrome的Memory,发现确实存在大量的未回收对象(以 Detached 开头)。但是无法回收的对象,都是挂在Vue上的,感觉像是Vue框架的问题,不敢妄下定论,但此时一个比较奇怪的引用 _this2 倒是引起了我的注意。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4paDO4UW-1660535943330)(./z999_images/一次关于前端的内存泄漏/内存泄漏2.png)]
    然后通过Chrome的Memory查看哪些函数占用了大量的资源。发现占用了大量资源的函数,仍然是Vue的代码,这就有点奇怪了,难道是Vue本身出的bug被我给碰上了么?但是理性上还是不太可能,对于成熟的广泛使用的框架,还是有一定的信任的。
    在这里插入图片描述
    再往下翻的时候,开始找到了公司的前端框架代码。
    在这里插入图片描述
    然后打开里面的内容,发现了大量的 var _this2 = this
    在这里插入图片描述
    这里因为将this挂在了全局作用域上,导致即使关闭页面或者销毁组件,但是因为顶部作用域仍然持有该Vue对象的引用,所以无法被垃圾回收机制回收。这也就是为什么开始的时候,发现了很多 _this2 的引用。
    翻看源码,发现并没有主动声明 var _this2 = this,而是因为使用了setTimeout,虽然并没有主动声明挂载,但是因为setTimeout是异步,箭头函数最终会变成普通函数,所以 webpack 打包后就变成了上面var _this2 = this 这种主动声明在顶部作用域的情况。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值