2015-05-07 39 views
3

我的電視上有一個儀表板,頁面需要每秒刷新一次。爲什麼這個javascript刷新泄漏內存?

在頁面的底部,我有:

function startRefresh() { 
    $.get('', function(data) { 
     var newDoc = document.open("text/html", "replace"); 
     newDoc.write(data); 
     newDoc.close(); 
    }); 
} 
$(function() { 
    setTimeout(startRefresh,1000); 
}); 

這個偉大的工程,除了每個頁面加載導致內存使用量由chrome://memory-redirect/報上去。

有沒有辦法解決這個問題?我不想爲DIV創建單獨的頁面,只是重新加載該部分。

FYI HTTP頭刷新和document.location = document.location都產生不可忽隱忽現

+0

也許是一個錯誤。你在其他瀏覽器上試過了嗎? – Oriol

+0

我試過你的示例,並且startRefresh函數只運行一次 – devconcept

+2

我的猜測是事件調度程序堆放處理程序而不傾銷窗口對象以及文檔重置。在任何情況下,我會避免文檔寫入和使用iframe。 iframe將爲您帶來真正的重新加載。它會有相同的閃爍到白色的問題,但因爲你在一個iframe中,你可以利用css並用https://css-tricks.com/prevent-white-flash-iframe/解決它。你也可以隊列iframe屏幕外的更多有趣的轉換在您的電視應用程序。 – Radio

回答

0

你試過location.reload()

function startRefresh() { 
    location.reload(); 
} 
$(function() { 
    setTimeout(startRefresh,1000); 
}); 

編輯:在重新閱讀的問題後,我知道你沒有要求的替代方法,但對於內存泄漏的解釋(我沒有)。

+1

不存在這個問題的解決方案也不錯......但是這個問題也存在白色閃爍問題。 –

1

如果您使用的是Chrome,則應該使用「時間軸」來記錄內存使用情況。啓動時間軸,然後等待頁面刷新幾次,然後停止時間軸並查看結果。如果你看到這條線保持增長,那意味着你的內存對象(或DOM節點)永遠不會被釋放和垃圾收集。

我從來沒有使用document.open/write我自己,所以我不知道這是否會導致垃圾回收問題,但我懷疑它確實如此。

如果您使用時間軸清楚地檢測到內存空間,然後打開「配置文件」選項卡並在頁面重新加載之前和之後拍攝熱量快照,然後使用「比較」查看已更改的內容以及您的內存有多大影響是。例如,如果您的舊編譯代碼(或obejct引用)仍然存在,再加上新代碼,那麼它解釋了您的泄漏。

相關問題