2016-09-28 83 views
1

我有一個web應用程序編寫的反應,它發送ajax請求來接收5頁文檔的塊。爲此,請求本身遞歸地調用它的函數作爲超時以接收接下來的5個頁面。Internet Explorer內存泄漏

附加信息:我使用npm倉庫的官方流量。 下面的代碼示例:

function getPages() { 

    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState === 4 && this.status === 200) { 
      var resp = JSON.parse(this.responseText); 
      SwitchViewAction.addPages(resp); // calls another setTimeout later, 
              // because of react lifecycle 

      if (Object.keys(resp).length > 0) { 
       setTimeout(getPages(), 0); 
      } 
     } 
    }; 

    xhttp.open("GET", '/GetDocumentPages/', true); 
    xhttp.send(); 
} 

的問題是,IE 11分配用於每個請求幾乎〜20MB存儲器(或超時?)。如果我渲染〜250頁的文檔,IE運行的內存,我得到以下錯誤:

Not enough storage is available to complete this operation. 

我發現this page,這解釋了setTimeout的設置內部參考,因此,超時被永遠不會被刪除。但只限於IE < 9.所以在11這個問題不應該。

Chrome可以很好地處理這個問題。這個巨大的文件的最大內存使用量爲〜170MB。 IE運行超過1GB並在控制檯上返回上述錯誤。在後面的代碼中,我將「resp」添加到數組中。如果我不添加它,IE保持在〜220MB的內存使用量。所以imho必須有一個參考問題。

更多信息:文檔頁面以base64形式發送。我計算了所有頁面收到時的最大尺寸。 249頁的文檔約爲162MB。

這是IE處理引用的問題,IE是不是釋放內存,還是我在一個完全錯誤的軌道?那麼它會是什麼呢?

+0

請先閱讀:https://msdn.microsoft.com/en-us/library/bb250448(v=vs.85).aspx –

回答

0

超時語法是不正確的,你應該這樣稱呼它:

setTimeout(getPages, 0); 

否則調用該函數向右走,確實會耗盡內存作爲以前功能通話的狀態從來沒有垃圾集。

+0

謝謝你,但不幸的是,這並沒有幫助。現在看起來反應是這個問題。渲染時,內存爆炸。其他瀏覽器如chrome和firefox可以處理它。我正在尋找。 – Obstc0rp

0

問題是IE在將base64字符串呈現爲圖像時浪費內存。對我來說,解決方案是隻渲染一堆頁面而不是整個文檔。