`
zhou2324
  • 浏览: 17449 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JSCRIPT 内存泄露

阅读更多
声明:由于本人水平有限,请各位见谅,如果有任何疑问请参阅原文,hrft:http://javascript.crockford.com/memory/leak.html
author:Douglas Crockford


当一个系统不能正确的管理它的内存分配,就称之为内存泄露,这是一种BUG,其症状包括执行效率的降低和程序运行失败。
IE包含大量的泄露,最坏的一种发生在与JSCRIPT的交互过程中。当一个DOM对象包含了一个指向JS对象的引用(例如一个事件处理函数),而该JS对象也同时包含该DOM对象的引用时,一个循环结构形成了,在JS里这并不是一个问题,在这种情况下如果没有其他的引用指向这个DOM对象和事件处理句柄,垃圾回收器(一种自动管理内存的装置)将回收他们。而不幸的是,当一个死循环发生时,内存回收就不会发生了,因此发生内存泄露,随着时间的推移,内存被耗尽,内存空间充满正在使用的CELL时,浏览器就就挂起了。

我们可以举个例子,在一个程序(queuetest1)中,我们不停的创建10000个DOM元素,与此同时,删除掉除了最近创建的10个元素外的所有元素,当你打开任务管理器查看时,你将会看到PF(page file,即页面文件)的使用率任然保持在一个几乎恒定的水平上。PF使用率的改变可以作为内存分配无效的标志(原文:Changes on PF Usage can be an indicator of memory allocation inefficiency.)。

随后,我们运行第二个程序,queuetest2,它和第一个程序做的事情几乎相同,但不同的是他为每个元素增加了一个单击事件的处理器(click handler),在Mozilla和Opera中,PF使用率几乎保持不变,而在IE中,我们可以看到因为内存的泄露而引起的PF使用率以MB/S的速度稳步增长,通常情况下这种内存泄露经常被忽视。但是随着AJAX技术变得越来越流行,造成一张页面在浏览器中停留的时间也就越长,这种情况下对同一张页面操作的增加,就更有可能造成失败。

因为IE在回收循环上的失败,这幅担子不可避免的落到了我们头上,如果我们显式的破坏循环,IE就可以成功的回收内存了。但是根据Microsoft官方的观点,闭包(closure)是引起内存泄露(memory leaks)的元凶,这当然是极端错误的观点。由此看来,在有关如何处理微软BUG方面,微软提供了非常坏的建议。事实证明了我们可以很容易的在DOM这一边上破坏循环,从而解决问题,而不大可能在JSCRIPT的那一端把死循环破坏掉。

因此,可以这样来解决上述问题:
我们在完成一个元素的操作后,必须将元素的事件处理器置空以便退出可能存在的死循环,我们可以将元素的事件处理器属性赋值为NULL来解决这个问题。这可以作为一个规范来完成,或者我们写一个通用的purge函数来完成这一任务。

purge函数可以接受一个DOM元素作为它的参数。它对元素的各个属性进行循环比较,将任何值为函数的属性置为null,这样就退出了可能存在的死循环,允许占用的资源被回收。purge函数也将检查元素的后代元素,并同样破坏它们所有可能的死循环。当然,专门为IE浏览器处理内存回收BUG而定制的purge函数运行在Mozilla和Opera上是无害的。要注意的是,应当在移除元素、移除子元素,和设定该元素的innerHTML之前调用purge函数。

下面给出purge函数的代码:
function purge(d) {
   var a = d.attributes, i, l, n; 
   if (a) {      
      l = a.length;       
      for (i = 0; i < l; i += 1) {           
         n = a[i].name;           
         if (typeof d[n] === 'function') {               
         d[n] = null;           
         }       
      }   
   }   
   a = d.childNodes;   
   if (a) {       
      l = a.length;       
         for (i = 0; i < l; i += 1) {           
            purge(d.childNodes[i]);       
         }   
   }
}

我们在IE上运行第三个程序queuetest3,在queuetest3中,移除DOM元素之前purge函数将会被调用。
----------------------------------------------------------------------------------------------------
update:微软宣称已经修复了这个代号为929874的问题,如果你确信你所有的用户都对微软的这个BUG修复感到满意,那么你可以不在你的程序中调用purge函数。而不幸的是,至今我们还不能作出定论,所以建议在IE6上的程序中仍然使用purge函数。

这就是web的特点,修补一个bug并不一定代表bug就再也不会存在。
分享到:
评论
3 楼 zhou2324 2008-07-04  
呵呵,附上作者的介绍:
Douglas Crockford,目前正在Yahoo任职的架构师,同时也是JSON数据交换格式的创世人。他曾在Atari公司开发了办公自动化系统,同时也完成了对于游戏和音乐的研究;曾作为Lucasfilm电影公司技术总监;在Paramount公司任职过新媒体执行主管;通常为人所知的是 communities.com的创始人兼首席执行管;他还创办了State软件公司并作为该公司CTO,这也是他发现JSON时所在的地方;他同时也对 Blissymbolics非常感兴趣,这是一种图形、象征性的语言。
2 楼 bbs 2008-07-04  
看到作者是Douglas Crockford的时候 就不太想看了
看完之后 发现果然是一篇没营养的东西
原来他的解决方案就是离开页面时purge一下
1 楼 zhou2324 2008-07-04  
最近工作太忙,也没怎么对文字润色,翻译得不好,请各位拍砖。

相关推荐

    JScript.chm JScript帮助

    JScript.rar JScript.chm JScript帮助 JScript.rar JScript.chm JScript帮助 JScript.rar JScript.chm JScript帮助 JScript.rar JScript.chm JScript帮助

    JScript中文帮助文档.zip

    欢迎使用 JScript 语言参考 这些方便实用的信息将帮助您了解 JScript 的各个部分。 在“字母顺序的关键字列表”中,可以找到按字母顺序列出的所有 JScript 语言的主题。如果只需要查看某个主题(例如对象),则有对...

    JScript中文参考手册

    使用 JScript JScript 是一种解释型的、基于对象的脚本语言。尽管与 C++ 这样成熟的面向对象的语言相比,JScript 的功能要弱一些,但对于它的预期用途而言,JScript 的功能已经足够大了。 JScript 不是其他语言的...

    JScript 语言参考

    这些方便实用的信息将帮助您了解 JScript 的各个部分。 在“字母序关键字”列表中您将找到按字母序列出的所有的 JScript 语言的各个部分。不过,如果只想查看某个类别,例如对象,每个语言类别都有其自己更简洁...

    JScript 中文语言参考

    JScript 中文语言参考 《JScript 中文语言参考》将帮助您了解 JScript 的各个部分。 在“字母顺序的关键字列表”中,可以找到按字母顺序列出的所有 JScript 语言的主题。如果只需要查看某个主题(例如对象),则有...

    Jscript及Html中文API

    Jscript及Html中文API

    jscript语言参考手册chm

    JScript 基础 什么是 Jscript? 编写 JScript 代码 JScript 变量 JScript 数据类型 JScript 运算符 运算符优先级 控制程序流 条件编译 条件编译变量 JScript 函数 JScript 对象 固有对象 创建自己的对象...

    JScript中文帮助文档

    JScript中文帮助文档JScript中文帮助.CHM

    JScript 8.0 中文手册

    JScript 8.0 是一种有着广泛应用的现代脚本语言。它是一种真正面向对象的语言,不过仍保留其“脚本”特色。JScript 8.0 保持与 JScript 以前版本的完全向后兼容性,同时包含了强大的新功能并提供了对公共语言运行库...

    jscript.net程序开发

    jscript.net程序开发jscript.net程序开发jscript.net程序开发

    jscript 手册

    jscript 手册

    JScript例子.chm

    JScript例子.chm JScript例子.chm JScript例子.chm JScript例子.chm JScript例子.chm

    JScript8.0中文参考手册.chm

    介绍开发人员用来编写 JScript 代码的元素和过程,并提供链接,指向阐释语言元素和代码语法的详细背景信息的特定区域。(chm无法显示内容时需在属性中“解除锁定”)

    Jscript精彩代码

    Jscript精彩代码Jscript精彩代码Jscript精彩代码Jscript精彩代码Jscript精彩代码Jscript精彩代码Jscript精彩代码Jscript精彩代码Jscript精彩代码

    Microsoft.JScript(引用)

    Microsoft.JScript(引用),Microsoft.JScript(引用),Microsoft.JScript(引用)

    微软《JScript 语言参考》中文

    微软《JScript 语言参考》中文 目录: JScript用户指南 JScript错误 JScript函数 JScript方法 JScript对象 JScript运算符 JScript属性 JScript语句 FileSystemObject用户指南 Scripting运行时库参考 正则表达式简介

    jscript文档 jscript文档 jscript文档

    jscript文档 jscript文档 jjscript文档 jscript文档 jscript文档script文档

    JScript中文参考资料集合

    JScript中文参考资料 含有JScript中文参考教程、资料、帮助信息

    jscript 500个例子

    500个例子jscript ,初学js的实用工具书

    JScript api

    不错的JScript文档 不错的JScript参考资料 不错的JScript参考文档资料

Global site tag (gtag.js) - Google Analytics