가비지 컬랙션

김하은·2023년 5월 4일
0

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

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

가비지 컬렉션

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

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

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

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

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

내부 알고리즘

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

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

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


요약

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

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

0개의 댓글