자바스크립트 엔진이 필요없는 메모리를 찾아내 삭제하는 메모리 관리
기준
도달 가능성(reachability) 이라는 개념을 사용해 메모리 관리를 수행한다.
- 도달 가능성(reachability) : 어떻게든 접근하거나 사용할 수 있는 값
태생부터 도달 가능하기에, 명백한 이유 없이 삭제되지 않는것을 루트(root)라고 한다.
- 현재 함수의 지역 변수와 매개변수
- 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
- 전역 변수
- 기타 등등
루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이다.
내부 알고리즘
'mark-and-sweep' 이라 불리는 가비지 컬렉션 기본 알고리즘
쉽게 표현한다면 루트(root)에서 페인트를 부어 페인트가 묻지 않은 객체를 메모리에서 제거하는 것이다.
- 루트(root) 정보를 수집하고, 이를 기억(mark)한다.
- 루트(root)가 참조하고 있는 모든 객체를 방문하고, 이를 기억(mark)한다.
- 기억(mark)된 모든 객체를 방문하고, 그 객체들이 참조하는 객체들도 기억(mark)한다. 이를 참조하는 객체가 없을때까지 반복한다.
- 기억(mark)되지않은 모든 객체를 메모리에서 삭제한다.
요약
- 가비지 컬렉션은 엔진이 자동으로 수행하므로 개발자는 이를 억지로 수행하거나 막을 수 없다.
- 객체는 도달 가능한 상태일때 메모리에 남는다.
- 참조된다고 해서 도달 가능한 것은 아니다. 서로 연결된 객체들도 도달 불가능 할 수 있다.
- 외부에서 들어오는 참조만이 도달 가능한 상태에 영향을 주기 때문이다.