[javascript] 가비지 컬렉션에 영향을 주는 참조 유형과 패턴

가비지 컬렉션(Garbage Collection)은 자바스크립트에서 메모리를 관리하는 중요한 프로세스입니다. 자바스크립트 엔진은 더 이상 필요하지 않은 객체 또는 변수를 감지하고 자동으로 해제하여 메모리 사용을 최적화합니다. 따라서 개발자는 메모리 관리에 대해 고려하지 않고도 코드를 작성할 수 있습니다.

하지만 가비지 컬렉션의 성능과 효율성은 애플리케이션의 성능과 직결됩니다. 따라서 가비지 컬렉션에 영향을 주는 참조 유형과 패턴을 알아두는 것이 중요합니다. 이를 통해 가비지 컬렉션의 효율성을 높이고 메모리 누수를 방지할 수 있습니다.

강력한 참조 (Strong Reference)

강력한 참조는 객체를 다른 변수나 속성에 할당하는 것을 말합니다. 이 경우 해당 객체는 참조를 가지고 있으며 가비지 컬렉션의 대상이 아닙니다. 객체에 대한 강력한 참조가 계속 유지되는 한 메모리는 계속 사용될 것입니다.

var obj = { name: "John" }; // 강력한 참조

강력한 참조를 제거하려면 해당 변수를 null 또는 undefined로 설정하거나 다른 객체로 할당해야 합니다.

obj = null; // 강력한 참조 제거

약한 참조 (Weak Reference)

약한 참조는 객체를 약한 맵(WeakMap)이나 약한 집합(WeakSet)에 저장하는 것을 말합니다. 약한 참조는 가비지 컬렉션의 대상이 될 수 있으며, 참조가 존재하지 않으면 해당 객체는 자동으로 메모리에서 해제됩니다.

var weakMap = new WeakMap();
var obj = { name: "John" }; // 약한 참조

weakMap.set(obj, "some value");

약한 참조를 통해 일시적으로 참조가 필요한 경우, 가비지 컬렉션에 의해 메모리에서 해제될 수 있도록 할 수 있습니다.

순환 참조 (Circular Reference)

순환 참조는 서로를 참조하는 객체들의 그룹을 말합니다. 이러한 경우 강력한 참조를 제거하는 것 만으로는 가비지 컬렉션을 수행할 수 없습니다. 자바스크립트 엔진은 감지되지 않은 순환 참조를 가비지 컬렉션으로 처리하지 못하고 메모리 누수를 발생시킬 수 있습니다.

var obj1 = { name: "John" };
var obj2 = { name: "Jane" };

obj1.child = obj2;
obj2.parent = obj1;

obj1 = null;
obj2 = null; // 순환 참조가 여전히 존재함

순환 참조를 방지하려면 강력한 참조 대신 약한 참조를 사용하거나, 순환 참조를 생성하지 않도록 설계해야 합니다.

결론

가비지 컬렉션은 자바스크립트에서 메모리 관리를 도와주는 중요한 프로세스입니다. 올바른 참조 유형과 패턴을 사용하면 가비지 컬렉션의 성능과 효율성을 향상시킬 수 있습니다. 강력한 참조, 약한 참조, 순환 참조를 올바르게 이해하고 적절히 사용하는 것이 메모리 누수를 방지하고 자바스크립트 애플리케이션의 성능을 향상시키는 데 도움이 됩니다.


참조: