定义:内存泄漏(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);