我在我的一个程序中使用以下代码。它为HTML前端提供服务器推送。
一切都按预期工作,但经过一段时间的工作(几天)后,浏览器会占用所有内存并且计算机挂起并需要重新启动。
我的代码是否可能泄漏内存,或者问题出在浏览器中?我知道在某些情况下,糟糕的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 :(得分: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();