JS는 reachability 도달가능성 이라는 개념을 사용해 메모리 관리를 수행
1) 아래 소개해 드릴 값, 태생부터 도달 가능하기 때문, 명백한 이유 없이 삭제되지않음
2) 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됨
전역 변수가 객체에 저장된다고 가정, 이 객체의 프로퍼티가 또 다른 객체를 참조하고 있다면, 프로퍼티가 참조하는 객체는 도달 가능한 값이 됨
가비지 컬렉터는 모든 객체를 모니터링, 도달할 수 없는 객체는 삭제
let user = {
name: "John"
};
user 값을 다른 값으로 덮어스면 참조가 사라짐
user = null;
이렇게 되면 object에 접근할 방법이 사라짐, 가비지 컬렉터는이 john에 저장된 데이터를 삭제
참조를 user에 admin 복사했다고 가정
let user = {
name: "John"
};
let admin = user;
user값을 없애도 admin을 통해 접근할 수 있으므로 john 메모리 삭제되지않음
funtion marry(man, womn){
woman.husband = man;
man.wife = woman;
return {
father: man,
mother: woman
}
}
let family = marry({
name: 'John'
}, {
name: "Ann"
);}
delete family.father;
delete family.mother.husband;
객체들이 연결되어 섬 같은 구조를 만드는데, 이 섬에 도달할 방법이 없는 경우, 섬을 구성하는 객체 전부가 메모리에서 삭제됨
루트 객체의 중요성
'mark-and-sweep' 가비지 컬렉션 기본 알고리즘
<최적화기법>
generatinoal collection(세대별 수집) : 객체를 '오래된 객체'와 '새로운 객체'로 나눔, 가비지 컬렉터는 이런 객체를 공격적으로 메모리에서 제거
incremental collection(점진적 수집) : 방문해야 할 객체가 많다면 모든 객체를 한 번에 방문하고 mark 하는데 상당한 시간이 소모, 가비지 컬렉션에 많은 리소스가 사용되어 실행 속도도 눈에 띄게 느려질 것, 이걸 개선하기 위해 가비지 컬렉션을 여러 부분으로 분리, 각 부분을 별도로 수행
idle-time collection(유휴 시간 수집) : 가비지 컬렉터는 실행에 주는 영향을 최소화하기 위해 유휴 상태일 때에만 가비지 컬렉션을 실행