2013-01-10 21 views
2

我们开发了一个使用Dojo开发的丰富的Web应用程序(使用许多不同的视图,大量的按钮,视图之间的事件等)。任何数据都通过Rest接口异步加载。IE8中由Dojo 1.7.2引起的内存泄漏

现在我们意识到,在Internet Explorer 8中,如果应用程序的URL在相同的选项卡/浏览器窗口中打开了两次或更多次脚本,并且很快会导致内存不足。

似乎Dojo不断开任何事件处理程序/ DOM节点。

我跟踪到一个简单的html页面,只有一个单独的Dojo按钮小部件,并用sIEve(IE8的内存泄漏分析器)分析了html页面。如果再次调用html页面,则某些DOM节点不会被释放(成为孤儿)。

是否有任何设置/技巧/模式来防止孤儿?

我认为这种行为会导致我们的Dojo应用程序的巨大占用空间,而离开应用程序URL时并不会释放它。

这是样本HTML页面:

<html> 
<head> 
    <title>MemLeak Test</title> 
    <style> 
     @import "../themes/claro/claro.css"; 
    </style> 
    <script 
     type="text/javascript" 
     data-dojo-config="'parseOnLoad':true" 
     src="../js/dojo-release/dojo/dojo.js"></script> 
    <script type="text/javascript"> 
     require([ "dojo/parser" ]); 
     require([ "dijit/form/Button" ]); 
    </script> 
</head> 
<body class="claro"> 
    <h1>Memory Leak?</h1> 
    <input 
     type="button" 
     dojoType="dijit.form.Button" 
     label="Button"></input> 
</body> 

在筛孔样本HTML文件两次后,它会报告已经18个孤立的项目: HEAD,SCRIPT,DIV,SPAN(重复不同的命令);全部只有1个Ref并标记为泄漏! (对不起,我不能发布任何截图)

Thx对于该主题的任何帮助。

回答

0

问题是,你永远不会销毁这些小部件,因此浏览器在内存中保留对事件,dom节点等的所有引用。 您可以使用unload事件侦听器部分解决问题,并调用destroy方法您创建的小部件。

下面是一个例子:

require(['dojo/_base/unload', 'dojo/_base/array'], function(unload, array){ 
    unload.addOnUnload(function(){ 
     array.forEach(myWidgets, function(wgt){ 
      wgt.destroy(); 
     }); 
    }); 
}); 

,或者如果你没有你的小部件的引用,可以遍历的dijit注册表:

require(['dojo/_base/unload', 'dojo/_base/array', 'dijit/registry'], function(unload, array, dijitRegistry){ 
    unload.addOnUnload(function(){ 
     array.forEach(dijitRegistry.toArray(), function(wgt){ 
      wgt.destroy(); 
     }); 
    }); 
});