Home 가비지 컬렉션 Garbage Collection
Post
X

가비지 컬렉션 Garbage Collection

메모리 관리

자바스크립트는 고수준 언어로 자체적으로 메모리 관리를 해줍니다.

하지만, 최적화된 코드로 메모리 누수 없이 관리하기 위해서 자바스크립트 메모리 관리 방식에 대해 알아둘 필요가 있습니다.


메모리 생명 주기

자바스크립트에서 메모리 생명 주기는 대부분의 프로그래밍 언어와 비슷합니다.

  1. 필요할 때 할당하고
  2. 할당된 메모리를 사용하고
  3. 필요하지 않다면 해제합니다.

메모리 할당

자바스크립트는 값을 선언할 때 자동으로 메모리를 할당합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var n = 123; // 정수를 담기 위한 메모리 할당
var s = "azerty"; // 문자열을 담기 위한 메모리 할당

var o = {
  a: 1,
  b: null,
}; // 오브젝트와 그 오브젝트에 포함된 값들을 담기 위한 메모리 할당

// (오브젝트처럼) 배열과 배열에 담긴 값들을 위한 메모리 할당
var a = [1, null, "abra"];

function f(a) {
  return a + 2;
} // 함수를 위한 할당(함수는 호출 가능한 오브젝트)

// 함수식 또한 오브젝트를 담기 위한 메모리를 할당합니다.
someElement.addEventListener(
  "click",
  () => {
    someElement.style.backgroundColor = "blue";
  },
  false
);

메모리 사용

기본적으로는 할당된 메모리를 읽고 쓰는 것을 의미합니다.

변수나 객체 속성의 값을 읽고 쓰거나 함수 호출 시 함수에 인수를 전달하여 수행할 수 있습니다.


메모리 해제

할당된 메모리가 더 이상 필요없을 때 메모리를 해제합니다.

자바스크립트에서는 가비지 콜렉션 Garbage Collection 이라는 자동 메모리 관리 방법을 사용합니다.

GC의 목적은 메모리 할당을 추적하고 더 이상 필요하지 않게 되었다면 회수하는 것입니다.

그렇다면 GC는 필요 없어졌다 를 어떻게 판단할까요?


가비지 컬렉션 기준

자바스크립트는 메모리 관리를 수행할 때 도달 가능성(reachability)이라는 개념을 사용합니다.

어떤 값들이 더 이상 도달이 불가능한 경우 가비지컬렉션의 대상이 됩니다.

도달 가능한 값은 어떻게든 접근하거나 사용할 수 있는 값을 의미하며 메모리에서 절대 삭제되지 않습니다.

아래의 값들은 처음부터 도달 가능한 값으로 root라고 부릅니다.

  • 현재 함수의 지역 변수와 매개변수
  • 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
  • 전역 변수

root가 참조하는 값이나 체이닝을 통해 참조할 수 있는 값을 도달 가능한 값으로 구분합니다.


Mark-and-sweep 알고리즘

Mark-and-sweep알고리즘은 다음 단계를 거쳐 수행됩니다.

  1. GC는 root 정보를 수집하고 이를 mark(표시)합니다.
  2. root가 참조하고 있는 모든 객체를 방문하고 이것들을 mark합니다.
  3. mark된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 mark합니다.
  4. 한번 방문한 객체는 전부 mark하기 때문에 같은 객체를 다시 방문하지는 않습니다.
  5. root에서 도달 가능한 모든 객체를 방문할 때까지 위의 과정을 반복합니다.
  6. mark되지 않은 모든 객체를 메모리상에서 삭제합니다.

mark-and-sweep


간단 예시

1
2
3
let user = {
  name: "joohyun",
};

전역 변수 user는 메모리 힙에 저장된 객체를 참조합니다.

1
user = "psmin";

user를 변경하면 메모리 힙의 객체로 접근할 방법이 사라집니다.

이 때 가비지 컬렉션이 실행되어 해당 객체의 메모리 할당을 해제합니다.


정리

Javascript는 메모리 생명주기를 가비지 컬렉션을 통해 자동으로 관리해줍니다.

메모리 해제 과정에서 Mark-and-sweep 알고리즘을 사용합니다.

이 알고리즘은 객체가 도달 가능한 상태가 아닐 때 메모리를 해제합니다.

가비지 컬렉션은 JS 엔진이 자동으로 수행합니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.