2014-10-28 91 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(); 
相关问题