원시값, 객체, 함수 등 우리가 만드는 모든 것은 메모리를 차지하기 때문에 쓸모 없는 것들에 대한 처리가 필요하다.
가비지 컬렉션
프로그램이 더 이상 사용하지 않는 메모리를 자동으로 찾아내고, 이를 해제하여 재사용할 수 있도록 한다.
기준
자바스크립트는 도달 가능성(reachability) 이라는 개념을 사용해 메모리 관리를 수행 한다.
‘도달 가능한(reachable)’ 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미 한다. 도달 가능한 값은 메모리에서 삭제되지 않는다.
예시
- 현재 함수의 지역 변수와 매개변수
- 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
- 전역 변수
- 기타 등등
이런 값은 루트(root) 라고 부른다.
루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 된다.
내부 알고리즘
'mark-and-sweep’이라 불리는 가비지 컬렉션 기본 알고리즘이 있는데 '가비지 컬렉션’은 대개 다음 단계를 거쳐 수행 된다.
- 가비지 컬렉터는 루트(root) 정보를 수집하고 이를 ‘mark(기억)’
- 루트가 참조하고 있는 모든 객체를 방문하고 이것들을 ‘mark’
- mark 된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 mark, 한번 방문한 객체는 전부 mark 하기 때문에 같은 객체를 다시 방문하는 일은 없다.
- 루트에서 도달 가능한 모든 객체를 방문할 때까지 위 과정을 반복
- mark 되지 않은 모든 객체를 메모리에서 삭제
중요한 점은 루트를 출발지로해서 참조가 되어 도달 가능한 객체여야 삭제가 안된다는 점이다. 루트가 접근할 수 없고 지들끼리 참조하는 객체 덩어리를 "도달할 수 없는 섬(Unreachable Island)"이라고 한다.
최적화 기법
- generational collection(세대별 수집) : 오래된 객체와 새로운 객체를 구분하여, 새로운 객체는 엄격하게 감시하여 제거하고 오래된 객체는 덜 감시함.
- incremental collection(점진적 수집) : 방문해야할 객체가 많으면 부하가 높아진다. 모든 객체를 한번 다 방문하지말고, 여러부분으로 나누어 점진적으로 GC를 진행한다. 그 차이로 인한 변경사항을 추적하는데 추가작업이 필요하다.
- idle-time collection(유휴 시간 수집) : CPU 부하를 덜 주기위하여, idle 상태에서만 GC를 실행함.
가비지 컬렉션은 엔진이 자동으로 수행하기 때문에 개발자가 이것을 강제로 실행하거나 중단 시킬 수 없다. 하지만 이렇게 메모리 관리가 되고 있다는 것은 알고 있자.
'오늘 뭐했냐 > 개발에 대한 주저리' 카테고리의 다른 글
GraphQL (0) | 2023.10.24 |
---|---|
23.10.20 (JS에서의)this (0) | 2023.10.20 |
23.10.18 CommonJS와 ES6 (0) | 2023.10.18 |
23.10.14 프로토타입 (0) | 2023.10.16 |
23.10.13 태스크 큐 (0) | 2023.10.16 |