Javascript의 메모리 관리

han·2022년 1월 5일
0

일반적으로 메모리 생존주기는 프로그래밍 언어와 관계없이 비슷하다.
1. 필요할때 할당한다.
2. 사용한다. (읽기, 쓰기)
3. 필요없어지면 해제한다.
메모리 관리에서 이슈는 보통 3번에서 나타난다.
메모리를 해제할 때, 저수준의 언어(C, C++ 등)에서는 직접 해주어야 하지만 자바스크립트와 같은 고수준의 언어는 보통 백그라운드에서 가비지컬렉션이 동작하여 사용하지 않는 메모리는 해제해주도록 되어있다.

가비지 콜렉션

1. Reference-counting 알고리즘

어떤 오브젝트도 참조하고 있지 않다면 더이상 필요없으므로 제거한다.

예시

var x = {
    a: 1
}
var y = x.a; // x.a를 참조하는 오브젝트가 x, y 두개가 있다
x = null;
y = null; // 이 순간 a에 대한 참조가 없어지고 메모리가 해제된다.

한계

순환참조의 경우 영원히 해제되지 않는다.

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

func();

Mark-and-sweep 알고리즘

이 알고리즘은 root(자바스크립트의 경우 전역객체)에서 child오브젝트들을 돌면서 root가 참조할 수 있는지 여부를 파악하여 닿을 수 없는 오브젝트인 경우 제거한다.
현재 모든 브라우저가 이 알고리즘을 사용하고 있으므로 순환참조는 문제가 되지 않는다.

한계

수동으로 메모리를 해제하는것이 더 효율적인 경우가 있으나 지원하지 않는다.

reference

https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management#reference-counting_garbage_collection

0개의 댓글