简单三步,搞掂内存泄漏


Posted in Javascript onMarch 10, 2007
原文地址:http://www.jackslocum.com/blog/2006/10/02/3-easy-steps-to-avoid-javascript-memory-leaks/
你可能还未知道,你浏览的大多数的js网站,会引起 内存泄漏。听起来有点夸张,但这是事实,难道我会骗你吗?
泄漏监视器
Leak Monitor
 这是个方便的FireFox扩展,当你离开那页的时候它便会指向JavsScript对象,如果出现泄漏的话会弹出一个窗口显示细节内容,而且能够告诉你是那个对象或函数引起的泄漏。
离开http://script.aculo.us/的时候
这应该我是最常见的泄漏  prototype.js, line 74:3
 
简单三步,搞掂内存泄漏
The Dojo Mail 例子页面
严重的泄漏,一下子弹出两个窗口 (注意滚动条!)。
简单三步,搞掂内存泄漏
Word Press
这个更离谱。我每次写完Word press,就会出现!
简单三步,搞掂内存泄漏

访问一般的站点,你会发现大多数站点都会出现这类问题。的确,如果一些网站没有经过这样的测试,多少会让人感到震惊,--本来适当一下的修改就可以确保这种问题不会发生。
 虽然这网站(Jack'sBlog、范例)统统都是JavaScript的,但你不必担心任何泄漏的危险。


如下简单的三步:
       1. 当你完成后,设置你的 XMLHttpRequest onreadystatechange handlers 为null,
我使用 YAHOO.util.Connect 来进行XHR链接 ,因为它使用了 polling mechanism来代替readstate, 这样我不用手工set null了。我推荐你,在允许的情况下,使用YAHOO.util.Connect (或建于其之上的 YAHOO.ext.UpdateManager)。
      2. 在unload事件中清除所有 DOM event handlers object ,如果它们有引用 (Refence)的机会的话。
能够让Library做的,就不要用自己的方法做! 对于事件event的机制,我均使用了YAHOO.util.Event来处理. 其它的library (prototype, dojo, etc) 亦有自己的相应的机制来处理。 --尽管我不清楚它们的执行效率去到那里。 如果你再仔细看看上面的截图,你会发现上面的泄漏代码都会关联到这些library里面去(用事实证明事故的源头,Frank注)
      3.除了一些基本类型的数据primitive value (String 、Number),切勿放其它任何东西在 DOM expando 或 property 。当然,你能保证及时清除它的话,便是一个例外。
       这就是最重要的金科玉律了。在DOM expando放东西,你会觉得很方便, 然后用 $()获取它, 但千万不要这样做。 真的,我知道你在想什么,现在的我已经有线想妄想症的认了.没错,很多场合都会把JS对象放到 DOM expando,也没啥状况发生,但也会有很多。。。。这种情况不容易检查出来啊!(例如:闭包closures). 所以要避免任何可能的发生,我只会按照这样的规律做.
摘要

解决这个问题并不是太难。它不需要任何技巧或经验之谈。只要注意好以上几点,一个新手novice也知道如何避免泄漏。
请拜托一些大网站(包括新的 Yahoo Mail!?!?),花点时间,做足功夫,让我(或其他人)浏览你的网页而不遭受内存泄漏。

Javascript 相关文章推荐
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 Javascript
jQuery函数的等价原生函数代码示例
May 27 Javascript
js 中将多个逗号替换为一个逗号的代码
Jun 07 Javascript
学习JavaScript设计模式之单例模式
Jan 19 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
Oct 25 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
Dec 05 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
Mar 03 Javascript
node跨域请求方法小结
Aug 25 Javascript
JQuery选中select组件被选中的值方法
Mar 08 jQuery
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
Jan 16 Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 Javascript
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
如何简单地用YUI做JavaScript动画
Mar 10 #Javascript
可缩放Reloaded-一个针对可缩放元素的复用组件
Mar 10 #Javascript
为Yahoo! UI Extensions Grid增加内置的可编辑器
Mar 10 #Javascript
Gird事件机制初级读本
Mar 10 #Javascript
Gird组件 Part-3:范例RSSFeed Viewer
Mar 10 #Javascript
对YUI扩展的Gird组件 Part-2
Mar 10 #Javascript
对YUI扩展的Gird组件 Part-1
Mar 10 #Javascript
You might like
如何使用PHP计算上一个月的今天
2013/05/23 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
javascript实现画板功能
2020/04/12 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
python应用文件读取与登录注册功能
2019/09/23 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
军训教官感言
2014/03/02 职场文书
上课不认真检讨书
2014/09/17 职场文书
个人作风建设自查报告
2014/10/22 职场文书
2016年教师节感言
2015/12/09 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
MySQL里面的子查询的基本使用
2021/08/02 MySQL
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL
python实现手机推送 代码也就10行左右
2022/04/12 Python
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js