这是我参加文文挑战赛的第 4 天。活动详情请见:文文挑战
一、什么是内存泄漏
所谓内存泄漏,是指使用的内存在生命周期的释放期内没有被释放,会导致内存泄漏。当内存泄漏严重时,会导致整个系统死机甚至崩溃。
二、JavaScript 内存管理
对于像C C++这样的语言,开发者可以直接控制内存的分配和回收。但是在 JavaScript 中,内存空间是由程序自己处理的,也就是说 JavaScript 有自动垃圾回收机制。
1、内存生命周期

2、内存分配
在 JavaScript 中,给一个数据类型的变量赋值就是自动分配内存,比如:
let num = 123 // 给数值变量分配内存
const str = "ababa" // 给字符串分配内存
const obj = { // 给对象分配内存
name: "ababa",
id: 1
}
const arr = [1,2,3] // 给数组分配内存
function fn(param){ // 给函数分配内存
return param
}
复制代码
3、内存使用
如上所述,使用内存就是读写分配的内存。例如:
let num = 123 // 给数值变量分配内存
function fn(param){ // 给函数分配内存
return param
}
fn(num) // 进行读写操作
复制代码4、内存释放
为了避免内存泄漏,我们先来看看JavaScript垃圾回收机制。内存泄漏一般发生在垃圾回收的过程中。因为 JavaScript 的内存回收机制可以回收大部分垃圾内存,所以还是存在无法回收的情况。如果存在这些情况,我们需要手动清理内存。
5、JavaScript 垃圾回收机制
JavaScript 中有两种常见的垃圾回收机制:标签清除和引用计数。
(1)标记去除方法
这是 JavaScript 中最常用的垃圾回收方法。即引用后,标记无用的内存数据,垃圾回收器删除标记的变量。

(2)引用计数方法
所谓的“引用计数”,是指语言引擎有一个“引用表”,用来保存内存中所有资源(通常是各种值)的引用次数。如果某个值的引用次数为0,则表示该值不再使用,可以释放这块内存。
6、JavaScript 内存泄露常见场景(1)被忘的Timer
经常看到身边很多同学写了很多定时器,但是定义了定时器之后,并没有考虑清空定时器。这会造成一定程度的内存泄漏。
// 被遗忘的定时器
function f() {
let obj = new Array(100000)
setInterval(() => {
let myObj = obj
},1000)
}
复制代码上面的代码是使用定时器的典型方式。这种方法会导致内存泄漏。正确的做法应该是:
// 被遗忘的定时器
function f() {
let obj = new Array(100000)
let count = 0 //使用计数器
let timer = setInterval(() => {
if (count === 5) clearInterval(timer); // 当计数器执行到第五次的时候清除定时器,防止内存泄漏
let myObj = obj
count++ // 执行成功后计数器加一
},1000)
}
复制代码(2)控制台打印

控制台的打印也会导致内存泄漏。我们在开发过程中经常会写下很多控制台。测试完成后记得删除这些测试语句。
(3)意外的全局变量
什么是意外的全局变量?比如我们看下面的代码
function fn(num){
basicNum = 1
return basicNum+num
}
fn(2)
复制代码全局变量在正常情况下是不会被垃圾回收器回收的,比如上面的变量basicNum,就是直接赋值而不声明,导致我们分配给这个全局变量的内存空间一直存在。如果赋值是一个非常大的数组,那么内存会比较大。
其实不注意的话,也可以开启严格模式,这样不注意的时候就可以检测出来,会出现错误警告。

(4)被遗忘的事件器
我们在开发过程中写了很多没用的事件器。如果我们忘记清理它,也会造成内存泄漏。
以上就是JavaScript内存泄漏的基本内容~~
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-380804-1.html
没有宣布