2011-11-21 57 views
2

垃圾收集器定時器在javascript中的任何想法? 假設我運行在腳本下面,函數和關聯的作用域鏈變量將在100ms後精確到 以進行垃圾回收?或者一些保證金?JavaScript - 垃圾收集器計時器?

我在計算器瞭解垃圾收集一個線程,還是我有這個問題。 以下是我的問題?

  1. 是否有任何SYSTEM TIMER運行垃圾收集任務?
  2. 如果沒有,是基於它EVENT ?,意味着如果參考不再存在時,垃圾收集器 將立即回收內存。

    function call_me() { 
    //calculate elapsed_time - code not given 
    
          if(elapsed_time <100) 
          { 
          setTimeout(call_me,25); 
          } 
          else{ 
          final_call(); 
          } 
    } 
    
    call_me(); 
    
+6

它爲什麼重要?垃圾收集的關鍵在於它是隱含的,而不是你真正需要擔心的。只有通過從其他所有東西中引用垃圾來消除垃圾,這完全取決於你。之後發生的事情可能是每個JS引擎特有的實現。 –

+0

JavaScript中的垃圾收集取決於用於解釋代碼的引擎。例如,Rhino使用JVM。因此,當沒有更多引用某個內存塊時,它會運行垃圾回收器。我相信它是這樣定期的(即它不是事件驅動的)。我不知道其他的實現。垃圾收集與JavaScript本身無關。 –

+1

@Praveen:問題不相關;根據定義,你不需要擔心GC。它也是實現特定的。 – SLaks

回答

7

每個用戶代理都以不同的方式實現垃圾收集。所有的用戶代理使用mark-and-sweep方法定期重複,所以沒有「即時」的關於它;它發生時會發生。

每個代理具有不同的閾值和機制以確定何時GC做一通。它不一定是事件驅動的(可能你可能會說它是基準驅動的,事件發起的),當然不是基於計時器。

一個超出範圍的函數是合格用於垃圾收集,但實際上並不知道它何時會發生。

這是真的東西,從開發商的角度來看,你是不是打算去想。沒有任何方法可以停止或啓動GC,或任何可能的情況。在Firefox中查看about:memory,瞭解一些有趣的瑣事(還有一些可疑按鈕用於控制GC)。這就涉及到你將要獲得的所有內容,並且這些數據對腳本不可用。

+2

感謝克里斯的解釋,而不是勸阻別人問設計具體問題。豎起大拇指 :) –

3

垃圾收集器是非確定性。
垃圾在垃圾變成垃圾後會被收集一段時間。

一個封閉的對象傳遞給setTimeout將成爲垃圾它執行後。

任何超出是實現特定的。