JS类库Bindows1.3中的内存释放方式分析


Posted in Javascript onMarch 08, 2007

我在前段时间介绍过IE中JavaScript脚本Memory Leak的问题,后来在几位热心网友的讨论下,基本认可了内存泄露的事实和原理。在小规模的测试case下,本来都达到了基本避免IE中脚本的ML问题。可是近来发现只以"仔细"来防止IE中脚本ML似乎是非常困难的一件事情,难道开始的讨论有错误吗?

    何谓"仔细"呢?就是说在有对象相互引用的时候,在对象丢弃时(不一定是页面refresh)断开彼此的引用链,特别是脚本中创建的对象和DHTML中的对象间的引用;清除HTML元素中的所有自定义属性;清除所有HTML元素中的事件处理函数回调;对数组在废弃时尽力delete掉内部元素。

    最重要的就是,尽量不创建冗余的脚本对象和DHTML元素对象,能通过修改属性来达到的效果,即使麻烦一些也不重新生成新的对象。

    通过上面的步骤后,IE的内存使用增长率有所下降。可是仍然不能完全满足对复杂的脚本运行的支持(接近Bindows这种复杂程度),体现在以下几点:
    一、在脚本执行过程中,内存使用量仍然是个只增不减的过程;
    二、使用最小化IE窗口方式强制IE进行GC,只能GC物理内存,对虚拟内存无效;
    三、页面跳离(URL改变)原脚本执行域,内存释放量太少甚至不释放;
    四、必须关闭IEXPLORE.EXE进程(即所有IE窗口),才能完全释放IE所使用的内存。

    今天突然想起来久违的Bindows,跑去一看,2月底release了一个1.3版本,于是开始运行主页上面给的demo。效果不用说了,自己去看一下就行了,效率也相当的高。demo里还有一个类似多维数据显示的GRID,居然还支持行和列的表头都固定。炫已经是bindows亘古不变的特点了,在还没有被迷昏前,我想起应该看看Bindows对内存的处理怎么样?真是不看不知道,一看吓一跳!

    打开www.bindows.net,我的IE内存使用量在(28PM+18VM)M左右,打开它的demo program。内存上到(38PM+35VM)M左右,然后再操作了几下,内存到了(80PM+75VM)M左右。于是关掉demo窗口,IE释放了大概15M左右内存,就停在(70PM+70VM)M的水平,在改变当前IE的URL,跳到了google,IE的内存使用量似乎还是没有减少@_@。哈哈,Bindows也有Memory Leak~。真是小人得志,555... 过了一段短时间再看,IE的内存使用降到和开启IE时差不多了:)。真实好消息,看来不能再冤枉IE了,于是开始跟踪Bindows在onunload时的处理代码。

    怎么能一下就跳到onunload的代码里去呢?这里有个hack,先对IE按下Alt+V,u,b(需要uncheck IE options高级中的"禁止脚本调试",菜单View里才有U快捷键选项)。然后立即关闭Bindows的演示dome窗口,选择VS.NET 2003作为Script调试器,就直接跳到onunload的入口处了。

    在管理IE中的脚本内存使用中,Bindows做的很非常周到的。复杂对象都实现了完备的dispose方法,用来作什么呢?在被调用时,首先切断DHTML对象实例和脚本对象实例的引用链;清除全局cache变量中的数据,使用delete关键字;使用attachEvent方式导入的事件处理函数,需要detach;其它事件处理回调,使用赋null的方式清空;切断脚本对象之间的parent或child关系引用链。

    这里有点使人迷惑的是,IE的GC的触发是不确定的(目前知道的确定触发就是最小化IE窗口),就是你做好了上述工作,在你的页面刚onload时,内存也是不会立即释放的。不过一段时间使用后,IE使用的内存会减少。所以就不用怀疑先前讨论的方法了,并且除了"切断脚本对象之间的parent或child关系引用链"这一点外,Bindows的dispose的原理和处理方法我前面讨论基本一致。

    注:PM物理内存,VM虚拟内存。都可以在任务管理器中查看。

Javascript 相关文章推荐
验证javascript中Object和Function的关系的三段简单代码
Jun 27 Javascript
HTML5附件拖拽上传drop & google.gears实现代码
Apr 28 Javascript
JSONP 跨域共享信息
Aug 16 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
May 17 Javascript
详解webpack和webpack-simple中如何引入css文件
Jun 28 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
Jul 03 Javascript
vue绑定设置属性的多种方式(5)
Aug 16 Javascript
微信小程序 数据绑定及运算的简单实例
Sep 20 Javascript
微信小程序排坑指南详解
May 23 Javascript
vue+axios新手实践实现登陆的示例代码
Jun 06 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
京东优选小程序的实现代码示例
Feb 25 Javascript
使用IE的地址栏来辅助调试Web页脚本
Mar 08 #Javascript
JScript中的undefined和"undefined"的区别
Mar 08 #Javascript
JavaScript语句可以不以;结尾的烦恼
Mar 08 #Javascript
JScript中的"this"关键字使用方式补充材料
Mar 08 #Javascript
function, new function, new Function之间的区别
Mar 08 #Javascript
JavaScript中this关键字使用方法详解
Mar 08 #Javascript
区分JS中的undefined,null,"",0和false
Mar 08 #Javascript
You might like
针对初学PHP者的疑难问答(1)
2006/10/09 PHP
php header Content-Type类型小结
2011/07/03 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
python实现的jpg格式图片修复代码
2015/04/21 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
python模糊图片过滤的方法
2018/12/14 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
Python之指数与E记法的区别详解
2019/11/21 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
优秀乡村医生事迹材料
2014/05/28 职场文书
行政管理专业求职信
2014/07/06 职场文书
详解Laravel制作API接口
2021/05/31 PHP
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL