「前端每日一问(48)」前端如何排查内存泄漏

1,359 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

本题难度:⭐ ⭐

本题类型:综合题、浏览器

答:

可以使用chrome 开发工具的 Performance 选项和 Memory 选项来排查内存泄漏。

写下面这么两个函数,一个用来故意创建很多 DOM 元素,一个用来在一个数组里不停地 push 大量数据,然后用一个定时器去不断执行这两个函数。

function createNodes () {
  for(let i = 0; i < 100; i++) {
    let div = document.createElement('div')
    div.appendChild(document.createTextNode(i))
    document.body.appendChild(div)
  }
}

let arr = []
function createArray() {
  let foo = new Array(100000).fill({
    name: 'lin'
  });
  arr.push(foo)
  console.log(arr)
}

setInterval(() => {
  createArray()
  createNodes()
}, 1000);

这时,打开 Chrome 的开发者面板,点开 Performance 面板,拍下快照,如下图所示。

image.png

可以看到,JS Heap 和 Nodes 这两条线随着时间一直在上升,是因为我们刚才写的测试代码生效了。

但是光是这么一个快照无法看出究竟是哪里出错了,毕竟实际项目中函数调用错综复杂。

这时就可以打开 Mermory 面板,这里显示了每一项的内存占用情况,如下图所示。

image.png

可以很明显地看到,第一项里的 array 占用内存非常大且远超其他项,这时我们就可以重点排查一下这个array 是怎么产生的。

image.png

展开一看数据,果然就是我们刚才测试代码生成的。

结尾

在实际项目中,如果遇到了卡顿的情况,很有可能是内存泄漏造成的,如果无法主观地判断代码中哪里出了问题,就可以使用这种方式去排查、纠错。

阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

你也可以关注《前端每日一问》这个专栏,防止失联哦~

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(47)」说一下 JS 的内存管理,举一些内存泄漏的例子。

下一篇:

「前端每日一问(49)」什么是命令式框架和声明式框架?