`
clue
  • 浏览: 30433 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于Ext内存泄漏的部分心得

    博客分类:
  • web
阅读更多
-------
昨天发帖,没想到只加到博客中,论坛中没有...重发一下~
-------

内存释放在使用Ext开发OPOA系统时显得尤为重要
去年开始接触Ext开发,中间花了很多时间来解决内存泄漏。
最开始Ext还是3.0版,泄漏得一塌胡涂,也没什么处理头绪,只知道在onDestroy里加delete语句,用sIEve看效果。
而Ext3.1有了一个很大的进步,基本上绝大多数组件都没有泄漏了。但并不意味着Ext没泄漏,做出的页面也没泄漏。JS是自动回收的,而只要有一个引用没有释放就可能导致一大片JS对象及Dom节点无法释放,所以迟早还是会面对这个问题。

本人不擅长表达,就直接列心得吧。

一、泄漏的分类
1. 组件创建后未销毁(Ext层面)
这里说的组件一般是指继承自Ext.Component的,它在创建时会注册到Ext.ComponentMgr中,不调用destroy方法是不会从中移除的,所以它永远不会被释放。
大部分组件是放置于Container中,Container销毁会将子组件一起销毁,是不存在这个问题。但当它是Ext.Window(没有父容器)或手工render的组件(例如用模板画html,再render到指定Dom节点)时,如果不主动销毁问题就发生了。

2. 组件自身有泄漏或使用不当(JS&Dom层面)
目前Ext原生组件的泄漏已经很少了,但自己扩展的组件不注意的话会造成浏览器无法释放的泄漏。
(参考:http://www.ibm.com/developerworks/cn/web/wa-memleak/index.html)
而使用不当是指破坏了组件内部结构,导致无法完全释放。

3. JS对象微量泄漏(JS层面)
举一个典型的例子,Ext.lib.Ajax中,poll与timeout属性用于记录状态监听与超时监听任务的ID,在请求完成后只是简单的置为null,从而导致这两个对象属性越来越多。不要小看这一点增长,在IE下大概6次Ajax请求这里就会多占1K内存,设想一个页面每2秒发送Ajax请求一次,1天就会造成43200 * 2个null无用属性,在IE下约等于6M内存。(当前Ext仍存在这个问题)
另一个Ext对此作处理的例子,就是Ext中的elCache清理(Ext中定义的garbageCollect定时执行),与IE的bug相关:http://www.sencha.com/forum/showthread.php?89317-quot-IE-object-leaks-quot-What-s-going-on

看似很少,积少成多也不得了,在1,2类泄漏解决完后,就要面对这样的问题了。

二、泄漏检查
1. 组件泄漏
这个比较简单,可以写个函数记录Ext.ComponentMgr.all(Ext.util.MixedCollection)中的组件列表,从而判断哪些组件还没有被销毁。

2. 组件内部泄漏
这个就要用sIEve查看了,创建、销毁,看Dom列表。

3. 微量泄漏
只能用笨办法,使用IE,调快逻辑执行,长时间运行,记录任务管理器中显示的虚拟内存(不能用其它浏览器,经测试FF和Chrome缓存很厉害,很难测出增长。也不能用sIEve,它监控内存及dom数量时也会造成内存增长)

三、定位并解决
1. 组件泄漏
找到没销毁的,扩展onDestroy,在其中销毁掉。

2. 组件内部泄漏
定位泄漏的Dom节点关联的代码,查检有没有调用removeNode移除,有没有循环引用
具体的不好讲,原因非常多,可以边改边用sIEve看效果。

3. 微量泄漏
这个没啥办法。。。只能调快操作长时间运行查看平均增长,然后一步步改代码排除了……

关于内存泄漏的解决方法,以上几乎没写什么有用的东西,说实话,我也不知道该写些什么。
因为我处理的内存泄漏大部分都是排除法定位并解决的,现在除了sIEve能查看Dom节点泄漏,没啥好用的工具能检查与之相关的JS对象的情况。从而导致只能靠蒙来找到造成泄漏的代码。

PS:有个firefox相关的工具可以查看JS运行状态,非常详细非常专业,但我研究了一天没弄懂
有会用的人发发心得吧。。。
http://www.softwareverify.com/javascript/memory/index.html
点页面右边的eval获取评估版注册码。
分享到:
评论

相关推荐

    ext2.2的内存泄漏补丁

    "ext2.2的内存泄漏补丁"针对的就是这个问题,它是一个专为解决EXT2.2框架中内存泄漏问题而设计的更新。 EXT是一个流行的JavaScript库,用于构建富客户端Web应用程序。EXT2.2是这个库的一个特定版本,它提供了丰富的...

    ext内存泄露的两个补兵

    通过重写源码以增强内存管理,以及利用内存分析工具定位问题,可以有效地解决EXT内存泄露,提升应用的性能和稳定性。在实践中,结合良好的编程习惯和内存管理策略,将有助于构建高效且健壮的EXT应用。

    ext内存泄露补丁文件!!

    "ext内存泄露补丁文件"指的是EXTJS框架中针对内存泄露问题的修复补丁。EXTJS是一个流行的JavaScript库,用于构建富客户端应用程序,其组件化的设计使得开发者能够创建复杂的用户界面。然而,由于JavaScript的异步...

    Iframe内存泄露分析

    Iframe 内存泄露分析是指在使用 Iframe 时,由于互相引用、闭包、跨页面泄漏、伪泄漏等原因,导致浏览器内存泄漏的问题。这种问题在 Ajax 盛行以前并不是什么大问题,因为都是通过页面跳转和刷新来进行与服务端的...

    EXT学习心得,ext

    ### EXT学习心得与关键知识点详解 #### 布局Center的重要性 在EXT框架中,`layout: 'center'`是一个非常关键的配置属性,尤其是在创建面板(Panel)时。如果一个面板没有设置中心布局(center),它可能不会按预期...

    Ext3.4部分使用心得

    NULL 博文链接:https://xnbhnly.iteye.com/blog/1758105

    ext5第一部分

    【标题】"ext5第一部分"的描述虽然简略,但可以推测这可能是指Linux文件系统EXT5的第一部分内容。EXT5是Linux内核中的一个拟议的文件系统扩展,尚未正式发布,通常我们所说的EXT系列文件系统指的是EXT2、EXT3、EXT4...

    关于extjs中tabPanl关闭后的内存释放

    ### 关于ExtJS中TabPanel关闭后的内存释放详解 在前端开发领域,特别是在使用ExtJS框架构建复杂Web应用时,内存管理是一个不容忽视的关键环节。本文将深入探讨ExtJS中TabPanel组件在关闭后如何有效地释放内存,以及...

    Ext2的示例,包含了ext2大部分的方法示例

    **EXT2文件系统详解** EXT2(Second Extended File System)是Linux操作系统中广泛使用的早期日志文件系统之一,由Rene Rebeau于1992年开发。它旨在克服EXT1文件系统的限制,提供了更高级别的功能和性能优化。在本...

    ext下载包,ext,ext包,ext下载

    EXT的核心部分是它的组件系统,包括各种UI组件,如表格、面板、菜单、按钮、表单等,这些组件都具有高度可定制性。"ext-all.js"是EXT库的主要JavaScript文件,包含了EXT的所有功能,适合在生产环境中使用。这个文件...

    ext5第三部分

    【标题】:“ext5第三部分” 【描述】:“ext5第三部分”可能指的是Linux文件系统EXT4(Extended File System)的扩展或改进的第三个阶段,虽然实际上EXT5并不存在。EXT4是EXT3的后续版本,它在2008年被引入Linux...

    Windows读取Ext4分区的工具 Ext2Read

    1. **支持多种EXT文件系统**: Ext2Read不仅支持EXT2,还支持更先进的EXT3和EXT4文件系统。EXT4是目前Linux发行版广泛采用的文件系统,其特点是速度快、支持大文件和大量文件。 2. **查看与复制**: 用户可以像在...

    ext相关资料-ext3.1

    以下是关于EXT相关资料及EXT3.1的一些核心知识点: 1. **EXT3**:全称为"Third Extended File System",是Linux下的一种日志文件系统。它在1990年代中期由Reed设计,以解决EXT2文件系统缺乏日志记录功能的问题。EXT...

    在windows下使用Ext2Fsd访问EXT4分区

    在Windows操作系统中,由于默认不支持Linux文件系统如EXT4,因此无法直接读取或写入EXT4格式的分区。但有一些第三方工具可以帮助我们解决这个问题,其中之一就是Ext2Fsd。Ext2Fsd是一个免费的开源软件,专门设计用于...

    EXT核心API详解(第一部分)

    EXT核心API是EXT JS库的重要组成部分,它提供了一系列丰富的组件和功能,用于构建富客户端Web应用。EXT JS是一个强大的JavaScript框架,尤其在数据可视化、表格处理、窗口系统和用户界面设计方面表现出色。EXT核心...

    Ext.Store的获取方法

    总结来说,在Ext.js中,获取`Ext.Store`应使用`Ext.getStore`方法,而不是`Ext.getCmp`,因为Store是通过`storeId`在内存中注册和管理的,而不是作为页面上的一个可视组件。同时,Store的设计方式有助于数据的安全性...

    ext学习资料 20篇详细学习笔记 初学者ext学习的文档

    10. **优化与性能**:最后,学习EXT应用的性能优化技巧,如延迟加载、分页和内存管理,可以提升用户体验。 通过这20篇详细的学习笔记,初学者可以系统地学习EXT的核心概念和技术,逐步掌握EXT开发的全过程。实践是...

    ext3.jar ext使用非常多

    EXT,全称EXT JS,是一种基于JavaScript的开源前端框架,主要应用于构建富互联网应用程序(Rich Internet Applications,简称RIA)。EXT3.jar是EXT框架的一个版本,它包含EXT库的Java版本,通常用于Java Web应用程序...

    ext-2.0 ext-2.0 ext-2.0 ext-2.0 ext-2.0

    ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0ext-2.0

    ext4.0中文文档

    EXTJS文档则是关于EXT JavaScript库的相关资料,它是一个用于构建桌面级Web应用的富客户端框架,与EXT4文件系统本身并无直接关联,但可能在构建基于EXT4的管理界面时有所帮助。 总之,EXT4.0中文文档是理解、管理和...

Global site tag (gtag.js) - Google Analytics