linked List를 이용해 hash map 구현하다가 clear 메소드를 하는데 linked 된 property들을 잘라내면 어떻게 되는지 궁금해서 샐리한테 물어봤다.
가비지 컬렉션이라는 것을 발견 알아서 없애주는 것 이었다.
즉, 어떤 다른 객체도 참조하지 않는 객체를 가비지 컬렉션의 대상으로 한다.
ex)
let a = { a: 1, b: { c: 1 } };
let b = a;
let c = b.b; // c > {c:1}
a = 0;
//하지만 아직 b가 { a: 1, b: { c: 1 } };얘를 참조하고 있어 유지중
b = 0;
//아직 c가 b.b를 참조하고 있어 유지중
c = 0;
//이제 아무도 참조를 안하기 때문에 저 값은 가비지 컬렉션의 대상이된다.
하지만 순환 참조는 Reference-countion 가비지 콜렉션이 처리 하지 못한다.
why?
원래 함수는 함수가 끝나면 할당된 메모리는 자동 회수된다. 하지만 이건 참조가 계속 되고 있다고 여겨지기 때문에 안된다.
ex)
function dontGarbage() {
let o = {};
let o2 = {};
o.a = o2;
o2.a = o; //둘은 서로 참조한다.
}
dontGarbage();
자바스크립트에서는 전역변수들(원래는 roots라는 오브젝트 집합이라 한다.)에서 부터 참조하는 것들을 타고 간다.
그 중 참조 할 수 없는 (닿을 수 없는) 오브젝트들에 대해 가비지 콜렉션을 수행한다.
즉, 위에 순환 함수 같은 것들은 함수가 호출된 이상 그 누구도 참조할 수 없기 때문에 자동으로 처리된다.
한계는 수동으로 필요없는 객체에 접근해 메모리를 해제할지 결정 하는 건 아직 까지는 없다고 한다.
참조 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management