본문으로 바로가기
 

가비지 컬렉션

 

ko.javascript.info

 

자바스크립트 엔진은 끊임없이 가비지 컬렉트를 하여 메모리를 여유있게 유지하려고 합니다. 그 기준은 '도달할 수 있는가?' 입니다.

 

let test = { name: "da" };

// {name: "da"} 객체는 연결된 곳이 없다. => 도달 불가 => 가비지 컬렉팅됨
test = {};

 

 

 

모든 가비지 컬렉션은 특정한 알고리즘에 따라 카비지 컬렉팅을 합니다.

 

v8 자바스크립트 엔진은 'mark-and-sweep’이라 불리는 가비지 컬렉션 기본 알고리즘으로 움직입니다.

 

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

 

쉽게 말해 global부터 시작해서 도달 가능한 곳을 모두 돌아다니고 마크가 없는 곳은 삭제합니다.

 

물론 이 알고리즘을 더 빠르게 실행하기 위해 추가적인 최적화 알고리즘을 이용합니다.

 

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

darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체