JavaScript

가비지 컬렉션 - garbage collection

단점이없어지고싶은개발자 2022. 5. 7. 18:10
반응형

유효하지 않은 메모리 === Garbage

도달가능성(reachability)이라는 개념을 사용해 메모리 관리를 수행한다.

‘도달가능한(reachable)’ 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미한다. 도달 가능한 값은 메모리에서 삭제되지 않는다.

태생부터 도달 가능한 목록 예시들

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

이런 값은 루트(root)라고 부른다.

 

루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됩니다. 도달 할 수 없게 되면 가비지 컬렉터는 메모리에서 삭제한다.

 

가비지컬렉션 기본 알고리즘은 ‘makr-and-sweep’이다

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

그 외 최적화 기법

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

 

참고 자료

가비지 컬렉션

반응형