文章目录
为什么需要垃圾回收
由于字符串、对象和数组没有固定大小,只有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。
垃圾回收简述
JS 是使用垃圾回收的语言,简单来说就是执行环境负责在代码执行时管理内存。基本思路很简单:确定哪个变量不会再使用,释放它占用的内存。这个过程是周期性的,每隔一段时间就会自动运行。
垃圾回收程序必须跟踪记录哪个变量还会使用、以及哪个变量不会再使用,以便回收内存。如果标记未使用的变量也许有不同的实现方式。不过在浏览器的发展史上、用过两种主要的标记策略:标记清理和引用计数。
标记清除
标记清楚事js垃圾回收最常用的策略。标记清除分为标记和清除两个阶段完成:
- 遍历所有对象找标记活动对象
- 遍历所有对象清除没有标记对象
优点)
- 解决对象循环引用不能回收的问题(相对于引用计数)
缺点) - 空间碎片化(由于回收的空间地址不连续),不能使空间最大化使用,不会立即清除垃圾。
标记整理(Mark-Compact)算法
就可以有效地解决以上问题,标记结束后,标记整理算法会将活着的对象(即不需要清理的对象)向内存的一端移动,最后清理掉边界的内存。
引用计数
引用计数是对每个值都记录它被引用的次数。声明变量并赋予一个引用值时,这个值的引用数是 1。类似地,如果保存对该值引用的变量被其他值给覆盖了,那么引用值减 1。当这个值的引用数为 0 时,就说明没有办法再访问到这个值了,因此可以安全地收回其内存了。
function problem() {
let objectA = new Object();
let objectB = new Object();<