常规循环引用内存泄漏和Closure内存泄漏
常規循環引用內存泄漏和Closure內存泄漏
要了解javascript的內存泄漏問題,首先要了解的就是javascript的GC原理。
我記得原來在犀牛書《JavaScript: The Definitive Guide》中看到過,IE使用的GC算法是計數器,因此只碰到循環 引用就會造成memory leakage。后來一直覺得和觀察到的現象很不一致,直到看到Eric的文章,才明白犀牛書的說法沒有說得很明確,估計該書成文后IE升級過算法吧。在IE 6中,對于javascript object內部,jscript使用的是mark-and-sweep算法,而對于javascript object與外部object(包括native object和vbscript object等等)的引用時,IE 6使用的才是計數器的算法。
Eric Lippert在http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx一文中提到IE 6中JScript的GC算法使用的是nongeneration mark-and-sweep。對于javascript對算法的實現缺陷,文章如是說:
"The benefits of this approach are numerous, but the principle benefit is that circular references are not leaked unless the circular reference involves an object not owned by JScript. "
也就是說,IE 6對于純粹的Script Objects間的Circular References是可以正確處理的,可惜它處理不了的是JScript與Native Object(例如Dom、ActiveX Object)之間的Circular References。
所以,當我們出現Native對象(例如Dom、ActiveX Object)與Javascript對象間的循環引用時,內存泄露的問題就出現了。當然,這個bug在IE 7中已經被修復了[http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html]。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp 中有個示意圖和簡單的例子體現了這個問題:
總結
以上是生活随笔為你收集整理的常规循环引用内存泄漏和Closure内存泄漏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给大家一个网站程序,fastmai网站源
- 下一篇: 经典问题:向setTimeout传递函数