티스토리 뷰
타 저수준 언어에서는 메모리 관리를 따로 해야 하지만 자바스크립트와 같은 고수준 언어는 메모리 관리를 자동으로 수행해준다.
가비지 컬렉션
객체, 함수 등은 메모리를 차지하는데 더 이상 쓸모 없는 것들은 메모리에서 삭제 처리하는 것을 의미하며 그 주체를 가비지 컬렉터라고 한다.
가비지 컬렉션의 알고리즘
자바스크립트의 가비지 컬렉션은 **도달가능성(reachability)**이라는 개념으로 메모리 관리 수행
도달 가능성이 있는 값이란 접근 및 사용이 가능한 값을 의미한다.
예를 들어 A라는 메모리가 있는데 A를 통해 B라는 메모리에 접근할 수있다는 것은 B는 A에 참조된다는 것을 의미하며 B는 접근 및 사용이 가능하는 것이다.
이러한 것들은 메모리에서 삭제되지 않는다.
근본적으로 도달가능성이 있는 값
1. 현재 함수의 지역변수와 매개변수
2. 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
3. 전역변수
4. 기타 등등
이러한 값을 root라고 한다.
도달가능성이 있는 값
- root가 참조하는 값이나 체이닝으로 root에서 참조할 수 있는 값
한편, 자바스크립트 엔진내에서 가비지 컬렉터는 항상 동작한다.
가비지 컬렉터는 항상 모든 객체를 모니터링하며 개발자가 이를 임의로 실행 및 중지할 순 없다.
가비지 컬렉션 예1 :
let person = { age : 10 }
전역 변수 person이 객체 {age : 10}을 참조하고 있다.
이때 person이 참조하는 값이 다음과 같이 바뀌었다고 한다.
person = { age : 20 }
그럼 {age : 10}은 이제 도달할 수 없는 값이 되고 메모리에서 삭제된다.
가비지 컬렉션 예2 :
let person = { age : 10 }
let kids = person
person = { age : 20 }
person과 kids는 {age : 10}을 참조하고 있고 이후 person의 값이 바뀌었다.
이때 kids는 아직 {age : 10}을 참조하고 있기 때문에 {age : 10}는 메모리에서 삭제되지 않는다.
만약 이후에 kids의 값이 바뀌면 그 때 {age : 10}가 메모리에서 삭제된다.
가비지 컬렉션 알고리즘 소개
다양한 알고리즘 중 mark-and-sweep 알고리즘을 사용하며 다음과 같이 단계별로 수행한다.
1. 가비지컬렉터가 root정보를 수집하고 기억한다.
2. root가 참조하는 모든 객체에 접근하고 기억한다.
3. 기억한 모든 객체에 접근할 때 해당 객체들이 참조하는 객체도 기억한다.
(한번 접근한 객체는 무조건 기억하기 때문에 재접근하지 않는다.)
4. root에서 도달가능한 객체를 모두 접근할 때까지 위 1~3과정을 반복한다.
5. 기억하지 않은 모든 객체는 메모리에서 삭제한다.
자바스크립트 엔진은 실행에 영향을 미치지 않는 한편 가비지 컬렉션의 성능을 최적화하는 알고리즘이 다양하며 날이 갈수록 기법이 발전하고 있다.
해당 기법을 다 소개하기엔 양이 많고 필자에게 아직 공부가 필요한 부분이며 엔진의 발전에 따라 기법도 많이 달리지기에 가비지 컬렉션 게시물의 내용은 여기서 마치겠다.
'Languages > JS' 카테고리의 다른 글
this (0) | 2021.11.15 |
---|---|
자료형 (0) | 2021.10.08 |
이벤트 루프(event loop) (0) | 2021.05.14 |
비동기 2편(async, await) (0) | 2021.05.13 |
비동기 1편(콜백함수, promise) (0) | 2021.05.13 |