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 相关文章推荐
一个不错的应用,用于提交获取文章内容,不推荐用
Mar 03 Javascript
function foo的原型与prototype属性解惑
Nov 19 Javascript
jQuery on()绑定动态元素出现的问题小结
Feb 19 Javascript
underscore之Collections_动力节点Java学院整理
Jul 10 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
jQuery中的类名选择器(.class)用法简单示例
May 14 jQuery
JS实现的tab页切换效果完整示例
Dec 18 Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
js字符串处理之绝妙的代码
Apr 05 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
Nov 07 Javascript
vue3获取当前路由地址
Feb 18 Vue.js
动态规划之使用备忘录来改进Javascript函数
Apr 07 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
Codeigniter的dom类用法实例
2015/06/26 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
python海龟绘图实例教程
2014/07/24 Python
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
python生成器表达式和列表解析
2016/03/10 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
keras K.function获取某层的输出操作
2020/06/29 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
如何实现jdbc性能优化
2012/07/30 面试题
感恩节红领巾广播稿
2014/02/11 职场文书
数学国培研修感言
2014/02/13 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
优质护理心得体会
2016/01/22 职场文书