2013-01-10 47 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(); 
     }); 
    }); 
});