垃圾回收机制(GC:Garbage Collection)与内存泄露
JS中有自动垃圾收集机制,执行环境会负责管理代码执行过程中的内存。
机制原理是: 找出不再使用的变量,释放它所占用的内存。垃圾收集器会按固定的时间间隔(代码中预定的收集时间)**周期性**地执行这一操作。
-
标记清除
- 当变量进入环境(在函数中声明一个变量), 将这个变量标记为
“进入环境”
。当变量离开环境时,将其标为“离开环境”
。 - 可以使用
任何方式去标记变量
。可以用一个“进入环境”的变量列表或者一个“离开环境”的变量列表来跟踪变量的变化。但关键在于如何标记。 - 在运行的时候,将存储在内存中的所有变量加上标记。去掉环境中的变量以及被变量引入的变量的标记。这样以后,还有标记的变量就是要清除的变量。
- 也就是作用域中的执行上下文对象。例如函数中的变量,预解析时变量进入。函数执行完了,对象出栈,标记为离开环境,等待清除。
- 当变量进入环境(在函数中声明一个变量), 将这个变量标记为
-
引用计数(只是知道,内部实现还是不了解)
- 含义就是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,该值的引用次数为1。 如果同一个值又被赋给另一个变量, 则该值的引用次数加1.
- 相反,如果包含这个值引用的变量又取到另一个值,则这个值的引用次数减1 .当这个值引用次数为0, 就会释放它所占的内存。
- 问题:循环引用
function problem(){ var objectA = new Object(); var objectB = new Object(); objectA.someOtherObject = objectB; objectB.anotherObject = objectA; //通过各自的属性,相互引用。这两个对象的引用次数都是2. }
-
内存泄漏
- 因为不是所有无用对象内存都可以被回收的,那当不再用到的对象内存,没有及时被回收时,我们叫它
内存泄漏(Memory leak).
- 不正当的使用闭包可能会造成内存泄漏。
更多内存泄漏function f() { var num = 1; return function() { return num; } } var f = f(); console.log(f()); //需要手动清除 f = null .否则会造成内存泄漏
- 因为不是所有无用对象内存都可以被回收的,那当不再用到的对象内存,没有及时被回收时,我们叫它