JavaScript 是一种垃圾网络式说话,这就是说,内存是按照工具的建设分派给该工具的,并会在没有对该工具的引用时由赏识器收回。JavaScript 的垃圾网络机制自己并没有题目,但赏识器在为 DOM 工具分派和规复内存的方法上却有些进出。 Internet Explorer 和 Mozilla Firefox 均行使引用计数来为 DOM 工具处理赏罚内存。在引用计数体系,每个所引用的工具城市保存一个计数,以获悉有几多工具正在引用它。假如计数为零,该工具就会被烧毁,其占用的内存也会返回 给堆。固然这种办理方案总的来说还算有用,但在轮回引用方面却存在一些盲点。
内存泄漏的模式或许有以下几种:
1.轮回引用导致了内存走漏,JavaScript 工具 obj 拥有到 DOM 工具的引用,暗示为 DivElement。而 DOM 工具则有到此 JavaScript 工具的引用,由 expandoProperty 暗示。可见,JavaScript 工具和 DOM 工具间就发生了一个轮回引用。因为 DOM 工具是通过引用计数打点的,以是两个工具将都不能烧毁。 obj=document.getElementById(”DivElement”); document.getElementById(”DivElement”).expandoProperty=obj; obj.bigString=new Array(1000).join(new Array(2000).join(”XXXXX”)); 2.由外部函数挪用引起的内存走漏,通过挪用外部函数 myFunction 建设轮回引用。同样,JavaScript 工具和 DOM 工具间的轮回引用也会导致内存走漏。 function myFunction(element) { this.elementReference = element; // This code forms a circular reference here //by DOM–>JS–>DOM element.expandoProperty = this; } function Leak() { //This code will leak new myFunction(document.getElementById(”myDiv”)); } 3.Javascript闭包引起的内存走漏,闭包成果很是强盛,缘故起因是它们使内部函数在外部函数返回时也如故可以保存对另外部函数的变量的会见。不幸的是,闭包很是易于潜匿 JavaScript 工具 和 DOM 工具间的轮回引用。 function closureDemoParentFunction(paramA) { var a = paramA; return function closureDemoInnerFunction (paramB) { alert( a +” “+ paramB); }; }; var x = closureDemoParentFunction(”outer x”); x(”inner x”);
Javascript内存走漏器材:
1.Drip/sIEve
2. Javascript Leaks Detector
3. Leak Monitor
相识更多请阅读: http://www.ibm.com/developerworks/cn/web/wa-memleak/ http://djjchobits.javaeye.com/blog/375465
来历:http://adamlu.com/?p=418 (编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|