V8 프로세스마다 하나의 스택을 가진다
프로그램이 제대로 작동하려면 메모리가 필요하고 그 때문에 메모리 관리가 필요하다
응용프로그램 수준에서 메모리 관리는 자동/수동으로 나뉘는데 대부분의 프로그램들의 자동 메모리 관리는 가비지 콜렉터가 맡고 있다
수동으로 메모리를 관리는 C언어등에서 malloc, free 등을 통해 관리하는 것이다
Node.js에는 가비지 수집기가 포함되어 있으므로 메모리 할당을 수동으로 관리할 필요가 없다
참조를 잃어 더이상 사용할 수 없는 객체들을 가비지 컬렉터가 자동으로 수집해서 메모리를 반환시켜준다
1
2
3
4
5
6
7
8
9
10
11
12
function Engine (power) {
this.power = power
}
function Car (opts) {
this.name = opts.name
this.engine = new Engine(opts.power)
}
let LightningMcQueen = new Car({name: 'Lightning McQueen', power: 900})
let SallyCarrera = new Car({name: 'Sally Carrera', power: 500})
let Mater = new Car({name: 'Mater', power: 100})
Mater = undefined
코드를 추가하면 Mater
객체가 참조를 잃고 더이상 접근할 수 있는 방법이 없기 때문에 가비지 콜렉터에 의해 수집당한다
이런 모양을 가지고 있다
New Space : From-space, To-space
Old Space : Pointer Space, Data Space
메이저 가비지 콜렉터의 알고리즘은 다음과 같은 단계를 거친다
마킹
현재 어떤 객체가 사용중인지 어떤 객체가 참조가 끊겨서 사용할 수 없는지를 판단한다 사용 중이거나 가능한 객체를 활성 상태로 마킹한다
스위핑
가비지 콜렉터가 힙을 순회하면서 1단계에서 마킹하지 않은 객체들의 메모리 주소를 기록한다 이제 이 객체들의 메모리 주소에는 다른 객체들이 들어갈 수 있다
압축
2단계가 끝난 후 모든 활성 객체들이 압축되어 메모리 공간의 효율을 높여 새 객체들의 할당 성능을 증가시킨다
메이저 GC는 앱을 잠시 멈추게하는데 이를 피하기 위해 다음과 같은 기술을 사용한다