JS엔진은 코드부, 힙공간, 스택공간의 3가지 메모리주소 공간을 갖습니다. 이를 하나로 묶어 프로그램의 주소 공간이라 일컫죠.
하나씩 알아봅시다.
Code Area
Call STACK
- Call Stack은 실행중인 함수를 추적하는 공간으로, 로직을 수행하고 지역변수를 저장하는 공간입니다. 변수들은 LIFO형식으로 저장되며, 원시타입들이 여기에 저장됩니다.
Heap
- Heap은 참조 타입들이 할당되는 곳입니다. 콜스택과 달리 메모리 할당이 LIFO정책이 아닌 랜덤하게 배치되는 곳이죠. JS엔진은 메모리관리자(자바의 가비지 컬렉터와 같은 개념)이 상주하고있습니다. 이 메모리관리자는 힙공간의 메모리를 탐지하며 메모리누수를 방지합니다.
가비지 컬렉션
프로그래밍 언어와 상관없이 메모리 생성 주기는 다음과 같습니다.
- 필요 메모리 할당
- 메모리를 사용함
- 필요없어진 메모리를 비워줌
가비지 컬렉션은 3번, 변수의 필요 유무를 판단하고 메모리에서 제거해줍니다. 즉, 자동 메모리 관리자 정도로? 해석할 수 있죠. 가비지 컬렉션은 Mark Sweep 알고리즘을 가장 흔히 차용햐여 이루어집니다. 사실 저도 잘 몰라서... 찾아보시면 가비지 컬렉션의 동작원리를 알 수 있을 것 같습니다.
자바스크립트는 싱글스레드?