자바스크립트는 가비지 컬렉티드 언어
자바스크립트는 가비지 컬렉션을 해 메모리를 관리한다. 이전에 할당된 메모리를 앱에서 여전히 사용중인지 주기적으로 검사(추적)해 할당한 메모리 영역이 필요없을 경우 그 영역을 회수한다. 덕분에 개발자들은 메모리 관리를 덜 신경쓸 수 있다. Garbage collected 언어가 아닌 경우, 메모리를 더 이상 사용하지 않을 때 컴파일러가 메모리를 회수하도록 코드에서 명시해줘야한다.
자바스크립트에서 변수는 값을 그대로 담고 있는게 아니라, 해당 값을 메모리에 저장하고 그 메모리를 참조한다.
자바스크립트의 가비지 컬렉션 알고리즘: mark-and-sweep
- 루트(roots) 목록 생성 (JS의
window
객체 포함, 코드에서 계속 참조되는 전역 변수들) - 모든 루트를 검사해 활성화 상태임을 표시
- roots의 자식들을 재귀적으로 검사해 도달 가능한 자식 객체들을 활성화 상태로 표시.
- 활성화 되지 않은 메모리 조각은 폐기될 수 있는 것으로 판단하고 메모리 해제 및 OS에 반환
예상치 못한 참조: 더 이상 사용되지 않을 줄 알았지만 활성화 상태 트리에 존재하는 메모리 조각들
자바스크립트 메모리 누수의 3가지 형태
- 우발적으로 생성된 전역 변수
- 순환 참조하는 경우: 클래스끼리 서로 상속한다던가, 두 모듈이 서로를 참조하는 경우. 이런 경우에는 null을 할당해 연결을 끊으면 된다.