JS 的垃圾回收机制
JS 的垃圾回收机制 (GC(garbage collection))
Js具有自动垃圾回收机制,垃圾收集器会按照固定的时间间隔周期性的执行。
缺点
GC 执行时,中断代码,停止其他操作,然后遍历所有对象,对于不可访问的对象进行回收。
2种最为常用:标记清除和引用计数,其中标记清除更为常用。
标记清除(mark and sweep)
这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,
垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),剩下标记的就是要删除的变量了
引用计数(reference counting)
简化定义为有没有其他对象引用到它。如果没有引用指向该对象,那么该对象会被垃圾回收机制回收。限制:无法回收循环引用。
当声明了一个变量并将一个引用类型赋值给该变量的时候,这个值的引用次数就加1;
如果同一个值又被赋给另一个变量,那么引用数加 1;
如果保存对该值引用的变量被其他值给覆盖了,那么引用数减 1;
当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的
空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。
循环引用会导致引用数永远不会变成 0。
function problem() {let objectA = new Object();let objectB = new Object();objectA.someOtherObject = objectB;objectB.anotherObject = objectA;
}
在V8 引擎中使用两种优化方法(垃圾回收机制一些优化)
详解参考
分代回收(Generation GC):与Java回收策略思想是一致的。目的是通过区分“临时”与“持久”对象;多回收“临时对象”区(young generation),少回收“持久对象”区(tenured generation),减少每次需遍历的对象,从而减少每次GC的耗时。
增量GC:引擎将垃圾收集工作分成更小的块,每次处理一部分,多次处理。这样就解决了长时间停顿的问题。
什么会导致内存泄漏
意外的全局变量
定时器设置了,没有清除
闭包引起的内存泄露:慎用闭包
dom清空或删除时,绑定的事件未清除
循环引用带来的内存泄露(引用计数)