자바스크립트 엔진 내에선 garbage collector가 끊임없이 동작합니다.
garbage collector는 모든 객체를 모니터링하고, 도달할 수 없는 객체는 삭제합니다.
let user = {
name: "John"
};
user엔 객체 참조 값이 저장됩니다.
다시말해, 전역 변수 user는 {name: "John"}이라는 객체를 참조합니다.
user = null;
user의 값을 다른 값으로 덮어쓰면 참조가 사라집니다.
가비지 컬렉터는 이제 객체 {name: "John"} 데이터를 삭제하고, 메모리에서 삭제합니다.
참조 두 개
참조를 user에서 admin으로 복사했다고 가정해보고
let user = {
name: "John"
};
let admin = user;
위에서 한것 처럼 user의 값을 다른 값으로 덮어써 봅시다.
user = null;
전역 변수 admin을 통하면 여전히 객체에 접근할 수 있기 때문에 객체는 메모리에서 삭제되지 않습니다.
이 상태에서 admin을 다른 값(null 등)으로 덮어쓰면 객체는 메모리에서 삭제될 수 있습니다.
요약
'가비지 컬렉션’은 대개 다음 단계를 거쳐 수행됩니다.
- 가비지 컬렉터는 루트(root) 정보를 수집하고 이를 ‘mark(기억)’ 합니다.
- 루트가 참조하고 있는 모든 객체를 방문하고 이것들을 ‘mark’ 합니다.
- mark 된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 mark 합니다. 한번 방문한 객체는 전부 mark 하기 때문에 같은 객체를 다시 방문하는 일은 없습니다.
- 루트에서 도달 가능한 모든 객체를 방문할 때까지 위 과정을 반복합니다.
- mark 되지 않은 모든 객체를 메모리에서 삭제합니다.
- 가비지 컬렉션은 엔진이 자동으로 수행하므로 개발자는 이를 억지로 실행하거나 막을 수 없습니다.
- 객체는 도달 가능한 상태일 때 메모리에 남습니다.
- 참조된다고 해서 도달 가능한 것은 아닙니다. 서로 연결된 객체들도 도달 불가능할 수 있습니다.
참고
'자바스크립트' 카테고리의 다른 글
Javascript’s __proto__ vs prototype (0) | 2021.06.28 |
---|---|
생성자 함수의 객체 생성 (0) | 2021.06.09 |
함수 객체의 프로퍼티 (0) | 2021.06.08 |
Unexpected comma using map() (0) | 2021.05.22 |
Currying (0) | 2021.04.06 |