1分钟快速排查内存泄漏

文章探讨了JavaScript内存泄漏的原因,包括全局变量、闭包、事件监听未移除和缓存未清除等,并提供了避免和解决内存泄漏的方法,如使用Eslint、及时清理绑定事件和缓存,以及通过heapdump和Performance工具进行诊断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存泄漏的原因

是指程序中己动态分配的堆内存由于某种原因未释放或无法释放,那么为什么没有释放呢(1.根据JS的垃圾回收机制,当内存中引用的次数为0的时候内存才会被回收 , 2.从根部出发触及到的对象被标记为不再使用才会被释放)

内存泄漏的几种情况

  • 全局变量:全局变量引用、变量未申明
  • 闭包:内层函数的变量对外层函数内的变量存在引用,闭包未得到释放,可能会导致内存泄漏
  • 事件监听未移除:重复监听
  • 缓存:缓存未清除导致,所以设置个缓存最大值

如何避免?

  • Eslint检测非期望的全局变量
  • 尽量少写复杂闭包
  • 绑定时间在Destroy的时候记得清除

如何解决?

heapdump打快照,memory看内存快照

泄漏前,泄漏中,通过Delta对比对象变化

闭包导致的案例

        function Foo(){
            var stage = []
            setInterval(() => {
                debugger
                this.data = {
                    name: 'wbczxxxxxxxxxxxxxxxxxx',
                    hobby: {
                        phone: '11'
                    },
                }
                stage.push(this.data)
            });
        }
        const foo = new Foo()复制代码

如果你还不能确认是闭包导致的问题,通过调试工具右下角可以发现形成了闭包

打快照发现,Js Arrays对象内存明显上升

又通过Delta发现,array数组下的对象的个数在递增,通过对象的key值,可以定位到具体代码,进而定位到由于闭包引起对外层变量的引用,内存未释放

另外如果是浏览器里可以通过Performance也可以查看内存堆随时间的变化

作者:饿了么新餐饮前端团队
原文链接:https://juejin.cn/post/6844904005764644878
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值