这个 JavaScript 代码会导致内存泄漏吗?
Posted
技术标签:
【中文标题】这个 JavaScript 代码会导致内存泄漏吗?【英文标题】:Is this JavaScript code causes memory leaks? 【发布时间】:2014-10-28 19:26:06 【问题描述】:我在我的一个程序中使用以下代码。它为 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()
的下一次调用将简单地创建另一个这样的对象,而不会破坏旧对象。我对吗?
【问题讨论】:
【参考方案1】:经过一些分析和测试,我得出以下代码,似乎不再泄漏内存了:
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();
【讨论】:
以上是关于这个 JavaScript 代码会导致内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章