内存泄漏
不再使用到的内存,没有及时释放,就是内存泄露
所以为了避免手动的释放内存,就有了垃圾请除机制
代码回收规则如下:
1.全局变量不会被回收。
2.局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。
3.只要被另外一个作用域所引用就不会被回收 (闭包中引用的变量不会被回收)
垃圾回收的方法
1,标记清除
垃圾回收器会给在内存中的变量都做上标记,然后它会去除在环境中的变量和被环境中变量引用的变量(闭包)的标记,在这之后的被标记的变量就是需要清除的变量了。之后垃圾回收器将会回收这些变量所占的内存了
2,引用计数
引用计数就是追踪每个值被引用的次数,当引用计数为0时,就会回收他所占用的内存。
使用引用计数会有一点小问题
就是在循环引用的对象时,这些对象的引用计数永远都不可能是1,所以回收不了这些对象,就会有内存泄漏
循环引用的对象使用 JSON.stringify 为什么会报错?
对象相互引用,JSON.tostringify 无法将一个无限引用的对象序列化为 JOSN 字符串。
针对这种问题的一种解决方案是去除这种循环引用
例如:
var c = JSON.decycle(a)
这样就去除了a对象的循环引用,如果想恢复原本的循环引用对象a,可以调用retrocycle方法
var a = JSON.retrocycle(a)