技术开发 频道

有关IE内存泄露和javascript垃圾回收


【IT168技术文档】

  昨天跟同事讨论问题时提起了内存泄露,想到了以前考scjp时碰到的垃圾回收的题目,觉得挺有意思,就去查了一些有关javascript垃圾回收的资料,贴出来跟大家分享一下。

  垃圾回收,简单的说就是收回某些无用对象所占用的内存以供重新使用,垃圾回收机制通常有一个优先级较低的线程来维护。在java里采用有向树的方式管理内存,那些从根节点出发不可达(unreachable)的对象即被认为是垃圾回收的目标,这种方式有效避免了循环引用的问题。而COM组件(DOM)和Javascript的垃圾回收机制都是基于引用计数(犀牛书上说javascript1.1是基于引用计数的,1.2应该也是),而且在IE里,Dom对象和Javascript对象的垃圾回收又是相互分离的,所以如果这两种对象出现了循环调用就会导致垃圾回收失效,内存泄露,这是IE内存泄露最常见的一种方式。

  一个循环引用导致内存泄露的例子:(原例见后面的参考文章:微软关于IE内存泄露的分析和解决方案)
<html> <head> <script language="JScript"> function Encapsulator(element) { // Set up our element this.elementReference = element; // Make our circular reference element.expandoProperty = this; } function SetupLeak() { // The leak happens all at once new Encapsulator(document.getElementById("LeakedDiv")); } function BreakLeak() { document.getElementById("LeakedDiv").expandoProperty = null; } </script> </head> <body onload="SetupLeak()" onunload="BreakLeak()"> <div id="LeakedDiv"></div> </body> </html
0
相关文章