2013-07-09 1 views
2

ECMAScript 6은 약한지도를 소개합니다. 약한지도는 Node.JS v0.11.3에서 구현되었으며 플래그는 --harmony입니다.개체가 가비지 수집 준비가되었음을 어떻게 알 수 있습니까?

다음 코드를 고려하십시오.

var weakMap = WeakMap(); 
var temp = {}; 
weakMap.set(temp, 'Save me!'); 
temp = {}; 

마지막 줄을 실행하면 'Save me!' 문자열이 가비지 수집 준비가되었습니다. 문자열에 더 이상 현재 범위에서 연결된 강력한 참조 체인이 없다는 것을 코드로 증명할 수 있습니까?

약한지도에는 반복문이 없거나지도와 비슷한 속성 인 size이 있습니다. 후부에 약한지도에서 더 이상 액세스 할 수 없다는 것을 알 수있는 방법이 없다는 뜻입니까?

+0

'weakMap'을 사용하여 메모리 누수 * (잊어 버린 'temp' 객체에 대한 다른 강력한 참조) *를 추적 할 수 있는지 궁금한 분은 * 사지에 외출 할 것입니다. "아니오"라고 말하십시오. –

+0

강력한 참조 체인을 통해 객체에 도달 할 수 있는지 여부를 확인하는 유일한 방법은 모든 강력한 참조 체인을 추적하는 것입니다. – Barmar

답변

1

그렇게 할 수 없기 때문에 할 수 없습니다. 도달 할 수없는 경우 도달 할 수 있는지 여부를 묻는 좋은 방법은 없습니다. 함수 다음

isStronglyReachable(foo) 

이 있다면 당신은 어떻게 그것을 연결할 수없는 foo에게 전달할 것인가? foo에 약한 참조를 전달할 수있는 방법이 없으며 foo을 직접 전달하면 강력한 참조를 사용 했으므로 강력하게 연결할 수 있다는 것을 알았습니다 (매개 변수에 바인딩하여 또 다른 강력한 참조 또는 두 개를 만듭니다). 당신은 형태

weakmap.isValueStronglyReachable(key) 

의 무언가를 시도 할 수 있지만, 당신은 값이 강력하게 도달 할 것 키에 강한 참조가 필요 것입니다. 그것의 경우 - 양식의 무언가를 시도하더라도

weakmap.getArrayOfUnreachableKeys() 

(반환되는 배열을 통해 도달 반환 된 개체를 만들 것이다), 런타임에 연결할 수있는 값을 알아 내기 위해 전체 GC 패스를 실행해야합니다 GC 패스를 수행하는 중, 도달 할 수없는 키의 항목을 삭제하지 않는 이유는 무엇입니까?