日期:2014-05-16  浏览次数:20355 次

Extjs IE内存问题

Extjs IE内存问题
2011年08月25日
  《1.》
  使用了ExtJS 3.1并且更改了模块加载方式之后,我的OPOA内存回收有所改进,记录一下概要:
  1、不用autoload{url:url, scripts:true}的方式,而使用eval(response.responseText)方式,这样可以减少一些Orphan Node,使用autoload的话Tab中被load的那个Node无法释放而成为Orphan Node;
  2、在关闭Tab时,Tab的beforedestroy要把Tab里面的Component给destroy掉,并且要十分注意destroy的 顺序,然后set null,其它没有destroy()方法的对象直接set null,最后try CollectGarbage();
  3、左侧的TreePanel的tools中refresh很有用,tree的root.reload()之后IE可能会重新渲染页面,如果之前页 面渲染占用的内存多话则可能释放多出的内存占用(觉得类似IE6的窗口最小化,这里只是凭感觉,没看代码也没看IE的渲染机制);
  4、GridPanel组件的有个关闭Tab之后会成为Orphan Node,再打开一个包含GridPanel的Tab之后就没了,但是还会重新生成一个id不同的;
  5、非IE浏览器下右键菜单和浏览器右键菜单有冲突。
  《2.》
  最近在工作的时候碰到一些人在讨论ext,他们总是讨论到一个内存问题,因为在测试的时候总是发现当页面打开多了之后,及时关掉了,系统依然会很 慢,查看内存的时候,内存的使用率很高,即使关掉其他的应用,内存依然得不到释放,直到浏览器崩溃,一切又能恢复正常。
  其实,他们说的这个情况只是在客户端使用IE浏览器的时候才会出现,虽然js有自动释放内存的功能,但是有的时候IE在释放的时候显得有些漫不经心,所以 才导致内存不能及时释放。其实这个问题很好解决,看下面我的示例代码:
  function toAddTabPage(node) {//添加tabpanel标签栏
  var getTabPage = null;
  if (node.getDepth() > 0) {  //如果不是根节点root
  var tabItems = tabPanl.items;//获取已经生成的tabpanl
  var val = null;
  tabItems.each(function(item) {//对已经生成的tabpanel进行迭代
  if (item.id == node.id) {//如果为已经生成的tabpanel
  val = node.id;
  getTabPage = item;
  return false;
  }
  });
  if (val != null) {//激活已经以生成的tabpanel
  tabPanl.setActiveTab(getTabPage);
  } else {
  var index = tabItems.length;
  if (index > 18) {
  Ext.Msg.alert('提示', '标签数量过多,请关闭不必要的标签项');
  } else {
  var tabPage = tabPanl.add({
  title:node.text,
  autoLoad:{url:node.attributes.url,method:'post',scripts:true},//scripts包 含页面是否允许脚本
  id:node.id,
  autoDestroy:true,
  destroy:function (){//销毁tabpanel
  if(this.fireEvent("destroy",this)!=false){
  this.el.remove();
  getTabPage = null;
  tabPage = null;
  if(Ext.isIE){
  CollectGarbage();
  }
  }
  },
  closable:true
  });
  tabPanl.setActiveTab(tabPage);
  }
  }
  }
  }
  这是一个添加激活tabPage的函数,函数实现的功能就是在点击节点的时候左边显示相应页面,其中用红色部分是最重要的,就是在关掉 tabPanl的时候做的事情,1.移除相应的页面元素,2.将相应的用于显示的在getTabPage、tabPage置为空(其中 getTabPage是用于存放激活已经存在打开了的展示页面,tabPage用于存放新生成的页面),3.判断如果为IE浏览器的话就是用 CollectGarbage()函数强制收回。这样就人为的去回收内存,在用户使用IE浏览器的时候就不会出现先前那些人所讨论的情况,至少在目前的项 目看来是可行的一种解决方案