V8 엔진의 메모리 구조, GC(Garbage Collection)
V8 메모리 구조
힙 메모리
메모리에서 가장 큰 영역 차지, GC(가비지 콜렉션)이 발생하는 곳. (NEW영역과 OLD영역에서 GC 발생)
- NEW 영역 (Young generation) : 새로 만들어진 모든 객체 저장. 스캐벤져 (마이너 GC)가 관리
- OLD 영역 (OLD generation) : 마이너 GC가 두 번 발생하는 동안 NEW 영역에서 살아남은 객체들이 이동하는 영역. 포인터 영역과 데이터 영역으로 나뉨
- 포인터 영역 : 이 객체들은 다른 객체를 참조
- 데이터 영역 : 이 객체들은 데이터만 가짐
- 라지 오브젝트 영역 : 다른 영역의 제한된 크기보다 큰 객체들이 존재하는 곳
- 코드 영역 : 실시간 (JIT) 컴파일러가 컴파일 된 코드를 저장하는 영역. 유일하게 실행 가능한 메모리
- 셀 영역, 속성 셀 영역, 맵 영역
스택
메서드, 함수 프레임, 원시 값, 객체 포인터를 포함한 정적 데이터 존재
전역 스코프는 스택의 전역 프레임에 보관됨.
모든 함수 호출은 프레임 블록으로 스택 메모리에 추가됨.
반환값과 인자를 포함한 모든 지역변수들은 스택의 함수 프레임 안에 저장됨
함수 프레임이 반환(함수 종료)될 때 스택에서 제거됨
V8 메모리 관리 : 가비지 컬렉션
마이너 GC (스캐벤져)
NEW 영역에는 To 영역과 From 영역 존재. 대부분의 할당은 To 영역에서 이루어짐. To 영역이 가득차면 마이너 GC 발생
To 영역의 객체들 From 영역으로 이동 ⇒ 스택 포인터(GC 루트)에서부터 From 영역까지 메모리 사용한 객체 찾아 To 영역으로 이동, 포인터 갱신 ⇒ To 영역 압축하여 fragmentation 최소화
두번의 마이너 GC에서 살아남은 객체들은 Old 영역으로 이동한다.
메이저 GC
Old 영역을 관리하는 메이저 GC는 Mark-Sweep-Compact 알고리즘 이용.
- Marking : GC가 사용중인 객체를 식별. 스택 포인터(GC 루트)에서 재귀적으로 도달할 수 있는 객체들을 활성상태로 표시 (DFS)
- Sweeping : GC가 힙 메모리를 순회하면서 활성상태가 아닌 객체들의 메모리 주소를 기록, free-list에 등록
- Compacting : 모든 활성 상태 객체들을 이동시킴 ⇒ 파편화 줄이기
참고 내용
Leave a comment