闭包导致内存泄露

定义:内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。在JS中的内存泄露会导致浏览器页面卡死。

内存泄露代码的解决方法:

function createFnArray() {
    // 占据的空间是4M
    var arr = new Array(1024 * 1024).fill(1);
    // 产生内存泄露就是因为这个函数引用上面这个对象,所以没办法销毁,
    // 所以需要想办法把返回的这个函数销毁掉,
    return function () {
        console.log(arr.length);
    }
}

// 解决方法:置空
var arrayFn = createFnArray();
arrayFn = null

内存泄露代码性能图:
内存在不断的递增,然后一段时间之后内存开始释放
在这里插入图片描述

测试内存泄露整个过程代码:

function createFnArray() {
    // var arr = [1, 1, 1, 1, 1, 1, 1, 1,1, 1,1, 1,1 ]
    // 占据的空间是4M x 100 + 其他的内存 = 400M+
    
    // 内存分析说明
    // 1 -> number -> 8byte -> 8M
    // js:(整数和浮点类型) 10  3.14   -> number ->8byte ? JS引擎在真正实现的时候,为了提高空间利用率,对于很多小数字压根不需要8个字节
    // 8byte => 2的64次方(非常大)  => 4byte
    // 小的数字类型,在v8中称为Sim,小数字的范围  2的32次方  表示  负2的31次方到正2的31次方-1  
    var arr = new Array(1024 * 1024).fill(1)
    return function() {
      console.log(arr.length)
    }
  }

  // 100 * 100 = 10000 = 10s
  var arrayFns = []
  for (var i = 0; i < 100; i++) {
    setTimeout(() => {
      arrayFns.push(createFnArray())
    }, i * 100);
  }
  
  // arrayFns = null
  setTimeout(() => {
    for (var i = 0; i < 50; i++) {
      setTimeout(() => {
        arrayFns.pop()
      }, 100 * i);
    }
  }, 10000);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值