2023-01-18

가비지 컬렉션

자바스크립트에 가비지 컬렉터(GC) 동작을 알아보자!

가비지 컬렉터(Garbage Collector)

자바스크립트는 다른 언어와 다르게 쓸모없는 메모리 영역을 수동적으로 해제할 수 없다.

동적으로 할당된 메모리 중에서 더 이상 사용되지 않는 객체(가비지)를 탐지해 해제하고,

메모리를 회수해 누수를 막는 것이 가비지 컬렉터이다.

가비지 컬렉터는 주로 힙 영역에서 가비지를 탐지하고 해제하는데,

세대(generation)라고 불리는 알고리즘에 의해 동작을 수행한다.

가비지 컬렉터가 동작하는 힙 영역은 크게 New space, Old space 두 가지다.

New space

새로 생성된 객체들이 저장되는 곳이며, 새로운 객체가 오래된 객체에 비해 생명 주기가 짧을 가능성이 높다는

가설을 토대로 마이너 GC에 의해 관리되어 빠르게 컬렉션 된다.

영역 안에는 Semi space 라는 공간이 두 개 존재하고, 생존한 객체와 2번 생존한 객체를 Old space

이동시킨다.

Old space

마이너 GC에 의해 New space 에서 2번 생존한 객체들이 저장되는 곳이다.

영역 안에는 크게 다른 객체를 참조하는 객체가 저장되는 Pointer space,

문자열, 실수 등을 담고 있는 객체가 저장되는 Data space두 공간으로 나눌 수 있다.

마이너 GC

New space에서 메모리 해제를 담당하는 GC다.

수집되지 않고 살아남은 객체들은 항상 새로운 곳으로 대피한다.

이를 위해 두 Semi space 중 하나의 공간은 대피를 위해 언제나 비어있다.

비어 있는 영역은 To space, 수집되지 않은 객체가 머무르는 영역은 From space라고 부른다.

수집되지 않은 객체들은 메모리 단편화를 방지하기 위해 연속적으로 이동한다.

그리고 객체는 새로운 메모리 주소값으로 포인터가 갱신된다.

마지막으로 From space와 To space의 역할을 서로 바꿔준다.

이렇게 새로운 객체는 이전과 동일한 작업을 거쳐가고, 2번 생존한 객체는 Old space로 이동한다.

메이저 GC

Old space에서 메모리 해제를 담당하는 GC다.

Mark-Sweep-Compact , Tri-color 알고리즘을 사용해 참조되지 않은 객체를

쓸모 없는 객체로 간주해 수집한다.

Mark-Sweep-Compact

Mark-Sweep-Compact 은 마킹, 스위핑, 콤팩트(압축) 3단계로 나누어 진행된다.

참조

카카오 블로그 - 자바스크립트 v8 엔진의 가비지 컬렉션 동작 방식
모던 JavaScript 튜토리얼 - 이벤트 위임