전역 변수에 null을 할당하여 이를 적극적으로 역참조하고 메모리를 해제하는 것이 참조 계산 전략인가요? JS의 가비지 수집 메커니즘이 마크 앤 클리어만 사용한다는 뜻이 아닌가요? 마크 클리어 전략에는 역참조가 포함되지 않습니까?
仅有的幸福2017-07-05 11:04:09
변수 선언은 힙에 메모리를 할당합니다. 해당 참조를 null로 표시하면 이 변수에 해당하는 메모리 공간을 회수할 수 있음을 인터프리터에 알립니다.
그러나 이것은 JS의 구문 설계이며 인터프리터 구현 시 메모리 관리의 세부 사항을 포함하지 않습니다. 실제로 브라우저 GC 전략도 다릅니다. Chrome/Firefox/Safari는 표시 및 스윕을 사용하는 반면 이전 버전의 IE는 참조 계산을 사용합니다.
역참조는 null을 할당하는 형태만 있는 것이 아닙니다. 인터프리터는 범위를 통해 변수의 수명 주기를 결정하고 변수 범위를 벗어날 때 변수의 메모리 공간을 회수할 수 있습니다.
[Mark Clearance]와 [Reference Counting]은 서로 다른 두 가지 GC 알고리즘인 반면, [Dereference]는 JS의 문법 기능입니다. 둘은 직교할 수 있습니다(관련이 없음).
代言2017-07-05 11:04:09
js 사양에서는 mark andclear를 사용하도록 되어 있지만 구현하면 항상 Mark and Clear가 되지 않을 수 있습니다.
여기서 헷갈리는 이유는 재활용의 겉모습만 보고 청소의 본질을 보지 못하기 때문입니다.
참조 카운팅은 이름에서 알 수 있듯이 객체에 대한 참조를 계산하고 참조가 0이면 재활용됩니다.
마킹과 클리어는 두 단계로 나누어집니다. 마킹 단계는 루트부터 시작하여 접근 가능한 객체를 비교한 후, 클리어 단계에서 마킹되지 않은 객체를 재활용합니다.
사실 소스코드 구현을 보지 않으면 어떤 전략이 사용되었는지 표면적으로 알기가 어렵습니다.