这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
1. 官方介绍:
由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。
2. 简单来说:
无用的变量对象,原始值,函数,数组等所占用的内存要释放掉,不然越积越多就会存在内存泄漏,所以javascript的就会周期性地进行垃圾回收,释放内存.
3. 垃圾回收两种机制
- 标记清除
- 引用计数
3.1 标记清除
当变量进入执行环境时,将变量标记为进入环境,当变量离开执行环境时,再将该变量标记为离开环境, 当垃圾收集器生命周期开始跑起来时, 开始整理清除无用的和之前已经被标记离开环境的变量,开始销毁这些变量释放占用内存.
3.2 引用计数
javascript引擎有一张引用计数,保存了内存里面所有值引用次数。如果一个值的引用次数为零,那么可以将该变量清除,释放占用内存,想要清除引用可以让变量等于null
let a = new Object() // 此对象的引用计数为 1(a引用)
let b = a // 此对象的引用计数是 2(a,b引用)
a = null // 此对象的引用计数为 1(b引用)
b = null // 此对象的引用计数为 0(无引用)
4. 内存泄漏有哪些原因造成
- 定时器使用不规范没有及时设置null
- 无用全局变量一致被占用