关于的JavaScript垃圾接纳机制
JavaScript具有自动垃圾接纳机制,执行情形会认真打点代码执行进程中行使的内存。 垃圾网络器必需跟踪哪个变量有效,对付不再有效的变量打上标志,以备未来收回其占用的内存。用于标识无用变量的计策因实现而异,但详细到赏识器中的实现,凡是有两个计策。 1、标志破除 JavaScript中最常用的垃圾网络方法是标志破除(mark-and-sweep)。当变量进入情形时,就将这个变量标志为“进入情形”。从逻辑上讲,永久不能开释进入情形的变量所占用的内存,由于只要执行流进入响应的情形,就也许会用到它们。而当变量分开情形时,则将其标志为“分开情形”。 垃圾网络器在运行的时辰会给存储在内存中的全部变量都加上标志(虽然,可以行使任何标志方法)。然后,它会去掉情形中的变量以及被情形中的变量引用的变量的标志。而在此之后再被加上标志的变量将被视为筹备删除的变量,缘故起因是情形中的变量已经无法会见到这些变量了。最后,垃圾网络器完成内存破除事变,烧毁那些带标志的值并接纳他们所占用的内存空间。 2、引用计数 轮回引用:工具A中包括一个指向工具B的指针,而工具B中也包括一个指向工具A的引用。如下: function problem() {var objectA = new Object(); var objectB = new Object(); objectA.someOtherObject = objectB; objectB.anotherObject = objectA; } 在这个例子中,objectA 和 objectB 通过各自的属性彼此引用。也就是说,这两个工具的引用次数都是2.在回收标志破除计策的实现中,因为函数执行后,这两个工具都分开了浸染域,因此这种彼此引用不是个题目。但在回收引用计数计策的实现中,当函数执行完毕后,objectA 和 objectB 还将继承存在,因此它们的引用次数永久不会是 0。若是这个函数被一再多次引用,将会导致大量内存得不到接纳。 其它,IE中有一部门工具并不是原生 JavaScript 工具。譬喻,其BOM和DOM中的工具就是行使C++以COM(Component Object Model,组件工具模子)工具的情势实现的。而COM工具的垃圾网络机制回收的引用计数计策。因此纵然IE的JavaScript引擎是行使标志破除计策来实现的,但JavaScript会见的COM工具依然是基于引用计数计策的。 也就是说,只要在IE中涉及COM工具,就会存在轮回引用的题目。如下 var element = document.getElementById("some_element");var myObject = new Object(); myObject.element = element; element.someObject = myObject; 这个例子中,一个DOM元素与一个原生JavaScript工具之间建设了轮回引用。个中,变量myObject有一个名为element的属性指向element工具;反之亦然。因为存在这个轮回引用,纵然将例子中的DOM从页面中移除,它也永久不会被接纳。 为了停止相同这样的轮回引用题目,最好是在不行使它们的时辰手动断开原生 JavaScript工具与DOM元素之间的毗连。 myObject.element = null;element.someObject = null; (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |