• 1. ExtJs内存泄露
  • 2. 内存泄露的原因 1。XXX -- 举出实际例子 -- 解决方法 -- 效果对比1. 页面中的孤立状态的节点没有被回收,需要子节点真的被移除 -----孤立节点无法通过编程手段来删除,只能努力避免孤立节点的生成 > Ext的destroy和close不彻底 ---- ExtJs2.2已经改善 > 注册事件方式错误 ----手动解决 ---- ExtJs2.2已经改善
  • 3. sIEve—观察内存泄露和内存回收sIEve is a project to get rid of memory leaks due to some limitations of the garbage collector in Internet Explorer. Executing AJAX kind of applications (like Cordys Explorer) will stress the browser heavily. Internet Explorer is not very strong in Memory Management. With other words; It is very easy to introduce serious memory leaks in Internet Explorer by executing JavaScript and DHTML manipulation. 1 列出当前页面内所有dom节点的基本信息(html id style 等) 2 页面内所有dom节点的高级信息 (内存占用,数量,节点的引用) 3 可以查找出页面中的孤立节点 4 可以查找出页面中的循环引用 5 可以查找出页面中产生内存泄露的节点
  • 4. 内存总体占用量(单位kb) 和上次列表自动刷新时相比,变化的量 当前的dom节点数目 产生内存泄露的节点数目 日志信息(节点发生异常时记录一些信息 不常用) 演示一下如何用?
  • 5. Prac_3.html
  • 6. (本页无文本内容)
  • 7. (本页无文本内容)
  • 8. (本页无文本内容)
  • 9. (本页无文本内容)
  • 10. (本页无文本内容)
  • 11. (本页无文本内容)
  • 12. (本页无文本内容)
  • 13. (本页无文本内容)
  • 14. (本页无文本内容)
  • 15. 事件机制div注册事件 Prac_1.html Prac_2.html Ext.get("div1").on("click",function(){ alertMsg() });  
  • 16. 原因发现问题在于ext的 wrap function,就是listener是global的话就会有问题。 见 EventManager.js的140行: fn._handlers = fn._handlers || []; fn._handlers.push([Ext.id(el), ename, h]); 这里给传入的listener加了_handlers属性,stopLisener负责清除,那么就能正确的处理。 但是destroy直接调用了E.purgeElement...,这个方法好像没办法看到原来的listen,所以,没办法正确的清除_handlers,而_handlers引用了element on的加入是通过EventManager的addListener方法来做的,这里在每个fn上绑定了_handlers,purgeElement的时候通过Ext.lib.Event的removeListener方法,见300行 delete listeners[index][this.WFN]; delete listeners[index][this.FN]; 但是这里是只是删除了fn,没有清楚掉里面的handlers,而handlers有el的引用,因为没法清楚对象.而这个时候fn也就是 alertMsg是在window下的,我测了一下,单纯删除他是没用的,必须wrap一下,所以出现了你说的必须用function(){   alertMsg()}才正确的情况
  • 17. (本页无文本内容)
  • 18. (本页无文本内容)
  • 19. (本页无文本内容)
  • 20. (本页无文本内容)
  • 21. (本页无文本内容)
  • 22. (本页无文本内容)
  • 23. 使用 el.on(eventName, fn) 为el添加事件 调用 Ext.destroy(el) 方法移除el 此时,如果fn为全局类型,或者是被全局对象引用, 那么会使el元素成为孤立节点,无法彻底移除. 而如果在 Ext.destroy(el)  之前, 调用 el.un(eventName, fn) 移除添加的事件, 那么就可以彻底移除. 但是直接使用  Ext.destroy 才是ext中描述的正确做法, 切ext内部也都是这样使用的, 所以应该将解决问题的着手点放在 el.on 和  Ext.destroy方法上.
  • 24. (本页无文本内容)
  • 25. 产生问题的原因 执行Element.removeAllListeners时没有调用  EventManager.stopListener中的 "删除 fn._handlers  缓存内的相关数据 " 导致在IE下 当 fn 为全局对象 或者是被引用时, 元素无法被正确移除. http://fins.javaeye.com/blog/173818
  • 26. ExtJS2.2 完美展示Prac_5.html Prac_6.html
  • 27. 该补丁包给几乎所有存在泄露的组件做了修正。 虽然补丁所描述的环境是ie,但实质上2.2在任何浏览器上都因为事件模型和组件本身销毁方法考虑不周的缘故使内存不断增长。 从2.0的组件树模型,到2.2对事件模型的修改,再到该补丁的出现,一页式的web应用真正走向成熟 http://www.sencha.com/forum/showthread.php?45782-2.2-OPEN-quot-element-orphan-quot-in-a-quot-one-page-one-application-quot-web-page
  • 28. (本页无文本内容)
  • 29. (本页无文本内容)
  • 30. 现在2.0
  • 31. 2.2
  • 32. Ext JS 3.1发布: 大量内存泄漏的改善
  • 33. Extjs性能优化针对以下这三种情况讨论一下解决方案:   1,加载慢   1.1 减少要加载的东西   不要动不动就ext-all.js,extjs是可以定制的,如果你用不到tree,就不要包含这个组件了。ExtJs的官网上有详细的定制方法和工具。   1.2 给出合适的用户提示   把Js后置,然后前面做一个加载的提示。如果像Gmail那样给出进度条,或者像很多网游那样来点图片或者Tips啥的就更好了,说不定用户还会觉得怎么加载这么快,我还没看清楚呢,呵呵。   1.3 用的时候再加载   动态加载,参考使用ExtJs开发MIS系统(2):Js的动态加载。   1.4 只加载一次   别用iframe了,如果你的静态内容过期做的不好,浏览器会经常再不厌其烦的从服务器下载同样的东西。   1.5 对你的Js添加过期标记   ext-base.js、ext-all.js都可以设置很长的过期时间,甚至永不过期(如果你不换extjs的版本)。这点对所有静态内容都很有用,如何设置过期标记请垂询Google。   2,渲染慢   2.1 少加载少解析、晚加载晚解析   1.1,1.3,1.4都对改善渲染慢的情况有效——加载的少了自然渲染的快了。   2.2 别用iframe   iframe不仅仅可能会使浏览器加载两遍,还一定会使浏览器解析两遍,放弃它吧,真的。   2.3 精心设计你的Js代码   例如缓存getElementByID()的结果、编译查询表达式之类的东西,这个纯看Js功力。   2.4 可能的话,让用户换个浏览器吧   Chrome比IE的Js渲染快是数量级上的差异!构造一个40列,50行的复杂GridPanel试试,你就会深有体会了……对于企业内部的MIS系统,换浏览器还是具有可能性的。   3,内存泄露
  • 34. EXT 授权释疑 EXT已提供几个可取的授权方式适合多种需要。 商业授权 很多顾客出于多方的原因需要一个传统的商业执照。这也许是对你的机构适当的授权,如果你: 1.不想在一个开源授权里有任何潜在的限制 2.必须拥有一个商业授权为了满足你的内部软件认证的需求 3.希望给与"EXT计划"财务上的支持,以确保其成功延续 (PS:想大家都有得玩,这才是重点) 开放原代码授权 Ext的授权是根据开源协议"LGPL"证书所制定的.你或许应该使用我方的开源认证,如果你: 1.在不含非开源软件的开源项目中使用Ext 2.计划用于私人,教育或非盈利用途 3.应用Ext于商业用途,但你却不想支付"EXT计划",没关系!"LGPL"协议会为你服务 浏览证书条款http://extjs.com/ext-oss-software-license OEM / 转售认证 如果你能策划把Ext直接捆为一件产品,并作为方程式工具或插件工具框架来包装或出售,我方希望你能与我方合作,立一个适当专门认证.与我方合作你将可获取: 1.市场上独家供应正版Ext-based产品 2.大量合作品牌和合作市场的机会 3.Ext中直接获得授权的支助
  • 35. 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的代码来消除 我在这里用偷懒的方式 是为了可以用尽量简短的代码来说明问题
  • 36. http://www.cnblogs.com/lizhengwei/archive/2009/11/19/1605957.html