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

ExtJs内存泄漏----组件泄漏检查

阅读更多
在单页式的Extjs应用中,由于Extjs存在许多的全局变量,这些全局变量包括了如:
Element Cache,Event Cache,ComponentMgr,ButtonMgr等等,内存的泄漏往往由于组件销毁时,没注意清除这些变量而引起。在2.2由guig提供的patch包,很大程度上保证了Extjs自带的组件正确的销毁。
下面提供一个检测ComponentMgr中是否累积了Component的代码:
function() {
                var items = Ext.ComponentMgr.all.items;
                var comIds = ewp.util.CheckLeakInEvents.comIds = ewp.util.CheckLeakInEvents.comIds || {};
                //累加组件出现次数
                for (var i = 0; i < items.length; i++)
                {
                    comIds[items[i].id] = (comIds[items[i].id] || 0) + 1;
                }
                //打印出现次数超过一次的组件Id
                var result = [];
                for(var key in comIds)
                {
                    if(comIds[key] > 1)
                    {
                        result.push(key + "=" + comIds[key]);
                    }
                }
                alert(result.join(", "));
            }

该方法可以作为一个Button的handler,每次点击一次,察看那些组件累积在了ComponentMgr中,结合FireBug设置断点,通过Ext.ComponentMgr(id),察看更多的组件信息。
遇到组件泄漏的场景:
如 tbar = [new TextField({...})],tbar所在的Grid作为TabItem,并且该TabItem延迟渲染,那么由于new TextField({...})已经注册,但因为未渲染,toolbar中未添加该Field为其Item,导致未销毁组件。(解决办法:通过复写onDestroy主动销毁,或是使用{xtype:""}延迟组件创建),总之,如果主动new ...的组件,那么注意销毁时,是否销毁了相应的组件。
分享到:
评论
4 楼 nihongye 2009-05-30  
刚好最近一个朋友问起,重新整理出来几个方法,如下:

//用于解决内存问题,检查Ext状态的几个方法:
//统计新增组件
function countAddComs() {
    var items = Ext.ComponentMgr.all.items;
    var comIds = window.extComIds = window.extComIds || {};
    for (var i = 0; i < items.length; i++)
    {
        comIds[items[i].id] = (comIds[items[i].id] || 0) + 1;
    }
    var result = [];
    var adds = [];
    for (var key in comIds)
    {
        if (comIds[key] >= 1)
        {
            result.push(key + "=" + comIds[key]);
            if (comIds[key] == 1) {
                //显示新增的组件
                //console.log(Ext.getCmp(key)) //firefox+firebug下可用这句查看组件详细的信息
                adds.push(Ext.getCmp(key).ctype + " " + Ext.getCmp(key).getXType() + " " + Ext.getCmp(key).text)
            }
        }
    }
    alert(adds.join(","));
    alert(result.join(", "));
}






//统计各全局组件管理器数量
function count() {
    var result = [];
    var count = 0;
    var x = Ext.menu.MenuMgr.menus;
    if (x) {
        for (var key in x)
        {
            count++;
        }
        result.push("menus = " + count);
    }

    count = 0;
    x = Ext.dd.ScrollManager.els;
    if (x) {
        for (var key in x)
        {
            count++;
        }
        result.push("scrolls = " + count);
    }
    count = 0;
    x = Ext.dd.DragDropMgr.ids;
    if (x) {
        var keys = "";
        for (var key in x)
        {
            count++;
        }
        result.push("dragdrop = " + count + " " + keys);

    }
    x = Ext.ButtonToggleMgr.groups;
    if (x) {
        for (var key in x)
        {
            count++;
        }
        result.push("butontoggle = " + count);
    }
    result.push("comp = " + Ext.ComponentMgr.all.length)
    result.push("store = " + Ext.StoreMgr.length)
    if (Ext.util.TaskRunner.tasks)
    {
        result.push("tasks = " + Ext.util.TaskRunner.tasks.length)
    }
    alert(result.join("\n"));
}






