携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
内存泄漏
在了解垃圾回收机制之前我们先了解下内存泄漏
在进程执行过程中,会不断释放内存来保持性能,但是当一块内存既不使用,又不能释放掉,就被称为内存泄漏
原因:
造成内存泄露的情况有很多,主要有:
- 没有及时回收的全局变量
- 没有及时处理的闭包
- 未及时清除掉的定时器
- 没有清理的DOM元素引用
处理内存泄漏的方式可以用js垃圾回收机制处理
垃圾回收机制:
垃圾回收机制(Garbage Collection)简称GC,在JavaScript代码运行过程中会产生一定的垃圾,如果不能周期性,及时性的清除会影响程序运行。通过自动的垃圾回收机制,利用一些回收算法,找可以出不再使用的属性或者引用的变量,由JS引擎可以按照固定时间间隔进行周期性的释放其所占的内存空间,这个机制即为垃圾回收机制
方式:
垃圾回收机制主要有两种方式: 标记清除法、引用计数法
标记清除:
在变量执行时,会遍历所有的变量,然后变量执行完毕后会找到那些未做到标记的变量进行删除,再进行下一次循环
优点:
- 实现简单
- 能够回收循环引用的对象
- 普遍性高,大多数浏览器都采用这种方式
缺点:
- 标记效率低,大量占用js执行时间
- 会造成碎片化空间,造成空间的浪费
- 不能立即回收垃圾
引用计数:
每个变量被声明时,用计数器监听它的引用对象,在它的引用对象在引用和删除时进行赋值更新计数,引用时加1,删除或指向其他引用对象时减1,当计数为0时进行回收
优点:
- 可以立即回收垃圾
- 不占用js执行时间
- 减少程序执行暂停
缺点:
- 无法回收循环引用的对象
- 需要引用计数,且时刻监视引用数值是否有变化,所以时间开销大
- 操作繁琐
- 计数器占位
- 计数器需要增减处理任务繁重