[javascript] 객체의 메모리 관리와 사이클 참조 문제

JavaScript에서는 객체의 메모리 관리가 자동으로 이루어지며, 이를 가비지 컬렉션(Garbage Collection)이라고 합니다. 하지만 때때로 객체 간의 사이클 참조로 인해 메모리 누수가 발생할 수 있습니다. 이때는 명시적으로 참조를 해제해주어야 합니다.

메모리 관리

JavaScript의 가비지 컬렉션은 더 이상 사용되지 않는 객체를 탐지하고 자동으로 메모리에서 제거합니다. 이를 위해 JavaScript 엔진은 도달 가능성(Reachability)을 기준으로 객체를 관리합니다. 도달 가능한 객체는 적어도 하나 이상의 루트(root) 객체에서 직접적이거나 간접적으로 도달할 수 있는 객체를 말합니다.

사이클 참조

그러나 두 개 이상의 객체가 서로를 참조하는 상황이 발생하면, 가비지 컬렉터는 이들을 메모리 누수로 여기지 않고 계속해서 유지됩니다. 이는 필요 없는 객체가 계속 살아있게 되어 메모리 누수를 발생시킬 수 있습니다.

사이클 참조 문제 해결 방법

이러한 사이클 참조 문제를 해결하기 위해서는 약한 참조(WeakMap, WeakSet)를 활용하거나 명시적으로 참조를 해제하는 방법을 사용할 수 있습니다. 예를 들어, 객체 간의 참조가 더 이상 필요하지 않을 때 null을 할당하여 참조를 해제하는 것이 그 예입니다.

let obj1 = {};
let obj2 = {};

obj1.ref = obj2;
obj2.ref = obj1;

// ... 객체들의 참조가 더 이상 필요하지 않은 시점

obj1.ref = null;
obj2.ref = null;

결론

JavaScript에서는 객체의 메모리 관리를 가비지 컬렉터가 담당하지만, 사이클 참조로 인한 메모리 누수 문제에 주의해야 합니다. 약한 참조를 활용하거나 명시적으로 참조를 해제하는 방법을 통해 메모리 누수 문제를 방지할 수 있습니다.

참고 자료