> 文章列表 > JS 的垃圾回收机制

JS 的垃圾回收机制

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清空或删除时,绑定的事件未清除

循环引用带来的内存泄露(引用计数)