[JS]객체 가비지 컬렉션

Kyle·2020년 11월 10일
0

javascript

목록 보기
4/18

가비지 컬렉션

linked List를 이용해 hash map 구현하다가 clear 메소드를 하는데 linked 된 property들을 잘라내면 어떻게 되는지 궁금해서 샐리한테 물어봤다.

가비지 컬렉션이라는 것을 발견 알아서 없애주는 것 이었다.

주요 가비지 컬렉션 알고리즘 & 한계

Reference-countion 가비지 콜렉션

즉, 어떤 다른 객체도 참조하지 않는 객체를 가비지 컬렉션의 대상으로 한다.

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();

Mark-and-sweep 알고리즘 (표시하고 쓸기)

자바스크립트에서는 전역변수들(원래는 roots라는 오브젝트 집합이라 한다.)에서 부터 참조하는 것들을 타고 간다.

그 중 참조 할 수 없는 (닿을 수 없는) 오브젝트들에 대해 가비지 콜렉션을 수행한다.

즉, 위에 순환 함수 같은 것들은 함수가 호출된 이상 그 누구도 참조할 수 없기 때문에 자동으로 처리된다.

한계는 수동으로 필요없는 객체에 접근해 메모리를 해제할지 결정 하는 건 아직 까지는 없다고 한다.

참조 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management

profile
Kyle 발전기

0개의 댓글