Javascript中的循环引用/垃圾收集器
Circular references in Javascript / Garbage collector
谁能详细解释一下Javascript引擎是如何处理循环引用的?浏览器和node.js之间有很大的区别吗?
我说的是对象内显式的back/next引用。例如:
var objA = {
prop: "foo",
next: null
};
var objB = {
prop: "foo",
prev: null
};
objA.next = objB;
objB.prev = objA;
好了。如果我们做console.log( objA )
我们可以看到我们创造了一个无限链。最大的问题是,这很糟糕吗?如果没有显式清理,它是否会产生内存泄漏?
所以我们必须
objA.next = null;
objB.prev = null;
或者垃圾收集器会在这样的星座上照顾我们吗?
任何像样的垃圾收集器都可以处理循环。
循环只有在进行朴素引用计数时才会出现问题。
大多数垃圾收集器不进行refcount(因为它不能处理循环,而且效率低下)。相反,它们只是遵循它们能找到的每个引用,从"根"(通常是全局变量和基于堆栈的变量)开始,并将它们能找到的所有引用标记为"可达"。
然后它们简单地回收所有其他内存。
循环不是问题,因为它们只是意味着同一节点将被多次到达。在第一次之后,该节点将被标记为"可达",因此GC将知道它已经存在,并跳过该节点。
更原始的基于引用计数的GC通常实现检测和中断循环的算法。
简而言之,这不是你需要担心的事情。我似乎记得IE6的Javascript GC实际上无法处理周期(我可能错了,自从我读过它已经有一段时间了,自从我接触IE6以来已经很久了),但在任何现代实现中,这都不是问题。垃圾收集器的全部意义在于抽象内存管理。如果你必须自己做这些工作,你的GC就坏了。
请参阅MDN以获取有关现代垃圾收集和所使用的标记-清除算法的更多信息。
相关文章:
- 信任Javascript垃圾收集器
- Chrome扩展:链接收集器
- AngularJS-由$scope创建的作用域何时执行$new()已删除.垃圾收集器或Angular负责处理它吗
- underscore.js,迭代器引用错误
- 是在window.location重定向后调用的垃圾收集器
- 在 JavaScript 上添加/删除侦听器(垃圾收集器)
- jscript 垃圾收集器的速度有多快?三.js矩阵旋转
- Undersatnding JavaScript 不可变变量和垃圾收集器
- GSAP 补间/补间最大垃圾收集、引用和性能
- 有没有办法在基于 webkit 的浏览器中强制使用 Javascript 垃圾收集器
- spidermonkey上的垃圾收集器问题..JS_AnchorPtr()
- JIRA问题收集器
- javascript垃圾收集器处理全局变量吗?
- Javascript -垃圾收集器计时器
- 内部引用对象上的Javascript垃圾收集器
- 我需要删除dom碎片或将垃圾收集器删除它们
- Javascript中的循环引用/垃圾收集器
- 如何通过侦听器引用数组中的当前dom元素来更改活动
- 如何帮助ie的有缺陷的垃圾收集器
- JS垃圾收集器是否清除堆栈内存?