JavaScript 4.3

1 minute read

가비지 컬렉션

  • 쓸모없게 된 것을 찾아내서 삭제한다.

가비지 컬렉션 기준

  • 도달 가능성이라는 개념을 사용해 메모리를 관리한다.
    • 도달 가능한 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미한다.
    • 태생부터 도달 가능한 값(루트)
      • 현재 함수의 지역 변수와 매개 변수
      • 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
      • 전역변수
      • 기타 등등
    • 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 된다.
  • 자바 스크립트 엔진 내에선 가비지 컬렉터가 끊임없이 동작한다. 가비지 컬렉터는 모든 객체를 모니터링하고, 도달할 수 없는 객체는 삭제한다.

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

  • 모던 자바스크립트 엔진은 좀 더 발전된 가비지 컬렉션 알고리즘을 사용한다.

내부 알고리즘

  • Mark-and-sweep이라는 기본 알고리즘.
    • 가비지 컬렉터는 루트 정보를 수집하고 이를 mark(기억)한다.
    • 루트가 참조하고 있는 모든 객체를 방문하고 이것들을 mark 한다.
    • Mark 된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 mark 한다. 한 번 방문한 객체는 전부 mark 하기 때문에 같은 객체를 다시 방문하는 일은 없다.
    • 루트에서 도달 가능한 모든 객체를 방문할 때까지 위 과정을 반복한다.
    • mark되지 않은 모든 객체를 메모리에서 삭제한다.
  • 최적화 기법
    • generational collection(세대별 수집) – 객체를 ‘새로운 객체’와 ‘오래된 객체’로 나눈다. 객체 상당수는 생성 이후 제 역할을 빠르게 수행해 금방 쓸모가 없어지는데, 이런 객체를 ‘새로운 객체’로 구분한다. 가비지 컬렉터는 이런 객체를 공격적으로 메모리에서 제거한다. 일정 시간 이상 동안 살아남은 객체는 ‘오래된 객체’로 분류하고, 가비지 컬렉터가 덜 감시한다.
    • incremental collection(점진적 수집) – 방문해야 할 객체가 많다면 모든 객체를 한 번에 방문하고 mark 하는데 상당한 시간이 소모된다. 가비지 컬렉션에 많은 리소스가 사용되어 실행 속도도 눈에 띄게 느려진다. 자바스크립트 엔진은 이런 현상을 개선하기 위해 가비지 컬렉션을 여러 부분으로 분리한 다음, 각 부분을 별도로 수행한다. 작업을 분리하고, 변경 사항을 추적하는 데 추가 작업이 필요하긴 하지만, 긴 지연을 짧은 지연 여러 개로 분산시킬 수 있다는 장점이 있다.
    • idle-time collection(유휴 시간 수집) – 가비지 컬렉터는 실행에 주는 영향을 최소화하기 위해 CPU가 유휴 상태일 때에만 가비지 컬렉션을 실행한다.

Categories:

Updated: