일반적으로 메모리 생존주기는 프로그래밍 언어와 관계없이 비슷하다.
1. 필요할때 할당한다.
2. 사용한다. (읽기, 쓰기)
3. 필요없어지면 해제한다.
메모리 관리에서 이슈는 보통 3번에서 나타난다.
메모리를 해제할 때, 저수준의 언어(C, C++ 등)에서는 직접 해주어야 하지만 자바스크립트와 같은 고수준의 언어는 보통 백그라운드에서 가비지컬렉션이 동작하여 사용하지 않는 메모리는 해제해주도록 되어있다.
어떤 오브젝트도 참조하고 있지 않다면 더이상 필요없으므로 제거한다.
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();
이 알고리즘은 root(자바스크립트의 경우 전역객체)에서 child오브젝트들을 돌면서 root가 참조할 수 있는지 여부를 파악하여 닿을 수 없는 오브젝트인 경우 제거한다.
현재 모든 브라우저가 이 알고리즘을 사용하고 있으므로 순환참조는 문제가 되지 않는다.
수동으로 메모리를 해제하는것이 더 효율적인 경우가 있으나 지원하지 않는다.