본문 바로가기
자바 스크립트

자바 스크립트 가비지 컬렉션

by y00ns00 2020. 12. 6.

 

 

가비지 컬레겻ㄴ 기준

자바스크립트는 도달 가능성 이라는 개념을 사용해 메모리 관리를 수행한다.

도달 가능한 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미한다.

도달 가능한 값은 메모리에서 삭제되지 않는다.

 

1. 아래 값들은 그태생부터 도달 가능하기 때문에 명백한 이유없이 삭제되지 않는다.

- 현재 함수의 지역 변수와 매개변수

- 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수

- 전역 변수

- 기타 등등

이런 값들은 루트 라고 부른다.

 

2. 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 된다.

 

전역 변수에 객체가 저장되어 있다고 가정 이 객체의 프로퍼티가 또 다른 객체를 참조하고 있다면 

프로퍼티가 참조하는 객체는 도달 가능한 값이 된다.

이 객체가 참조하는 다른 모든 것들도 도달 가능하다고 여겨진다.

 

자바스크립트 엔진 내에서 가비지 컬렉터가 끊임없이 동작한다.

가비지 컬렉터는 모든 객체를 모니터링하고 도달할 수 없는 객체는 삭제합니다.

 

 

내부 알고리즘

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

 

- 가비지 컬렉터는 루트 정보를 수집하고 이를 mark(기억)gksek.

- 루트가 참조하고 있는 모든 객체를 방문하고 이것들을 'mark'한다.

- mark 된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 mark한다. 한번 방문한 객체는 전부 mark하기 때문에 같은 객체를 다시 방문하는 일은 없다.

- 루트에서 도달 가능한 모든 객체를 방문할 때까지 위 과정을반복한다.

- mark 되지 않은 모든 객체를 메모리에서 삭제한다.

 

루트에서 페인트를 들이붓는다고 상상하면 이과정을 이해하기 쉽다.

루트를 시작으로 참조를 따라가면서 도달가능한 객체 모두에 페인트가 칠해진다고 생각하면 된다.

이때 페인트가 묻지않은 객체는 메모리에서 삭제된다.

 

 

자바스크립트 엔진은 실행에 영향을 미치지 않으면서 가비지 컬렉션을 더 빠르게 하는 다양한 최적화 기법을 적용한다.

최적화 기법

 

generational coolection(세대별 수집) -  객체로 새로운 객체와 오래된 객체로 나눈다.

객체 상당수는 생성 이후 제 역할을 빠르게 수행해 금방 쓸모가 없어지는데 이런 객체를 새로운 객체로 구분한다.

가비지 컬렉터는 이런 객체를 공격적으로 메모리에서 제거한다 일정시간 이상 동안 살아남은 객체는 오래된 객체로 분류하고 가비지 컬렉터가 덜 감시한다.

 

incremental coolection(점진적 수집) - 방문해야할 객체가 많다면 모든 객체를 한번에 바움ㄴ하고 mark 하는데 상당한 시간이 소모된다.

가비지 컬렉션에 많은 리소스가 사용되어 실행 속도도 눈에 띄게 느려질 것이다.

자바 스크립트 엔진은 이런 현상을 개선하기 위해 가비지 컬렉션을 여러 부분으로 분리한 다음  각부분을 별도로 수행한다. 작업을 분리하고 변경 사항을 추적하는 데 추가 작업이 필요하긴 하지만 긴 지연을 짧은 지연 여러개로 분산시킬 수 있다는 장점이 이다.

 

idle-time coolection(유휴시간 수집) - 가비지 컬렉터는 실행에 주는 영향을 최소화하기 위해 CPU가 유휴 상태일 때만 가비지 컬렉션을 실행한다.

 

 

요약

 

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

출처 : ko.javascript.info/garbage-collection

댓글