//统计Elements和事件数量
function countElmentsAndEvents() {
    //统计
    var elementCacheCouunt = 0;
    for (var key in Ext.Element.cache)
    {
        elementCacheCouunt++;
    }
    var _flyweightsCount = 0;
    for (var key in Ext.Element._flyweights)
    {
        _flyweightsCount++;
    }
    var eventCount = 0;
    var enames = {};
    for (var key in Ext.EventManager.elHash)
    {
        eventCount++;
        var es = Ext.EventManager.elHash[key]
        if (es) {
            for (var ename in es) {
                if (es.hasOwnProperty(ename)) {
                    enames[ename] = (enames[ename] || 0) + 1
                }
            }
        }
    }
    //显示各个全局变量的数量
    alert("elementCacheCouunt = " + elementCacheCouunt + ", _flyweightsCount = " + _flyweightsCount + ",eventCount = " + eventCount)
    //比较事件的增长
    var result = [];
    window.extEventNames = window.extEventNames || {};
    for (var key in enames)
    {
        window.extEventNames[key] = window.extEventNames[key] || 0;
        var added = enames[key] - window.extEventNames[key];
        if (added > 0)
        {
            result.push(key + ":total = " + enames[key] + ",add =" + added);
        }
    }
                //显示增长的事件及数量
    alert(result.join(","))
                //记录本次统计的事件名,留做与新的事件做比较
    window.extEventNames = enames;
}


在解决HtmlEditor的内存问题时,分别使用了:
1.通过使用"统计Elements和事件数量"检查出组件没有移除掉doc上的鼠标和键盘事件
2.通过使用"统计新增组件"检查出来ColorItem没有销毁掉ColorPalette组件
3 楼 dzxiang 2009-05-30  
“ewp.util.CheckLeakInEvents”
能否共享一下?
2 楼 willer 2009-03-04  
               
1 楼 会飞的狗 2009-02-06  
用了那个patch包,比以前是强了点。但是每刷新一次页面,还是有内存泄露。

