1、js的数据(字符串、数组、对象)没有固定的大小,js程序在创建这些数据之后这些数据才会被分配内存,所以js的内存分配是动态的,如果一直只分配不回收那么内存被消耗完程序就会崩溃。
2、这就是js需要垃圾回收的原因,这些使用完之后还没有被回收的数据就是垃圾。
3、js有自己的垃圾回收机制,原理就是js的解释器可以检测到哪些的数据不再被需要,然后释放这些数据侵占的内存。
4、浏览器有两种垃圾回收方式:标记清除和引用计数。
5、标记清除:是js最常用的一种。当变量进入环境的时候被标记为“进入变量”,当变量离开环境的时候被标记为“离开环境”,环境指的是执行环境。垃圾收集器会给存储在内存中的变量全部打上标记,再去掉环境中的变量以及环境中被引用的变量,剩下的就是需要被清除的变量,因为他不再被环境使用,清除这些变量并释放其被使用的内存。
6、引用计数:标记一个值被引用的次数,当声明一个变量并将一个引用类型赋值给该变量的时候,这个值就加一,当被这个引用类型赋值的变量又被另一个值赋值的时候,这个引用类型就减一,当这个值的引用类型为0的时候就是需要被回收了,这样就释放内存。
这种方式IE常用,但是会存在循环引用,内存无法释放的问题。
var a = document.getElementById("aID");
var b = {};
b.property=a;
a.property=b;
改变:手动切断循环引用
a.property=null;
b.property=null;