학습(구)/JavaScript(구)

자바스크립트 - 가비지 컬렉션

잉아당 2021. 11. 3. 17:39
728x90

자바스크립트에서는 '도달 가능성(reachability)'이라는 개념을 통해 메모리를 관리하고 있습니다.

도달 가능성(reachability)은 어떻게든 접근 가능하거나 사용할 수 있는 값이며 가능성이 있으면 삭제되지 않습니다.

 

  • 현재 함수의 지역 변수와 매개변수
  • 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
  • 전역 변수
  • 기타 등등

다음과 같은 값들은 처음부터 도달이 가능하기 때문에 이유 없이는 삭제 되지 않으며 root라고 부릅니다. root가 참조하는 값도 도달할 수 있는 값이 됩니다.

// user엔 객체 참조 값이 저장됩니다.
let user = {
  name: "John"
};

// -> 객체가 도달할 수 있는 값

user = null;

해당 코드에서 user에 null을 대입할 경우 name 프로퍼티를 가진 객체는 도달할 수 없기 때문에 가비지 컬렉션가 삭제 하게 됩니다. 

 

객체에 두개 이상의 변수가 참조하고 있을 때 한개의 변수가 null로 되어 참조하지 않아도 다른 변수가 참조하고 있기 때문에 도달할 수 있어 가비지 컬렉션이 삭제하지 않습니다.

 

여러 객체가 얽혀 있을 경우 외부에서 나가는 참조는 신경을 쓰지 않고 외부에서 들어오는 참조를 기준으로 도달 가능성을 판단해 삭제합니다.

 

가장 최상단에서 참조를 하지 않으면 모든 객체를 가비지 컬렉션에서 삭제합니다.

 

mark and sweep 

- 가비지 컬렉션의 기본 알고리즘 입니다.

- 가비지 컬렉션은 모든 루트의 정보를 mark 합니다.

- 루트가 참조하고 있는 객체를 방문해 mark 합니다.

- 객체가 참조하고 있는 객체를 방문해 mark 합니다.

- mark 된 곳은 다시 방문하지 않습니다.

- mark 되지 않은 곳을 모두 삭제합니다.

 

자바스크립트에서는 가비지 컬렉션을 최적화하는 기법을 사용합니다.