相关推荐

    ExtJS 内存泄露补丁

    "ExtJS 内存泄露补丁"正是为了解决这个问题而设计的。 内存泄露通常发生在JavaScript环境中,因为其自动垃圾回收机制可能会由于某些编程错误或不恰当的代码实践而失效。在ExtJS中,这可能源于以下几个方面: 1. **...

    extjs 2.2 内存泄漏补丁

    在2.2版本中,尽管它提供了许多优秀的功能,但与许多其他JavaScript库一样,ExtJS 2.2也存在一些已知的问题,其中最令人关注的是内存泄漏问题。尤其是在老旧的Internet Explorer 6(IE6)浏览器上,这个问题尤为严重...

    ExtJS内存调试工具 sIEve

    3. **ExtJS组件分析**:由于ExtJS是基于组件的框架,sIEve特别关注组件的生命周期,能够检测到未正确销毁的组件,这些组件往往是内存泄漏的主要来源。 4. **事件监听器检查**:事件监听器如果没有被正确移除,也...

    ext内存泄露补丁文件!!

    内存泄露是计算机编程中一个严重的问题,特别是在JavaScript这种在浏览器环境中运行的语言中。...在维护大型EXTJS应用程序时,定期检查和应用最新的内存泄露补丁是至关重要的,以保持系统的稳定性和高效运行。

    续:ExtJS Chart 扩展(重构了下,并写了个新的示例--内存监控)

    【标题】"续:ExtJS Chart 扩展(重构了下,并写了个新的示例--内存监控)"指的是一个关于ExtJS图表扩展的更新版本,其中作者进行了重构,并且添加了一个全新的示例,用于实现内存监控功能。这个主题涵盖了两个主要的...

    dojochina extjs 1-30 解压密码

    ExtJS支持多种布局管理方式,并且具有高度可定制性,这意味着开发者可以根据实际需求对组件进行定制和扩展。此外,ExtJS还支持数据绑定、服务器通信等功能,极大地简化了复杂应用的开发过程。 ### 三、解压密码的...

    extjs2.2已整合内存补丁

    "extjs2.2已整合内存补丁"指的是这个版本的ExtJS已经包含了针对内存管理的优化,以解决可能存在的内存泄漏问题,从而提高应用的性能和稳定性。 在ExtJS 2.2中,开发者可以利用其丰富的组件库,如表格(Grid)、面板...

    extjs资源包

    - **性能优化**: 注意内存管理和事件监听,避免内存泄漏和不必要的计算。 - **版本控制**: 使用Git等版本控制系统,确保代码安全和团队协作。 - **测试驱动**: 编写单元测试和集成测试,确保代码质量。 - **持续...

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

    本文将深入探讨ExtJS中TabPanel组件在关闭后如何有效地释放内存,以及为何在特定环境下(如IE浏览器)这一过程可能变得尤为复杂。 #### TabPanel组件与内存泄露 TabPanel是ExtJS框架中一个常用且功能强大的组件,...

    [上传下载]ExtJS 2.2 开源网络硬盘系统_dogdisk.zip

    - 基于组件:ExtJS 2.2的核心是其强大的组件模型,提供了各种预定义的UI组件,如表格、表单、树形视图、面板等,这些组件可以灵活组合以构建复杂的用户界面。 - 数据绑定:框架支持双向数据绑定,使得UI与数据模型...

    extjs加水印

    EXTJS允许开发者自定义组件,包括创建具有特定功能的表单、窗口和其他界面元素。为了添加水印,我们需要创建一个新的组件或者扩展已有的组件,例如表格或图像查看器,使其在显示时自动添加水印。这通常通过在组件的...

    ExtJs人力资源管理系统(HRMS)

    3. **组件化开发**:ExtJs强调组件化开发,HRMS中的每个功能模块都可以视为一个可复用的组件。例如,员工信息管理可能包含一个员工列表视图、一个员工详情编辑窗体等,这些组件可以独立开发和测试,然后组合成完整的...

    ExtJS 事件笔记

    - **组件事件**:对于Ext.Component的事件,Ext3.0引入了`mon`方法,可以有效防止内存泄露,如`this.mon(this.el, 'click', this.click, this)`。 - **Ext.EventManager**:ExtJS的事件管理策略封装在这个单体类中...

    Extjs 4.11 重写 Panel 添加 click事件

    5. **销毁Panel时自动移除事件监听器**:如果你的Panel会在应用的某个阶段被销毁,推荐使用`mon`和`mun`这两个方法,它们会在Panel销毁时自动移除监听器,避免内存泄漏: ```javascript var listener = function() {...

    extjs信息系统extjs信息系统

    1. **EXTJS组件使用**:理解EXTJS的各种组件,如Panel、Grid、Form、Tree等,以及如何根据需求组合和定制这些组件。 2. **数据绑定**:EXTJS支持双向数据绑定,通过Store与Model实现视图和数据的同步更新,简化了...

    EXTJS事件实例源码

    5. **事件分离与移除**:使用`removeListener`(或简写`un`)方法可以移除事件监听器,避免内存泄漏。例如: ```javascript button.removeListener('click', buttonHandler); ``` 6. **事件链**:EXTJS支持事件链,...

    ExtJS弹出密码输入框的js文件

    ExtJS 是一个强大的JavaScript库,专门用于构建富客户端应用程序。...在实际项目中,确保正确使用和适当地集成此类组件至关重要,同时也要遵循相关的安全标准和最佳实践,以保护用户的个人信息不被泄露。

    ExtJS_3.3中文帮助文档

    10. **最佳实践**:遵循最佳实践,如合理组织代码、避免内存泄漏、使用适当的组件配置等,可以确保代码的质量和可维护性。 总的来说,"ExtJS_3.3中文帮助文档"不仅涵盖了ExtJS的基础知识,还深入讲解了高级特性和...

    基于ExtJS开发的酒店管理系统C#源码

    系统利用ExtJS的组件模型,如表格、面板、窗口、菜单等,构建出直观且交互性强的用户界面。此外,ExtJS的布局管理器使得页面元素可以灵活地适应不同屏幕尺寸,提高了系统的响应式设计。 2. **三层架构**: 系统...

    Extjs4.2前台导出Excel(多次导出失败bug已修改)

    1. **内存泄漏**:每次导出Excel时,如果旧的数据没有被正确清理,可能会导致内存占用持续增加,最终导致浏览器崩溃。 2. **文件名冲突**:连续导出时,如果文件名未做处理,新生成的Excel文件可能会覆盖之前的...

Global site tag (gtag.js) - Google Analytics