가비지 컬렉션
가비지 컬렉션
JS 엔진은 쓸모없어 지는 것들을 찾아내 삭제함
-
가비지 컬렉션 기준
도달 가능성 이라는 개념 사용해 메모리 관리
-
‘도달 가능한 값’
어떻게든 접근하거나 사용할 수 있는 값 메모리에서 삭제되지 않음 도달할 수 없는 상태가 되면 메모리에서 삭제.
-
태생부터 도달 가능한 값
루트
-
루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값.
-
참조 두 개
조할 수 있는 값이 하나라도 있을 경우 삭제되지 않음
-
연결된 객체
외부로 나가는 참조는 도달 가능한 상태에 영향주지 않고 삭제됨 외부에서 들어오는 참조만이 도달 가능한 상태에 영향을 주고 삭제되지 않음
-
도달할 수 없는 섬
객체들이 연결되어 섬 같은 구조가 만들어졌을 때 이 섬에 도달할 방법이 없는 경우 구성요소 전부 메모리에서 삭제
-
내부 알고리즘
‘mark-and-sweep’ 이라 불리는 가비지 컬렉션 기본 알고리즘
단계
-
루트 정보 수집하고 이를 ‘mark’(기억)
-
루트가 참조하고 있는 모든 객체 방문하고 이를 ‘mark’
-
mark 된 모든 객체 방문하고 그 객체들이 참조하는 객체도 ‘mark’
-
한번 방문한 객체는 전부 mark 하기 때문에 같은 객체 방문하는 일 없음
-
루트에서 도달 가능한 모든 객체 방문할 때까지 위 과정 반봅
-
mark 되지 안흔 모든 객체 메모리에서 삭제
-
-
최적화 기법
JS 엔진은 실행에 영향 미치지 않으면서 가비지 컬렉션 더 빠르게 하는 최적화 기법 적용
- generational collection (세대별 수집)
객체를 ‘새로운 객체’ 와 ‘오래된 객체’로 나눔 빠르게 쓸모가 없어지는 객체를 ‘새로운 객체’로 구분하고 가비지 컬렉터가 공격적으로 제거 일정 기간 살아남은 객체를 ‘오래된 객체’로 나누고 컬렉터가 덜 감시
- incremental collection (점진적 수집)
모든 객체 한번에 방문하고 mark 시 시간 오래 걸리고 리소스 낭비로 실행속도 느려짐 방지 위해 컬렉터 여러 부분으로 분리하고 각 부분 별도로 수행 긴 지연시간 짧은 지연 여래가로 분산 시키는 장점
- idle-time collection (유휴시간 수집)
실행에 주는 영향 최소화 하기 위해 CPU 유휴일 때만 가비지 컬렉터 실행
요약
-
JS 엔진은 쓸모없어지는 것들 찾아내 제거하는 가비지 컬렉션 실행
-
가비지 컬렉션 기준은 도달 가능성 사용
-
도달 가능성 은 루트에서, 루트가 참고하는 값이나 체이닝으로 루트에서 참조할 수 있는 값
-
내부 알고리즘은 ‘mark-and-sweep’ 으로 루트에서 밑으로 내려가며 ‘mark’ 하고 mark 되지 않은 값 삭제하는 방식
-
최적화 기법은 세대별 수집, 점진적 수집, 유휴시간 수집
-
세대별 수집은 객체를 ‘새로운 객체’ 와 ‘오래된 객체’로 나루고 빠르게 쓸모가 없어지는 객체를 ‘새로운 객체’로 구분하고 가비지 컬렉터가 공격적으로 제거
-
점진적 수집은 모든 객체를 한번에 방문할 하지 않고 컬렉터 여러 부분으로 나눠서 각 부분 별도로 수행해서 지연 시간을 단축 시킴
-
유휴시간 수정은 실행에 주는 영향 최소화하기 위해 CPU 유휴 일 때만 실행