코드를 입력하기 시작하면 자신도 모르는 사이에 Memory를 할당합니다. 할당된 Memory를 어떻게 관리하느냐에 따라 소프트웨어가 작동이 되더라고 Memory fault가 날 수도 있습니다.
JavaScript에는 실행 중에 RAM에 매핑되는 방식으로 프로그램에 할당된 Memory의
세 부분(code , stack, heap)이 있습니다. 이러한 결합을 "프로그램의 주소 공간" 이라고 합니다.
실행할 JavaScript 코드가 저장되는 영역입니다.
현재 실행 중인 함수를 추적하고, 계산을 수행하고, 로컬 변수를 저장합니다. 변수는 LIFO(Last In First Out) 방식으로 스택에 저장됩니다. 지역 변수가 여기에 저장됩니다.
const corn = 95
let lion = 100
여기에서 corn와 lion 값은 실행 중에 스택에 저장됩니다.
참조 데이터 타입이 할당됩니다. 스택과 달리 메모리 할당은 무작위로 배치되며, 힙의 메모리 누수를 방지하기 위해 JS 엔진에는 이러한 누수를 발생하지 않도록 방지하는 메모리 관리자(GC)가 있습니다.
class Animal {};
const tiger = new Animal();
let lion = {
strength: "Very Strong"
};
여기서 lion과 tiger는 참조형이며, 그 값은 힙에 저장되고 스택으로 푸시합니다.
스택의 값은 힙 위치의 메모리 주소를 보유합니다.
V8의 Garbage Collector는 heap에서 사용하지 않는 객체 참조를 찾고 Memory 공간 할당 해제하는 역할을 합니다. "Mark and Sweep 알고리즘"을 사용하여 참조되지 않은 객체를 찾아 표시한 다음, 이를 제거하는 것이 할당 해제입니다.
작업은 응용 프로그램의 root에서 시작되며, root에 저장된 모든 변수는 전역 변수입니다. 이러한 전역 변수는 항상 존재하고 활성인 것으로 표시됩니다. Mark and Sweep 알고리즘에는 Mark와 Sweep의 두 가지 주기가 있습니다.
Mark
전역 변수를 활성으로 표시하며, 이러한 전역 변수의 자식은 재귀적으로 검사되고 참조될 수 있는 모든 것은 mark됩니다.
Sweep
mark되지 않은 모든 변수를 수집하고 메모리 공간을 해제합니다.