JavaScript Memory

Hyor·2022년 8월 16일
0

코드를 입력하기 시작하면 자신도 모르는 사이에 Memory를 할당합니다. 할당된 Memory를 어떻게 관리하느냐에 따라 소프트웨어가 작동이 되더라고 Memory fault가 날 수도 있습니다.

Memory

JavaScript에는 실행 중에 RAM에 매핑되는 방식으로 프로그램에 할당된 Memory의
세 부분(code , stack, heap)이 있습니다. 이러한 결합을 "프로그램의 주소 공간" 이라고 합니다.

code

실행할 JavaScript 코드가 저장되는 영역입니다.

stack

현재 실행 중인 함수를 추적하고, 계산을 수행하고, 로컬 변수를 저장합니다. 변수는 LIFO(Last In First Out) 방식으로 스택에 저장됩니다. 지역 변수가 여기에 저장됩니다.

const corn = 95 
let lion = 100

여기에서 corn와 lion 값은 실행 중에 스택에 저장됩니다.

  • brower 의 경우 root 가 window 객체이며, node.js 의 경우 global 객체이다.

heap

참조 데이터 타입이 할당됩니다. 스택과 달리 메모리 할당은 무작위로 배치되며, 힙의 메모리 누수를 방지하기 위해 JS 엔진에는 이러한 누수를 발생하지 않도록 방지하는 메모리 관리자(GC)가 있습니다.

class Animal {};

const tiger = new Animal();

let lion = {
    strength: "Very Strong"
};

여기서 lion과 tiger는 참조형이며, 그 값은 힙에 저장되고 스택으로 푸시합니다.
스택의 값은 힙 위치의 메모리 주소를 보유합니다.

  • lion의 경우 object 를 선언하였기에 참조형 변수입니다.

Garbage Collector

V8의 Garbage Collector는 heap에서 사용하지 않는 객체 참조를 찾고 Memory 공간 할당 해제하는 역할을 합니다. "Mark and Sweep 알고리즘"을 사용하여 참조되지 않은 객체를 찾아 표시한 다음, 이를 제거하는 것이 할당 해제입니다.

Mark and Sweep

작업은 응용 프로그램의 root에서 시작되며, root에 저장된 모든 변수는 전역 변수입니다. 이러한 전역 변수는 항상 존재하고 활성인 것으로 표시됩니다. Mark and Sweep 알고리즘에는 Mark와 Sweep의 두 가지 주기가 있습니다.

  • Mark
    전역 변수를 활성으로 표시하며, 이러한 전역 변수의 자식은 재귀적으로 검사되고 참조될 수 있는 모든 것은 mark됩니다.

  • Sweep
    mark되지 않은 모든 변수를 수집하고 메모리 공간을 해제합니다.

참고문헌

https://blog.bitsrc.io/memory-leaks-in-nodejs-54ac7bbd4173

profile
개발 노트

0개의 댓글