오늘 뭐했냐/개발에 대한 주저리

23.10.19 가비지 컬렉션

스스로에게 2023. 10. 19. 21:24

원시값, 객체, 함수 등 우리가 만드는 모든 것은 메모리를 차지하기 때문에 쓸모 없는 것들에 대한 처리가 필요하다.

 

가비지 컬렉션

프로그램이 더 이상 사용하지 않는 메모리를 자동으로 찾아내고, 이를 해제하여 재사용할 수 있도록 한다.

 

기준

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

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

 

예시

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

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

 

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

 

내부 알고리즘

'mark-and-sweep’이라 불리는 가비지 컬렉션 기본 알고리즘이 있는데 '가비지 컬렉션’은 대개 다음 단계를 거쳐 수행 된다.

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

중요한 점은 루트를 출발지로해서 참조가 되어 도달 가능한 객체여야 삭제가 안된다는 점이다. 루트가 접근할 수 없고 지들끼리 참조하는 객체 덩어리를 "도달할 수 없는 섬(Unreachable Island)"이라고 한다.

 

최적화 기법

  • generational collection(세대별 수집) : 오래된 객체와 새로운 객체를 구분하여, 새로운 객체는 엄격하게 감시하여 제거하고 오래된 객체는 덜 감시함.
  • incremental collection(점진적 수집) : 방문해야할 객체가 많으면 부하가 높아진다. 모든 객체를 한번 다 방문하지말고, 여러부분으로 나누어 점진적으로 GC를 진행한다. 그 차이로 인한 변경사항을 추적하는데 추가작업이 필요하다.
  • idle-time collection(유휴 시간 수집) : CPU 부하를 덜 주기위하여, idle 상태에서만 GC를 실행함.

 

 가비지 컬렉션은 엔진이 자동으로 수행하기 때문에 개발자가 이것을 강제로 실행하거나 중단 시킬 수 없다. 하지만 이렇게 메모리 관리가 되고 있다는 것은 알고 있자.

 

참고 및 자세한 내용 

'오늘 뭐했냐 > 개발에 대한 주저리' 카테고리의 다른 글

GraphQL  (0) 2023.10.24
23.10.20 (JS에서의)this  (0) 2023.10.20
23.10.18 CommonJS와 ES6  (0) 2023.10.18
23.10.14 프로토타입  (0) 2023.10.16
23.10.13 태스크 큐  (0) 2023.10.16