본문 바로가기

programming study/JavaScript

기초 JS, CS 상식 - 메모리 심화

본 내용은 프로그래머스의 코딩테스트 광탈 방지 A to Z : JavaScript 강의를 토대로 작성하였습니다.

1. JS 변수 선언 과정

  • 변수 고유 식별자 생성
  • 메모리에 주소 할당
  • 생성한 주소에 값을 넣음

2. 특징

  • 선언한 상수나 변수는 메모리 주소를 바라봄
  • 새로운 변수에 기존 변수를 대입하면
    • 값이라면, 기존 변수의 메모리 주소를 참조
    • 기존 변수에 조작(변경)이 일어나면, 새로운 메모리 주소를 할당 받고 그것의 값을 넣게 됨
    • 원시타입은 변경이 불가능하기 때문
    • 원시타입의 값이 변경될 때는 새로운 메모리가 할당 됨

3. 가상 머신

  • Virtual Machine
  • 자바스크립트 엔진은 가상 머신으로 구성되어 있음
  • 메모리 모델이 구현되어 있음
    • Heap, Call Stack

Heap & Call Stack

  • Heap: 참조 타입
    • 배열, 객체
    • 동적으로 크기가 변함
    • 배열에 값을 추가하면, 그대로 할당 됨(배열을 상수로 선언해도 값이 추가 가능한 이유)
  • Call Stack: 원시 타입
    • 스택처럼 하나씩 쌓임
  • Call Stack에 선언된 배열 변수는 Heap에서 생성된 배열의 메모리 주소를 참조
  • 상수이어도, push가 동작하는 이유는 Call Stack에 할당된 메모리를 변경하는 것이 아닌 Heap 메모리를 변경하는 것이기 때문

Garbage Collector

  • 사용을 마친 메모리는 Garbage Collector가 정리 함
    • 현대적인 브라우저의 GC는 Mark And Sweep Algorithm으로 동작
  • Mark And Sweep Algorithm
    • 브라우저의 최상위 객체인 윈도우에서 시작하여, 닿을 수 없는 곳은 필요 없는 주소라 가정하고 지움
  • 메모리에 저장된 값이 아무도 참조하지 않으면 GC가 삭제

Reference

프로그래머스의 코딩테스트 광탈 방지 A to Z : JavaScript