자바스크립트의 메모리 관리, 쓸모없는 엔진을 찾아내 삭제하는 것을 얘기합니다.
자바스크립트는 도달 가능성(reachability) 를 바탕으로 메모리를 정리합니다. 도달 가능한 메모리는 삭제되지 않습니다.
도달 가능한 경우 명백한 이유 없이 삭제되지 않습니다.
가비지 컬렉터는 끊임없이 동작하고 있는 모든 객체를 모니터링하고 있습니다. 도달할 수 없는 객체는 삭제합니다.
ex) user.name 에 KJ라는 데이터가 있는 상태
let user = {
name: "KJ",
};
let admin = user;
ex) 아래와 같이 KJ를 Null로 변경 시 admin에 들어있던 KJ는 메모리에서 삭제될 수 있습니다.
let user = {
name: null,
};
let admin = user;
2개의 참조를 받던 객체가 하나만 끊어지면 메모리 정리를 안당하지만, 2개의 참조 모두 끊어진다면 참조 받던 대상은 메모리에서 삭제됩니다.
아무리 수 많은 객체들이 연결될지라도 특정 객체만 도달 방법이 없으면 도달받지 못한 객체는 전부 메모리에서 삭제됩니다.
mark and sweep 이라고 불리는 가비지 컬렉션 알고리즘입니다.
루트 정보를 수집 후 mark(기억) 합니다.
루트가 도달할 수 있는 곳이라면 모두 mark(기억) 합니다.
한 번 방문 한 mark(기억)은 재도달 하지 않습니다.
mark(기억)이 없는 객체는 메모리에서 삭제합니다.
세대별 수집 (generational collection) 일정 시간 이상 동안 살아남은 객체는 오래된 객체로 분리하고 가비지 컬렉터가 자주 감시하지 않습니다. 하지만 새롭게 생성 된 객체는 공격적으로 감시하며 메모리 제거에 앞장서요.
점진적 수집 (incremental collection) 은 너무 많은 객체가 있을 경우 천천히 돌아다니면서 메모리 정리를 합니다.
유휴 시간 수집 (idle time collection) 은 CPU 사용량이 낮을 때 가비지 컬렉션을 실행합니다.
기타 다양한 가비지 컬렉션 알고리즘이 존재합니다.
객체에 도달 불가능할 경우 메모리가 삭제됩니다. 가비지 컬렉션은 Auto 입니다. 억지로 실행하거나 막을 수 없습니다.