引用计数的回收机制
Javascript 的内存回收的算法主要依赖于引用,当代码生成一个新的内存驻留项时(如一个对象),系统就会为它开辟一块内存空间,因为这个对象可能会被传递给其他函数或对象。所以可能很多代码都会指向这个对象的内存空间。Javascript 的垃圾回收器跟踪这些指向,当最后一个指向都被断开废弃的时候,这个对象所占用的空间就会被释放。
但是在相互引用的时候,就没法对对象回收,对于此类循环引用,实在是各类垃圾自动回收的缺陷。
标记清除的回收机制
从2012年起的现代浏览器中,对于 Javascript 垃圾回收的机制进行了更新,不再使用引用计数的算法,而是改为使用标记清除的方式。比如定义一个变量,当它进入执行环境时,会被垃圾回收器标记为”进入环境”,当其离开环境:比如函数执行完毕的时候,标记为”离开环境”,垃圾回收机器就会在这些”离开环境”的变量中挑选处理需要回收掉的变量用于释放内存。
它不会再去计算引用的数量,而是从全局对象(根节点)开始寻找,找到所有可获得 的对象和所有不可获得的对象,也就是它从之前判断”对象是否被需要”变成”对象是否可以获取”。所以说,零引用的对象总是不可获得的,但是不可能获得的对象不一定零引用。