[TIL / JavaScript] 메모리 관리

Changyun Go·2022년 2월 18일
0
post-thumbnail

자바스크립트는 도달할 수 있는지를 기준으로 메모리를 정리한다.

변수에 값을 재할당할 때 기존에 사용하고 있는 메모리 공간을 지우고 재할당하는 게 아니라 새로운 메모리 공간을 확보해서 저장한다.

그렇다면 기존에 사용하던 메모리 공간은 어떻게 되는 것일까?

메모리 생존주기

  1. 메모리 할당(allocate)
  2. 메모리 사용(use) → 변수를 사용한 읽기와 쓰기
  3. 메모리 해제(release)
  • 자바스크립트는 managed 언어기 때문에 1번과 3번을 알아서 수행한다.

Garbage Collection

할당된 메모리가 더 이상 필요 없을 것을 추정해서 회수하는 것이다.

  • 가비지 컬렉터가 자바스크립트 엔진에서 끊임없이 동작하며 객체를 모니터링한다.

1. Reference Counting(과거 방식)

var x = {
  a: {
    b: 1
  }
};
var y = x.a;
var z = a.b;

y = null; // x는 가비지 컬렉션이 되지만 a는 여전히 참조되고 있다.
z = 2; // a 객체와 b 프로퍼티 모두 가비지 컬렉션이 된다.

객체에 참조가 하나도 없는 경우 가비지 컬렉션이 되는 방식이다.

function f () {
  var x = {};
  var y = {};
  x.a = y;         // x는 y를 참조한다.
  y.a = x;         // y는 x를 참조한다.
}

f();

그러나 스코프를 벗어난 쓸모없는 객체도 순환 참조로 인해 가비지 컬렉션이 되지 못하는 문제점이 있었다.

2. Mark and Sweep

참조가 아닌 도달할 수 있는지를 기준으로 메모리를 정리한다.

root(전역 변수와 현재 함수의 변수)에서 접근할 수 있는 모든 객체를 mark(기억)하고, mark 되지 않은 모든 객체는 가비지 컬렉션이 된다.

root에서 페인트를 들이부어서 도달 가능한 객체에 페인트가 칠해진다고 생각하면 된다.

  • 스코프를 벗어난 순환 참조도 결국 접근할 수 없는 객체기 때문에 가비지 컬렉션이 된다.
  • 현재 대부분의 브라우저가 가비지 콜렉션에서 Mark and Sweep 알고리즘을 사용한다.

Reference


0개의 댓글