这个 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 代码会导致内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

闭包会造成内存泄漏吗

闭包会造成内存泄漏吗?

闭包会造成内存泄漏吗?

此代码是否会导致JavaScript中的内存泄漏

为啥使用“新”会导致内存泄漏?

自动释放的 NSArray 会导致内存泄漏吗?