内存泄漏(简洁易懂)

内存泄漏:被分配的内存,既无法使用,又无法被回收。直到浏览器进程结束。

造成的原因:
1.被遗忘的定时器
定时器用完之后 手动关闭 clearInterval() clearTimeout()

2.console.log()
console.log()中接受的对象不会被垃圾回收

3.DOM泄漏

4.意外的全局变量
JS对未声明的变量都会挂载到全局对象上。只有在页面刷新或者关闭时才会释放内存。
使用let const声明变量 或者 使用 严格模式

5.闭包
大多数情况下,闭包会造成内存泄漏。

1、什么是内存泄漏
内存泄漏是指由于疏忽或错误造成程序未能释放已经不在使用的内存

内存泄漏并非指内存存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该内存之前就失去了对该内存的控制,

简单理解:无用的内存还在占用,得不到释放和归还,比较严重的时候,无用的内存还会增加,从而导致整个系统卡顿,甚至崩溃

2、内存生命周期
一般按照顺序分为三个周期

1、分配期:

分配所需要的内存,在前端javascript中,内存是自动分配的

2、使用期:

使用分配到到得内存(读写),在js中读写一个变量或者对象的属性值

3、释放期:

不需要时将该内存释放和归还,js会自动释放内存,(除闭包和部分bug外),
内存泄漏也是出现在这个时期,内存没有被释放导致的

3、javascript内存管理机制
上面我们提到,javascript在创建变量时会自动分配内存,在不使用会“自动”释放内存,释放的过程称为垃圾回收机制,这个“自动”就是js混乱的根源。

js内存的生命周期是:
分配内存》使用内存》释放内存

1、内存分配
javascript定义变量就会自动分配内存
所以我们只需要了解javascript的内存是自动分配的即可

2、内存使用
在使用值的过程,实际上是对内存分配进行读取和写入的操作,读取和写入可能是写入一个变量或一个对象的属性值

3、内存回收
前端垃圾内存回收称之为GC
内存泄漏也是发生在这一步,js的内存回收机制,虽然能回收大部分的垃圾内存,但是还是存在无法回收的情况,需要手动清理

4、两种垃圾回收算法
1、引用技术垃圾回收机制
把“对象是否不在需要”简化定义为“对象没有其他对象引用到它”这样更容易被计算机理解,
如果没有引用则指向零引用,该对象将被垃圾回收机制回收

在实际应用中:
对象 = null
这个对象就被回收了

2、标记清除法
在变量进入执行环境时,标记为“进入环境”,当变量离开执行环境时。标记为“离开环境”,被标记“进入环境”的变量不会被回收
被标记“离开环境”的变量则被回收

环境可以理解为我们的作用域。但是全局作用的变量在页面关闭时才销毁

5、javascript内存泄漏的一些场景
1、被遗忘的计时器,写在函数内部,闭包内的
2、意外的全局变量{目前eslint会提示语法错误}
3、被遗忘的事件监听器,使用监听器后要移除监听器
4、被遗忘的ES6 set成员
5、被遗忘的订阅发布事件监听器
6、被遗忘的闭包
 

你可能感兴趣的:(javascript,前端,java)