2011-04-06 58 views
2

我有,我認爲,是一個相當平凡的位。 如果我運行得非常快,那麼情況會更加惡化,FireFox 4中的內存分配會不斷增加。我在Chrome中嘗試了這個,內存似乎保持穩定。在圖像之間切換時Javascript內存泄漏(FireFox4)

這是一個FF4問題還是我有我構建我的JavaScript很差?

注意沒有其他JS文件加載在頁面上。我在禁用所有插件的情況下以「安全模式」運行FF。沒有其他選項卡被加載。

<img id="heartbeat" name="heartbeat" src="/web/resources/graphics/greylight.png" /> 

    <script type="text/javascript"> 

     var hasTimedout = 1; 
     var lastPollTime = new Date();; 
     var maxDifference = 6000 * 2; //allows us to miss one poll of the data without showing anything bad 

     function heartbeat() 
     { 
      var curTime = new Date(); 

      var diff = curTime.getTime() - lastPollTime.getTime(); 

      if (diff > maxDifference && hasTimedout == 0) 
      { 
       document.getElementById('heartbeat').src = '/web/resources/graphics/greylight.png'; 

       hasTimedout = 1; 
      } 
      else if (diff < maxDifference && hasTimedout == 1) 
      { 
       document.getElementById('heartbeat').src = '/web/resources/graphics/greenlight.png'; 

       hasTimedout = 0; 
      } 

      toggle_visibility('heartbeat'); 
     } 

     function toggle_visibility(id) { 
      var e = document.getElementById(id); 
      if (e.style.display == 'block') 
       e.style.display = 'none'; 
      else 
       e.style.display = 'block'; 
     } 

     setInterval("heartbeat()",20);  
    </script> 
+2

請不要將字符串傳遞給'setInterval'和'setTimeout' - 它是'eval'的僞裝:( – 2011-04-06 14:48:55

+1

@Matt Ball意味着你的setInterval調用應該只是'setInterval(heartbeat,20);' – Pointy 2011-04-06 14:52:17

+0

無限增長還是有時候會下降?可能只是FF和Chrome中的垃圾收集器的區別 – Emmerman 2011-04-06 14:53:23

回答

2

JavaScript的垃圾收集的一些信息:SO Thread on JS GC

特別感興趣(也許)作者:

  • 使用delete語句。無論何時您使用新的 語句創建對象,請將其與刪除 語句配對。這可確保與 對象關聯的所有內存(包括其屬性名稱 )都可用於垃圾回收。 在「釋放對象」中更多地討論了刪除語句 。
  • 使用var關鍵字。在全局範圍內創建的沒有var關鍵字的任何變量 是 ,並且是 絕不符合垃圾回收 集合,表示存在內存泄漏的 機會。

我只能得出結論,你應該嘗試使用「新」關鍵字與刪除語句配對你的對象創建,看看是否有所作爲。

否則代碼看起來不錯。

+0

使用'刪除'似乎有幫助,但它仍然在增加。 +1 – Chris 2011-04-06 15:17:12