2011-03-27 2 views
7

큰 C++ 응용 프로그램에 대한 스크립팅 언어 바인딩으로 Javascript를 사용하는 프로그램이 있습니다. 나는 V8과 웹킷을 같은 의미로 사용하지만, 기본 런타임은이 질문에 중요하지 않습니다.자바 스크립트 가비지 수집 폐쇄 규칙

이 응용 프로그램에서는 동적으로 생성 된 개체가 콜백을 수신합니다. 나는 ... 이런 식 바인딩이 콜백을 만듭니다 obj가 범위를 벗어나 갔다 결국 삭제됩니다 때문에

function f() { 
    var obj = CreateNewCallbackObj(); 
    obj.onCallback = dowork; // dowork is a function 
} 

은 분명히이 GC 문제가있는 것입니다.

내가 원하는 것은 개체가 자신의 평생을 관리하는 것입니다. 객체는 결국 생명의 종말을 알리는 콜백을 수신하게되고 그 일이 발생하면 객체 자체를 삭제할 수 있습니다.

하나의 생각은 obj.myself = obj를 추가하여 자체 참조하는 것입니다. 이것은 잘못된 방법처럼 보이지만 가비지 수집 알고리즘이 현명하지 않으면 작동하지 않을 수 있습니다.

올바른 방법이 있습니까? 오브젝트를 저장하기 위해 빌드 된 기본 Persistent DOM은 없으며, 모든 JS 오브젝트는 필요에 따라 동적으로 할당되지만 JS 엔진 내에서 고착 할 수있는 방법이 필요합니다.

답변

7

자기 참조는 이 아닙니다.은 아무 것도 살아 있다는 것을 보장합니다. 실제로 refcounting 만 사용하는 GC 언어의 자존심있는 구현에 대해서는 없습니다. GC 알고리즘이나 다른 구현 정의 세부 사항을 악용한다고 생각하지 마십시오.

대안 : 이러한 모든 개체를 보유하고 (따라서 해당 개체를 유지하는) 항상 도달 가능한 (예 : 전역) 개체를 만들고 개체를 제거하는 방법을 제공하십시오. 그럼 아무도 다른 사람에게 참고서를달라고기도하지 마십시오. GC의 요점은 메모리가 공개 될 때 (알아야 할) 알아서는 안된다는 것입니다.

또한 alive 속성을 추가하고 모든 메서드의 시작 부분에서 확인하고 메서드가 호출되는 경우 오류가 발생하는 경우 !this.alive - 물론 보장 할 수는 없지만 디버깅에 도움이 될 수 있습니다.