- 浏览: 2623294 次
- 性别:
- 来自: 小胖儿的大城
文章分类
最新评论
-
ni4wangba0:
ni4wangba0 写道亲测,算法有问题。对不起,其实是我自 ...
谈谈"求线段交点"的几种算法(js实现,完整版) -
ni4wangba0:
亲测,算法有问题。
谈谈"求线段交点"的几种算法(js实现,完整版) -
kers007:
苹果不让Webapp 在appstore 里发布,我不知道对 ...
苹果真的要在 AppStore 里封杀 WebApp 吗? -
striveandlive:
fins = js大牛
[原创]GT-Template, 一个超轻量级的js模板工具. -
AlwaysYang:
基础扎实的才能行走天下。
关于body的"大小"在ie和ff下的一些基础知识
前几天讨论了一下 ext的 Destroy机制引起的内存问题 发现出现问题的核心点 是 element.removeAllListeners 方法. 相关讨论见:
Ext2.02事件机制缺陷分析,以及解决方案
http://fins.iteye.com/blog/173818
EXT的destroy方法是不是存在漏洞?
http://fins.iteye.com/blog/173218
测试使用工具见
http://fins.iteye.com/blog/172891
解决这一问题后我们可以发现, 依然存在内存无法释放的问题.
分析后得出ext的又一个重大缺陷
还是拿一个最最简单的window做例子
一个干净的页面, 生成上面那个窗口,然后再关闭, 用sIEve查看, 会发现存在很多无法被释放的 ext生成的孤立节点
大家可以注意看一下那些节点的 class ,可以发现如下两个(还有更多,我只是拿他们举例子).
x-dlg-focus x-window-bwrap
也就是说,这两个节点没有被正确的销毁. 跟踪代码可以发现
这两个节点分别对应 window对象的
this.focusEl
this.bwrap
为什么没有被正确的删除呢? 继续跟踪 跟踪所有 window层次结构上的所有类的
destroy beforeDestroy onDestroy 方法
可以看到 ,从来没有显示的调用过 消除他们的方法.
看来我们需要自己手动来销毁他们了.
于是可以修改 Window 的 beforeDestroy 方法:
测试后发现, 依然无法删除那两个节点. 不死心, 继续!!!
再修改
注意 由于 this.bwrap 是window从panel里继承来的, 所以this.bwrap其实应该通过修改panel的代码来消除
我在这里用偷懒的方式 是为了可以用尽量简短的代码来说明问题
再测试, ok 那两个节点没了!!
=================================
综上所述,我们可以得到如下结论:
Ext的作者为各个组件提供的 destroy方法存在严重缺陷.
缺少对一些元素必要的 销毁动作, 同时 没有对属性赋值为 null ,使得浏览器无法回收多余的节点.
页面越复杂 这个问题越严重.
解决办法只能是一个个组件看 看看哪些地方有遗漏 然后进行修补.能在基类中修补尽量修补.
同时 应该为组件增加 afterDestroy方法, 在里面对必要的属性进行赋值为null的操作.
Ext2.02事件机制缺陷分析,以及解决方案
http://fins.iteye.com/blog/173818
EXT的destroy方法是不是存在漏洞?
http://fins.iteye.com/blog/173218
测试使用工具见
http://fins.iteye.com/blog/172891
解决这一问题后我们可以发现, 依然存在内存无法释放的问题.
分析后得出ext的又一个重大缺陷
还是拿一个最最简单的window做例子
win=new Ext.Window({title:" 窗口 ", width:400, draggable : false, shadow : false, resizable : false, shim :false, autoDestroy : true, height:300});
一个干净的页面, 生成上面那个窗口,然后再关闭, 用sIEve查看, 会发现存在很多无法被释放的 ext生成的孤立节点
大家可以注意看一下那些节点的 class ,可以发现如下两个(还有更多,我只是拿他们举例子).
x-dlg-focus x-window-bwrap
也就是说,这两个节点没有被正确的销毁. 跟踪代码可以发现
这两个节点分别对应 window对象的
this.focusEl
this.bwrap
为什么没有被正确的删除呢? 继续跟踪 跟踪所有 window层次结构上的所有类的
destroy beforeDestroy onDestroy 方法
可以看到 ,从来没有显示的调用过 消除他们的方法.
看来我们需要自己手动来销毁他们了.
于是可以修改 Window 的 beforeDestroy 方法:
Ext.Window.prototype.beforeDestroy = function(){ Ext.destroy( this.focusEl, // 新增 this.bwrap, // 新增 this.resizer, this.dd, this.proxy, this.mask ); Ext.Window.superclass.beforeDestroy.call(this); }
测试后发现, 依然无法删除那两个节点. 不死心, 继续!!!
再修改
Ext.Window.prototype.beforeDestroy = function(){ Ext.destroy( this.focusEl, // 新增 this.bwrap, // 新增 this.resizer, this.dd, this.proxy, this.mask ); Ext.Window.superclass.beforeDestroy.call(this); this.focusEl=null; // 新增 this.bwrap=null; // 新增 }
注意 由于 this.bwrap 是window从panel里继承来的, 所以this.bwrap其实应该通过修改panel的代码来消除
我在这里用偷懒的方式 是为了可以用尽量简短的代码来说明问题
再测试, ok 那两个节点没了!!
=================================
综上所述,我们可以得到如下结论:
Ext的作者为各个组件提供的 destroy方法存在严重缺陷.
缺少对一些元素必要的 销毁动作, 同时 没有对属性赋值为 null ,使得浏览器无法回收多余的节点.
页面越复杂 这个问题越严重.
解决办法只能是一个个组件看 看看哪些地方有遗漏 然后进行修补.能在基类中修补尽量修补.
同时 应该为组件增加 afterDestroy方法, 在里面对必要的属性进行赋值为null的操作.
评论
18 楼
duanlei
2008-09-10
我用的是Ext 2.2
if(this.handleMouseEvents){
this.el.on("mouseover", this.onMouseOver, this);
this.el.on("mousedown", this.onMouseDown, this);
}
Ext.Button 里 注释掉这两个事件 就少几个孤立节点
不知道在销毁时 怎么才能删除这两个事件?
if(this.handleMouseEvents){
this.el.on("mouseover", this.onMouseOver, this);
this.el.on("mousedown", this.onMouseDown, this);
}
Ext.Button 里 注释掉这两个事件 就少几个孤立节点
不知道在销毁时 怎么才能删除这两个事件?
17 楼
fins
2008-09-05
主贴里写了
http://fins.iteye.com/blog/172891
http://fins.iteye.com/blog/172891
16 楼
duanlei
2008-09-05
我试了 是不行
不过还是不知道 怎么分析 孤立节点
不过还是不知道 怎么分析 孤立节点
15 楼
fins
2008-09-05
不能了
14 楼
duanlei
2008-09-05
问下 孤立节点
还能用 document.getElementById
吗?
还能用 document.getElementById
吗?
13 楼
shumadp.com
2008-07-17
messagebox弹出增加了很多dom,但关闭时内存和dom都毫无变化,打开一看,原来messagebox没有destroy函数。。。晕
12 楼
csf178
2008-04-29
ext已经够不错了
做到这程度不容易啊
做到这程度不容易啊
11 楼
felix920
2008-04-29
呵呵,谢谢楼上znjq.
我在整理这些组件的时候才发现你所说的这些问题.
想请教一下,你现在整理那些组件,能否提供一些资料.或者具体一点的解决方案.!
谢谢了!
我在整理这些组件的时候才发现你所说的这些问题.
想请教一下,你现在整理那些组件,能否提供一些资料.或者具体一点的解决方案.!
谢谢了!
10 楼
znjq
2008-04-29
你查看dom节点的引用数量,会发现很多孤立的节点,这部分节点是不会释放的。
而window本身的泄露又设计到很多其他的组件Element, EventManager,Panel等等,加个destroy方法仅仅是一个临时的处理方法,要根本解决这些泄露问题要fix掉其他组件的bug,window的那些节点是因为被引用而无法释放的.
Ext几乎每个组件在destroy的时候都有内存泄露问题.很多组件的dom在组件destroy根本就没释放绑定事件
举个最简单那的例子Ext.fly就有问题,如果一个组件被destroy掉,而Ext._flyweights还保留着一些dom的引用.
正好最近在做基于ext的opoa的框架,解决了一些组件的bug,等有时间整理一下
而window本身的泄露又设计到很多其他的组件Element, EventManager,Panel等等,加个destroy方法仅仅是一个临时的处理方法,要根本解决这些泄露问题要fix掉其他组件的bug,window的那些节点是因为被引用而无法释放的.
Ext几乎每个组件在destroy的时候都有内存泄露问题.很多组件的dom在组件destroy根本就没释放绑定事件
举个最简单那的例子Ext.fly就有问题,如果一个组件被destroy掉,而Ext._flyweights还保留着一些dom的引用.
正好最近在做基于ext的opoa的框架,解决了一些组件的bug,等有时间整理一下
9 楼
felix920
2008-04-28
恩,好的。谢谢了。
回头我来试试,不懂的地方在请教你。
回头我来试试,不懂的地方在请教你。
8 楼
fins
2008-04-28
哦 这个啊 可以重写 window的 destroy方法 删除那些没有被移除的节点
同时 重写 ext的时间注销机制
同时 重写 ext的时间注销机制
7 楼
felix920
2008-04-28
恩.好的.
多的我就不说了,因为我也是刚学习这东东,
目前的问题:
也是关于ext内存的问题.
我用你介绍的工具测试了一下我现在所做的项目的其中一个页面,并没有发现有内存泄露的节点.
但是我想怎样才能真正达到内存释放的效果呢?因为我现在产生一个window,关闭一个window的时候,内存还是会增加,但是工具里又没有显示有内存泄露的节点。按道理应该会释放掉window打开时所产生的内存啊。
而且我发现改不改基类似乎都没有什么区别,因为在用工具测试的时候两者都不会产生内存泄露节点。
我用的ext2.02。
请指教。
多的我就不说了,因为我也是刚学习这东东,
目前的问题:
也是关于ext内存的问题.
我用你介绍的工具测试了一下我现在所做的项目的其中一个页面,并没有发现有内存泄露的节点.
但是我想怎样才能真正达到内存释放的效果呢?因为我现在产生一个window,关闭一个window的时候,内存还是会增加,但是工具里又没有显示有内存泄露的节点。按道理应该会释放掉window打开时所产生的内存啊。
而且我发现改不改基类似乎都没有什么区别,因为在用工具测试的时候两者都不会产生内存泄露节点。
我用的ext2.02。
请指教。
6 楼
fins
2008-04-28
ext我也不是很熟 只是凑巧研究了他里面的一些代码
但是对他的认识还不够深
你不妨把问题写出来 让大家一起来帮你
但是对他的认识还不够深
你不妨把问题写出来 让大家一起来帮你
5 楼
felix920
2008-04-28
fins,你好.!
关于ext2.0我有一些问题想请教你.能否留个联系方式,MSN或者QQ,谢谢了!
关于ext2.0我有一些问题想请教你.能否留个联系方式,MSN或者QQ,谢谢了!
4 楼
znjq
2008-04-23
panel本身问题就很多。 Panel.js中643行 this.header.unselectable();
查看Element.js 1946行
第一句swallowEvent给header加入了一个事件,但是panel destory的时候并没有释放.
第二句太诡异,加入这句也会导致header节点不释放.
解决办法:
window中也发现很多问题.回头再贴.
猜测很多组件destroy不释放一些dom的绑定事件.
查看Element.js 1946行
this.swallowEvent("selectstart", true); this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");
第一句swallowEvent给header加入了一个事件,但是panel destory的时候并没有释放.
第二句太诡异,加入这句也会导致header节点不释放.
解决办法:
Element.js中unselectable方法注释掉这行 //this.applyStyles("-moz-user-select:none;-khtml-user-select:none;"); Panel.js中 beforeDestroy : function(){ if(this.header)this.header.removeAllListeners(); Ext.Element.uncache( this.header, this.tbar, this.bbar, this.footer, this.body ); }
window中也发现很多问题.回头再贴.
猜测很多组件destroy不释放一些dom的绑定事件.
3 楼
hax
2008-03-23
最好反馈给ext社区。
2 楼
xfan1982
2008-03-20
这几天看了你的几篇文章,很有收获
1 楼
gdipkf1986
2008-03-20
呵呵,果然有发现啊,不枉我这几天一直在跟你。呵呵。最近公司的东西就应用到EXT,效率真是要命啊。我就知道Ext内部肯定有问题的。
发表评论
-
HTML5 与 ”性工能“障碍
2012-12-13 18:08 9613HTML5 与 ”性工能“障碍 最近看了@王淮Harr ... -
聊聊 iOS 5 和 iOS 6 在HTML5 canvas渲染上的差异
2012-09-13 18:40 6012我录制了一段iphone4s 下 ios 5 和 ios 6 ... -
尝试挑战 running panda , HTML5的跑酷类游戏(开发中)
2011-08-01 00:02 6075我业余时间一直在尝试用HTML5 在ios平台上开发webga ... -
移动互联网 与 Web标准化技术
2011-07-14 19:54 3734移动互联网 与 Web标准化技术 ... -
为什么我喜欢safari 胜过chrome和ff?
2011-07-04 00:35 7852抛下IE不谈,目前在浏览器市场里 最受欢迎的莫过于chrome ... -
欢迎参加 "移动平台HTML5动画性能大赛"
2011-03-31 11:38 3827移动平台HTML5动画性能大赛 注 : 此页面为临时页面 待 ... -
为什么在今天,我要选择HTML5 (上) 【此文标题党,还是别看了】
2011-03-30 16:19 4052当初苹果禁止Flash登陆iOS设备时,曾经引起过一场“HTM ... -
HTML5游戏开发入门实例<脆弱的马里奥>
2011-03-14 20:10 10207HTML5游戏开发入门实例<脆弱的马里奥>: ht ... -
3月26号,北京,我将做一期HTML5游戏开发的技术讲座,欢迎参加.
2011-03-11 11:57 21613月26号,我将去北京做一次"html5游戏开发入门 ... -
w3ctech 2011 - 拥抱HTML5 技术大会即将召开,欢迎报名
2011-03-03 23:46 1666w3ctech 2011 - 拥抱HTML5 技术会议将于4月 ... -
[新增视频]我在<当HTML5来敲门>技术沙龙上做的一个关于HTML5游戏开发的分享
2011-02-27 11:03 1952我在2月26号的<当HTML5来敲门>技术沙龙上做 ... -
说说 iOS safari在retina屏下显示图像的原理
2011-02-24 17:05 8225我在 简析 HTML5 canvas在retina屏(视网膜屏 ... -
一个 HTML5 编写的 简谱播放程序
2011-02-17 15:14 3868一个 HTML5 编写的 简谱播放程序 : http:// ... -
试用了一下 HP touchPad ,有点小失望.
2011-02-16 12:57 2835我手里的这台机器是 工程样机. 从样机来看, 这台平板并不出色 ... -
简析 HTML5 canvas在retina屏(视网膜屏幕,如iphone4)设备上的优化(更新原理)
2011-02-11 04:01 9588随着iphone4 的推出, retina ... -
[更新,bug修复了]chrome开启canvas 2D GPU加速后, clearRect的一个严重bug.
2011-01-24 15:54 9866最新版的 chromium. 已经修复了这个bug 经过进一 ... -
我也来重复造个轮子吧 ,发布一个利用原型,在Javascript中实现类机制的简单框架: GT-Class
2011-01-07 11:23 3456我也来重复造个轮子吧 ,发布一个利用prototype(原型, ... -
关于"GPU加速"的简单问答.
2011-01-05 22:34 2755如今使用GPU来代替CPU进 ... -
求助:用这样的方式写Kissy组件,可行吗?(Kissy推荐的方式是怎样的?)
2010-12-29 09:43 2044看了Kissy自带组件的代码,又看了你在D2上的PPT , 看 ... -
简单聊一聊百度的开源JS库:Tangram
2010-12-24 12:20 9547简单聊一聊百度的开源JS库:Tangram 最近百度开源了 ...
相关推荐
通过重写源码以增强内存管理,以及利用内存分析工具定位问题,可以有效地解决EXT内存泄露,提升应用的性能和稳定性。在实践中,结合良好的编程习惯和内存管理策略,将有助于构建高效且健壮的EXT应用。
然而,值得注意的是,这种手动内存管理策略虽能有效应对特定场景下的问题,但在现代浏览器中,由于其内置的垃圾回收机制已相当成熟,通常无需开发者过度干预。因此,在设计和优化应用时,还应考虑兼容性、性能与可...
EXT核心API详解 1、Ext类 ………………………………… 2 2、Array类 …………………………… 4 3、Number类 …………………………… 4 4、String类 …………………………… 4 5、Date类 ……………………………… 5 ...
在如今快节奏的生活中,压力和紧张成为人们普遍面对的问题。工作的繁忙、学习的压力,以及日常生活中的种种不如意,都可能造成人们心理上的负担。在这样的背景下,“desktop destroy”这类软件应运而生,它们以一种...
### Ext中的tabpanel关闭后再打开不显示的问题 在Ext框架中,`TabPanel`是一个非常重要的组件,用于实现页面中的多标签页功能。然而,在实际应用过程中可能会遇到一个常见问题:当某个标签页被关闭后,如果尝试重新...
在IT行业中,Ext JS是一个广泛使用的JavaScript库,用于构建富客户端Web应用程序。它提供了一套完整的组件模型,其中包括“窗口”(Window)组件,这是创建弹出式对话框或浮动面板的重要工具。本文将深入探讨Ext ...
然而,对于Resources加载的Asset和Assetbundle,开发者需要手动调用`Destroy`或`Unload`函数来释放内存。例如,使用`Resources.UnloadUnusedAssets`可以释放未使用的Resources资产,而`AssetBundle.Unload`则用于...
内存池是一种优化内存分配策略的技术,它在C语言中尤其重要,因为C语言不提供内置的内存管理机制。本文将深入探讨C版本的内存池实现,并通过提供的源码进行解析,帮助你理解其工作原理。 内存池的基本思想是预先一...
上一篇文章深入探讨了GlusterFS内部内存池(mem-pool)的实现机制与原理,本文将在此基础上进一步分析GlusterFS如何具体应用这项技术,并通过具体的代码示例来详细解释其工作流程。内存池作为优化内存管理的一种手段,...
通过分析和实践这些源码,你还可以了解到C++中的动态内存管理,包括指针操作、内存对齐、内存安全等问题。同时,对于内存池的扩展策略(如首次适应、最佳适应、最差适应等)和内存碎片的控制,也是深入研究的重点。 ...
EXT Form则用于创建表单,支持各种输入控件和验证机制。EXT Window是弹出式窗口,常用于对话框或浮层。EXT Chart提供了丰富的图表类型,如柱状图、折线图、饼图,可用于数据可视化。 EXT API的另一个重要部分是数据...
这个库可能提供了内存池的API,如`mpool_init`用于初始化内存池,`mpool_alloc`用于分配内存,`mpool_free`用于将内存返回给内存池,以及`mpool_destroy`用于销毁内存池。开发者可以使用这些API在自己的C语言项目中...
4. **同步机制**:由于共享内存是多进程共享的,因此我们需要添加适当的同步机制(如互斥量、信号量)来防止数据竞争。Boost.Interprocess提供了一些跨进程的同步原语,如`interprocess_mutex`和`interprocess_...
5. **destroy**: 这个方法用于销毁EXT对象,如DOM元素、事件监听器等,并调用它们的`destroy`方法(如果存在)。这是清理内存和防止内存泄漏的关键。 6. **each**: 用于遍历数组或NodeList,执行给定的函数。当函数...
- 静态变量:静态变量的生命周期与应用程序进程相同,如果持有Activity或其他容易引起内存泄露的对象,会导致内存泄露。 - 非静态内部类:非静态内部类会隐式持有对外部类的引用,如果外部类是Activity,可能导致...
标题和描述提到的问题是关于如何在Gameobject被销毁时检测到这一事件,并在此基础上进行其他操作。这里我们将详细探讨如何实现这一功能。 首先,Unity3D提供了`MonoBehaviour`类,它是所有自定义脚本的基础。`...
之前写了一个activity加载fragment的比较low,那个是放在xml布局里面动态控制show和hide实现的,这个代码也是通过show和hide实现显示和隐藏防止destroy,但是可以动态加载fragment实例,不用再把fragment放在xml布局...
在实际开发中,可以通过分析模态对话框的消息处理机制来处理类似的程序设计需求,甚至可以将文档/视图框架结构中的某些功能集成到对话框中,或者反之。这为程序设计提供了极大的灵活性。 模态对话框的消息处理机制...
#### 二、内存池设计的主要问题 在设计内存池时,通常需要解决以下两个关键问题: 1. **内存碎片问题**:频繁地使用`malloc`和`free`会导致内存空间变得零散,形成许多无法利用的小块内存,这被称为内存碎片。 2. ...