가비지 컬랙션

김하은·2023년 5월 4일

자바스크립트는 눈에 보이지 않는 곳에서 메모리 관리를 수행한다.
우리가 만드는 모든것은 메모리를 차지하게 된다.

그럼 더는 사용하지 않는 것들을 어떻게 처리할까?

가비지 컬렉션

자바스크립트는 어떻게든 접근하거나 사용할 수 있는 값인 도달 가능한 값 을 기준으로 메모리를 관리한다
도달 가능한 값은 메모리에서 삭제되지 않는다.

  • 태생부터 도달이 가능하여 명백한 이유가 없이는 삭제되지 않는것 - 루트(root)

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

단, 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 제외된다.

도달할 수 없는섬 -> 객체들이 연결되어 섬 같은 구조를 만드는데, 이 섬에 도달할 방법이 없는경우 섬을 구성하는객체 전부가 메모리에서 삭제된다.

내부 알고리즘

'mark-and-sweep’이라 불리는 가비지 컬렉션 기본 알고리즘.

'가비지 컬렉션’은 대개 다음 단계를 거쳐 수행된다.

가비지 컬렉터는 루트(root) 정보를 수집하고 이를 ‘mark(기억)’한다.
루트가 참조하고 있는 모든 객체를 방문하고 이것들을 기억한다.
mark 된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 기억 한다. 한번 방문한 객체는 전부 기억하기 때문에 같은 객체를 다시 방문하지는 않는다.
루트에서 도달 가능한 모든 객체를 방문할 때까지 위 과정을 반복,
mark 되지 않은 모든 객체를 메모리에서 삭제한다.


요약

  • 가비지 컬렉션은 엔진이 자동으로 수행하므로 개발자는 이를 억지로 실행하거나 막을 수 없다.
  • 객체는 도달 가능한 상태일 때 메모리에 남는다.
  • 참조된다고 해서 도달 가능한 것은 아니다. (서로 연결된 객체들도 도달 불가능할 수 있다)

일단 사용되지 않는 것에대해서는 자바스크립트 엔진이 자동적으로 가비지컬렉션에 넣어 메모리에서 삭제한다고 정리한다...

0개의 댓글