在JS中,对于任何变量、对象、数组、实例等等这些,都会消耗我们的内存和资源,为了节省资源和提高速度,在JS中,他是如何处理我们已经不再使用的变量数组等呢?
概述
JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。
什么是内存泄漏
程序的运行需要内存,程序运行中的各种操作需要消耗资源和内存,程序运行中生成的各种数据也需要内存。若不及时释放内存,则内存的占用越来越高,轻则影响程序和系统的性能,重则导致进程或系统的崩溃。
没有及时释放不再使用的内存,就称为内存泄漏。
对于有的语言能够进行自动化内存管理,称为垃圾回收机制(Garbage collection)
哪些内容是“垃圾”?
JS的垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存。
有用的值:
- 本地函数的局部变量和参数
- 被上下文中的变量引用的变量
- 全局变量
无用的值:
- 值为 null 的值
- 函数的局部作用域中的变量和参数(函数完成后)
JS垃圾回收方式
标记清除
标记清除分为:标记阶段和清除阶段。
首先它会遍历堆内存上所有的对象,分别给它们打上标记,然后在代码执行过程结束之后,对所使用过的变量取消标记。在清除阶段再把具有标记的内存对象进行整体清除,从而释放内存空间。
标记清除的优点和缺点:
优点:
- 实现简单无非是标记和不标记的差异。
缺点:
- 首先是内存碎片化。这是因为清理掉垃圾之后,未被清除的对象内存位置是不变的,而被清除掉的内存穿插在未被清除的对象中,导致了内存碎片化
- 第二个缺点是内存分配速度慢。由于空闲内存不是一整块,假设新对象需要的内存是size,那么需要对空闲内存进行一次单向遍历,找出大于等于size的内存才能为其分配。