[javascript] 메모리 관리를 위한 자바스크립트의 메모리 할당 전략

자바스크립트는 동적으로 타입을 추론하고, 가비지 컬렉션을 통해 메모리를 관리하는 언어입니다. 이러한 특성으로 인해 개발자는 명시적으로 메모리를 할당하거나 해제할 필요가 없습니다. 그러나 자바스크립트의 내부적인 메모리 할당 전략을 이해하는 것은 성능 향상과 메모리 누수를 예방하는 데 도움이 됩니다.

스택과 힙

자바스크립트는 메모리를 스택(Stack)과 힙(Heap)의 두 가지 영역에 할당합니다. 스택은 원시 타입의 값과 함수의 호출 스택 프레임을 저장하는 공간입니다. 스택의 특징은 LIFO(Last In First Out) 구조로 데이터를 저장하고 접근합니다.

힙은 객체와 배열과 같은 동적인 데이터 구조를 저장하는 공간입니다. 힙의 특징은 할당된 메모리 공간이 동적으로 변경될 수 있으며, 객체 사이의 연결 관계를 표현할 수 있습니다.

가비지 컬렉션

자바스크립트는 가비지 컬렉션을 통해 더 이상 사용되지 않는 메모리를 해제합니다. 가비지 컬렉션은 동작하는 방식에 따라 두 가지 유형으로 나뉩니다.

1. 참조 카운트 (Reference counting)

참조 카운트 방식은 객체를 참조하고 있는 다른 객체의 갯수를 추적하는 방식입니다. 참조 카운트가 0이 되는 순간 해당 객체는 사용되지 않는 것으로 판단되고, 가비지 컬렉터가 메모리를 해제합니다. 하지만 순환 참조(객체 간에 서로를 참조하는 경우)가 발생하면 메모리 누수가 발생할 수 있습니다.

2. 도달 가능성 (Reachability)

도달 가능성 방식은 각각의 객체가 직접 또는 간접적으로 어떤 객체에 의해 참조되고 있는지를 추적합니다. 도달 가능한 객체는 계속해서 사용되고 있으므로, 해당 객체 이외의 객체들은 가비지로 간주되고 메모리를 해제합니다. 이 방식은 순환 참조에 영향받지 않는 장점이 있습니다.

메모리 누수 방지

자바스크립트에서 메모리 누수를 방지하기 위해 몇 가지 주의해야 할 점이 있습니다.

  1. 불필요한 전역 변수 사용을 피하고 변수를 적절한 스코프에 선언하여 생명 주기를 관리합니다. 이는 메모리 관리와 함께 일관된 코드를 유지하는 데 도움이 됩니다.
  2. 이벤트 리스너 등록 후, 해당 이벤트를 제대로 해제하지 않으면 메모리 누수가 발생할 수 있습니다. 이벤트 리스너는 필요하지 않은 경우에는 반드시 제거해야 합니다.
  3. 큰 데이터 구조나 객체를 사용할 때는 필요한 경우에만 사용하고, 사용이 종료되면 메모리에서 해제합니다.
  4. 순환 참조를 주의해야 합니다. 어떤 객체들이 서로를 참조하는 경우, 가비지 컬렉터는 이를 해제하지 않기 때문에 메모리 누수가 발생할 수 있습니다. 순환 참조가 불가피한 경우에는 WeakMap 또는 WeakSet 등 약한 참조를 사용하여 메모리 누수를 방지할 수 있습니다.

결론

자바스크립트는 동적 타입 추론과 가비지 컬렉션을 통해 메모리를 관리합니다. 개발자가 명시적으로 메모리를 할당하거나 해제할 필요는 없지만, 메모리 할당 전략과 메모리 누수를 방지하는 방법을 이해하는 것은 애플리케이션의 성능과 안정성을 향상시킬 수 있습니다.


참고 자료: