자바스크립트는 도달할 수 있는지를 기준으로 메모리를 정리한다.
변수에 값을 재할당할 때 기존에 사용하고 있는 메모리 공간을 지우고 재할당하는 게 아니라 새로운 메모리 공간을 확보해서 저장한다.
그렇다면 기존에 사용하던 메모리 공간은 어떻게 되는 것일까?
할당된 메모리가 더 이상 필요 없을 것을 추정해서 회수하는 것이다.
var x = {
a: {
b: 1
}
};
var y = x.a;
var z = a.b;
y = null; // x는 가비지 컬렉션이 되지만 a는 여전히 참조되고 있다.
z = 2; // a 객체와 b 프로퍼티 모두 가비지 컬렉션이 된다.
객체에 참조가 하나도 없는 경우 가비지 컬렉션이 되는 방식이다.
function f () {
var x = {};
var y = {};
x.a = y; // x는 y를 참조한다.
y.a = x; // y는 x를 참조한다.
}
f();
그러나 스코프를 벗어난 쓸모없는 객체도 순환 참조로 인해 가비지 컬렉션이 되지 못하는 문제점이 있었다.
참조가 아닌 도달할 수 있는지를 기준으로 메모리를 정리한다.
root(전역 변수와 현재 함수의 변수)에서 접근할 수 있는 모든 객체를 mark(기억)하고, mark 되지 않은 모든 객체는 가비지 컬렉션이 된다.
root에서 페인트를 들이부어서 도달 가능한 객체에 페인트가 칠해진다고 생각하면 된다.