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 相关文章推荐
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
Feb 14 Javascript
Jquery Ajax请求代码(2)
Jan 07 Javascript
javascript 快速排序函数代码
May 30 Javascript
jQuery中wrapAll()方法用法实例
Jan 16 Javascript
jQuery实现数秒后自动提交form的方法
Mar 05 Javascript
jQuery切换所有复选框选中状态的方法
Jul 02 Javascript
Javascript从数组中随机取出不同元素的两种方法
Sep 22 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 Javascript
vue自定义指令之面板拖拽的实现
Apr 14 Javascript
Bootstrap实现省市区三级联动(亲测可用)
Jul 26 Javascript
webpack5 联邦模块介绍详解
Jul 08 Javascript
深入理解 ES6中的 Reflect用法
Jul 18 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
Windows下安装Memcached的步骤说明
2010/04/25 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
通用无限极下拉菜单的实现代码
2016/05/31 Javascript
js 颜色选择插件
2017/01/23 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
python中input()与raw_input()的区别分析
2016/02/27 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
生物科学专业个人求职信范文
2013/12/07 职场文书
应届行政管理专业个人自我评价
2013/12/28 职场文书
高一物理教学反思
2014/01/24 职场文书
大一新生学期自我评价
2014/04/09 职场文书
卖房授权委托书样本
2014/10/05 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python