最近我在研究IE的内存泄漏.下面写一下我的一些看法,以及疑惑.Justin Rogers在http://msdn2.microsoft.com/enus/library/Bb250448.aspx指出了ie内存泄漏的模式,几种模式归根到底都是环形引用(Circular References)引起的.我去网上搜了一下也都说循环引用会引起内存泄漏.我就想知道循环引用为什么可以引起ie的泄漏.我用sIEVe-0.08(http://home.wanadoo.nl/jsrosman/)测了一下,他的几个例子都没有显示泄漏(这很奇怪,我不明白原因,因为基本所有的人都知道循环引用会产生内存泄漏,不知道是不是工具不好).
    我在网上查了一些资料,Eric Lippert在http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx说了jscript的 garbage collector回收机制,jscript用的是nongenerational -and-sweep garbage collector回收机制能处理环形引用.Joel Webber 在他的DHTML Leaks Like a Sieve 中写到IE是使用引用计数(references count)来垃圾回收的.我总结了一下他们的观点,jscript是采用-and-sweep 算法是可以处理环形的引用,jscript对象的环形引用可以被回收,不会造成内存的泄漏.而jscript和dom是有不同的垃圾回收器来回收的,所以当在jscript的对象和dom的对象之间存在环形的引用就会造成内存的泄漏.如下图的情况(Justin Rogers的文章中).
图见http://msdn2.microsoft.com/en-us/library/bb250448.aspx的figure1    我认为他们的说法还不足以证明这种情况可以产生内存泄漏.Justin Rogers是这样阐述内存泄漏的原因的,The cause of the leak in this pattern is based on COM reference counting. The script engine objects will hold a reference to the DOM element and will be waiting for any outstanding references to be removed before cleaning up and releasing the DOM element pointer. In our case we have two references on the script engine object: the script engine scope, and the DOM element expando property. While terminating the script engine will release the first reference, the DOM element reference will never be released because it is waiting on the script engine object to release it! 我觉得这不足以产生内存泄漏.我觉得当脚本引擎终止,jscript scope 到object1的引用释放,这时候因为jscript采用的是-and-sweep ,而object1是不可达的,这个时候就可以release了,然后它所引用的span在reference等于1的时候就可以释放了.它的意思是span等待object1释放,而object1等待span释放.但是object1并不是采用引用技术的垃圾回收,它不需要等到引用为零,只要不可不可达(就是不到)就能release了.
不知道大家对这个问题怎么看.不知道是不是IE的很多内存泄漏只是IE实现上的bug,Justin Rogers也是在msdn中写的这篇文章不好明确指出.

解决方案 »

  1.   

    有没有这方面专家解释一些,网上好像所有的人都说循环引用会产生memory leak,但好像都没有说出原因
      

  2.   

    主要是事件...
    其他的你自己逐个测试就知道了...
    至于循环根本不会引起ml,反正 null 后可用的都可能引起ML,
      

  3.   

    Justin Rogers的几个ml的模式的测了,没有发现内存泄漏,
    为什么网上都说环行引用会成生内存泄漏了
      

  4.   

    这么一个问题居然没人讨论?http://www.cnblogs.com/birdshome/archive/2005/02/16/104967.html
    建议楼主看看