2011-11-21 4 views
2

자바 스크립트의 가비지 컬렉터 타이머에 대한 아이디어가 있으십니까? 아래 스크립트를 실행하면 함수가 연결되고 연결된 스코프 변수가 100M 후에 정확하게 가비지 수집을위한 이 될까요? 아니면 약간의 마진?Javascript - 가비지 수집기 타이머?

가비지 수집에 대한 하나의 스레드를 stackoverflow에서 읽었지만 여전히이 질문이 있습니다. 아래 질문은 무엇입니까?

  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를 중지하거나 시작하는 방법이나 전혀 발생하지 않았다는 표시는 없습니다. 흥미로운 퀴즈를 위해 파이어 폭스에서 about:memory을 확인하십시오 (GC를 "제어"하기위한 몇 가지 모호한 버튼이 있습니다). 그게 다가올 때까지 얻을 수있는 모든 것입니다. 그리고 그 데이터는 스크립트에서 사용할 수 없습니다.

+2

크리스에게 디자인에 관한 구체적인 질문을하지 못하게하는 대신 설명에 감사드립니다. 위로 엄지 :) –

3

가비지 컬렉터는 비 결정적이다.
쓰레기는 쓰레기가되면 얼마 후에 수거됩니다.

setTimeout에 전달 된 폐쇄 객체는 실행 후 가비지가됩니다.

그 이상의 것은 구현에 따라 다릅니다.

관련 문제