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단계로 나누어 진행된다.
마킹:
어떤 객체들이 수집대상인지 확인하는 단계를 마킹이라 하고 DFS로 순회하며,
Tri-color(white, gray, black)
로 마킹한다.- white: GC가 아직 탐색하지 못한 상태
- gray: 탐색은 했으나, 해당 객체가 참조하고 있는 객체가 있는지 확인을 안한 상태
- black: 해당 객체가 참조하고 있는 객체까지 확인을 한 상태
스위핑:
여전히 흰색으로 마킹된 객체들의 메모리 주소를 free-list라고 부르는 자료구조에 추가한다.
이 주소들의 메모리 공간은 사용 가능하여 새로운 객체가 저장 가능하다.콤팩트:
메모리 단편화가 심한 페이지들을 재배치하여 추가적인 메모리를 확보한다.
참조
카카오 블로그 - 자바스크립트 v8 엔진의 가비지 컬렉션 동작 방식
모던 JavaScript 튜토리얼 - 이벤트 위임