常见的内存泄漏场景
- vue组件中定义的计时器不会在组件被销毁时自动销毁,需在
beforeDestroy
中手动清除 - vue组件中通过
addEventListener
/$on
添加的事件不会在组件被销毁时自动销毁,需在beforeDestroy
中手动removeEventListener
/$off
- 闭包,通过解除对匿名函数的引用释放内存
function outerFun(outerArg){
return function(){
console.log('这里是内部匿名函数')
console.log('可以访问包含函数的变量',outerArg)
}
}
var create = outerFun("hi") //创建一个函数,是outerFun中返回的匿名函数
create() // 调用函数,是调用匿名函数
create = null // 释放对匿名函数的引用
- 变量指向一个dom元素后dom元素从页面移除,需手动清理该变量。也可使用WeakSet和WeakMap储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏。
如何发现内存泄漏
内存泄漏时,内存会不断增长,通过开发者工具进行判别。
-
Performance
打开谷歌开发者工具,切换至 Performance 选项,勾选 Memory 选项,点击开始录制。根据走势图进行判断是否存在内存泄漏
-
Memory
打开谷歌开发者工具,切换至 Memory选项,每次点击左上角圆点即可获取一份当前内存情况的快照。在搜索框还可以通过对象构造函数/类进行搜索。
- Shallow Size
该数据结构自身占用的内存, 不包括其引用的其他实例 -
Retained Size
当实例被回收时, 可以同时被回收的实例的Shallow Size之和
网友评论