자바스크립트는 가비지 컬렉티드 언어

자바스크립트는 가비지 컬렉션을 해 메모리를 관리한다. 이전에 할당된 메모리를 앱에서 여전히 사용중인지 주기적으로 검사(추적)해 할당한 메모리 영역이 필요없을 경우 그 영역을 회수한다. 덕분에 개발자들은 메모리 관리를 덜 신경쓸 수 있다. Garbage collected 언어가 아닌 경우, 메모리를 더 이상 사용하지 않을 때 컴파일러가 메모리를 회수하도록 코드에서 명시해줘야한다.

자바스크립트에서 변수는 값을 그대로 담고 있는게 아니라, 해당 값을 메모리에 저장하고 그 메모리를 참조한다.

자바스크립트의 가비지 컬렉션 알고리즘: mark-and-sweep

  1. 루트(roots) 목록 생성 (JS의 window 객체 포함, 코드에서 계속 참조되는 전역 변수들)
  2. 모든 루트를 검사해 활성화 상태임을 표시
  3. roots의 자식들을 재귀적으로 검사해 도달 가능한 자식 객체들을 활성화 상태로 표시.
  4. 활성화 되지 않은 메모리 조각은 폐기될 수 있는 것으로 판단하고 메모리 해제 및 OS에 반환

예상치 못한 참조: 더 이상 사용되지 않을 줄 알았지만 활성화 상태 트리에 존재하는 메모리 조각들

자바스크립트 메모리 누수의 3가지 형태

  1. 우발적으로 생성된 전역 변수
  2. 순환 참조하는 경우: 클래스끼리 서로 상속한다던가, 두 모듈이 서로를 참조하는 경우. 이런 경우에는 null을 할당해 연결을 끊으면 된다.