2014-10-28 88 views
0

我在其中一個程序中使用了以下代碼。它將服務器推送到HTML前端。這段JavaScript代碼是否導致內存泄漏?

一切按預期工作,但經過一段時間的工作(幾天),瀏覽器吃掉所有的內存,並且計算機掛起並需要重新啓動。

是否有可能我的代碼泄漏內存,或者問題出在瀏覽器中?我知道這是可能的壞JavaScript代碼在某些情況下,內存泄漏和,只要我的JS技能是接近零...

代碼本身:

var keepAliveTimer = null; 

function gotActivity() { 
    if (keepAliveTimer != null) clearTimeout(keepAliveTimer); 
    keepAliveTimer = setTimeout(connect, 3000); 
} 

function connect(){ 
    gotActivity(); 
    var source = new EventSource('/Events?'); 
    source.onmessage = 
    function (event) { 
     var N = event.data.split("="); 
     var K=N.shift(); 
     var H = ""; 
     for (var i=0; i<N.length; i++) { 
     if (i>0) {H += "="}; 
     H += N[i]; 
     }; 

     var el = document.getElementById(K); 

     if (el.hasAttribute("value")) { 
     el.value = H; 
     } else { 
     el.innerHTML = H; 
     }; 
    }; 
}; 

connect();  

此保持有效定時器機制建議在this answer

EDIT1:再次讀取源文件。當創建的EventSource對象被釋放?根據我的理解,從connect()退出source變量將被銷燬,並且EventSource對象將永遠存在。下一次撥打connect()只會創建另一個這樣的對象,而不會破壞舊對象。我對嗎?

回答

0

經過一番分析和測試,我來到了下面的代碼,這似乎不再泄漏內存:

var keepAliveTimer = null; 
var source = null; 

function gotActivity() { 
    if (keepAliveTimer != null) clearTimeout(keepAliveTimer); 
    keepAliveTimer = setTimeout(connect, 3000); 
} 

function OnPush(event) { 
    var N = event.data.split("="); 
    var K=N.shift(); 
    var H = ""; 
    for (var i=0; i<N.length; i++) { 
    if (i>0) {H += "="}; 
    H += N[i]; 
    }; 

    var el = document.getElementById(K); 

    if (el.hasAttribute("value")) { 
    el.value = H; 
    } else { 
    el.innerHTML = H; 
    }; 

    el = null; 
    gotActivity(); 
}; 

function connect() { 
    if (source != null) source.onmessage = null; 
    source = null;  
    source = new EventSource('/Events?'); 
    source.onmessage = OnPush; 
    gotActivity();  
} 

connect(); 
相關問題