> For the complete documentation index, see [llms.txt](https://nelmm.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nelmm.gitbook.io/til/javascript/core/garbagecollection.md).

# 가비지 컬렉션 ( Garbage Collection )

더이상 쓸모 없어진 메모리들을 자바스크립트 엔진이 찾아내 삭제하는것

자바 스크립트는 `도달 가능성(reachability)`개념을 사용해 메모리를 관리

* 태생부터 도달 가능한 메모리를 `루트`라고 부른다.
  * 현재함수의 지역변수, 매개변수
  * 중첩함수의 체인에 있는 함수의 변수, 매개변수
  * 전역변수 등등
* 루트가 참조하는 값이나 루트에서 참조할 수 있는 값은 도달가능한 값
* js엔진 내에서 가비지 컬렉터가 끊임없이 동작해, 도달할 수 없는 객체는 삭제

## 내부 알고리즘

`mark-and-sweep`이라는 가비지 컬렉션 기본 알고리즘으로 동작한다.

수행 단계

1. 가비지 컬렉터는 `루트` 정보를 수집하고 이를 `mark(기억)`
2. 루트가 참조하고 있는 모든 객체를 방문하고 이것들을 `mark`
3. mark된 모든 객체에 방문하고 이들이 참조하고 있는 객체도 mark\
   방문한 객체는 방문 x
4. mark되지 않은 모든 객체를 메모리에서 삭제

## 최적화 기법

* 세대별 수집(generational collection) : `새로운 객체`와 일정시간 오래 살아남은 `오래된 객체`로 구분하여 오래된 객체는 덜 감시하는 방법
* 점진적 수집(incremental collection) : 방문해야할 객체가 많다면 많은 시간이 소요되기 때문에, 가비지 컬렉션을 여러 부분으로 분리하여 각 부분을 별도로 수행하는 방법
* 유휴 시간 수집(idle-time collection) : cpu가 유휴 상태일때만 가비지 컬렉션을 실행하는 방법

이 외에도 많은 알고리즘과 최적화 기법이 존재한다.
