[javascript] 자바스크립트의 가비지 컬렉션 기법

자바스크립트는 동적인 언어로, 메모리 관리를 개발자가 직접 처리할 필요가 없다는 장점이 있습니다. 이를 가능하게 하는 것이 바로 가비지 컬렉션(Garbage Collection) 기법입니다.

가비지 컬렉션은 더 이상 사용되지 않는 메모리를 자동으로 찾아내고 회수하는 기술입니다. 이를 통해 개발자는 메모리 누수(memory leak)나 동적 할당 문제를 신경 쓰지 않고도 코드를 작성할 수 있습니다.

가비지 컬렉션 알고리즘

자바스크립트 엔진은 다양한 가비지 컬렉션 알고리즘을 사용하여 메모리 관리를 수행합니다. 여기에는 다음과 같은 주요 알고리즘이 있습니다.

  1. 참조 카운팅(Reference Counting): 객체가 생성될 때마다 해당 객체의 참조 횟수를 증가시키고, 참조가 해제될 때마다 해당 객체의 참조 횟수를 감소시킵니다. 참조 횟수가 0이 되면 해당 객체는 사용되지 않는 것으로 간주되고 회수됩니다.
    • 하지만 순환 참조(circular reference)와 같은 경우에는 참조 횟수가 0이 되더라도 회수되지 않을 수 있습니다.
  2. 마크 앤 스위프(Mark and Sweep): 사용되지 않는 객체를 찾아내기 위해 두 단계로 나누어 진행됩니다.
    • 첫 번째 단계에서는 루트(root)로부터 시작하여 모든 객체를 순회하며 사용 중인 객체를 마킹합니다.
    • 두 번째 단계에서는 마킹되지 않은 객체는 사용되지 않는 것으로 판단하고 회수합니다.
  3. 세대별(Mark and Compact): 메모리 공간을 여러 세대로 나누어 관리하여 성능을 향상시키는 알고리즘입니다. 이를 위해 객체의 생명 주기에 따라 여러 세대로 구분하여 가비지 컬렉션을 수행합니다.

최신 가비지 컬렉션 기법

가비지 컬렉션 기법은 지속적으로 발전하며 최신의 기법은 다음과 같습니다.

  1. 영역 기반(Memory Region): 메모리 공간을 여러 개의 영역으로 나눔으로써 세밀한 가비지 컬렉션 수행이 가능해집니다. 이를 통해 메모리 회수의 실행 속도 및 품질이 개선됩니다.

  2. 기준에 따른 분할(Generational): 최근에 생성된 객체는 일반적으로 오래된 객체보다 더 빈번하게 참조됩니다. 이러한 특성을 이용하여 최근 객체와 오래된 객체를 분리하여 가비지 컬렉션을 수행하면 성능이 향상됩니다.

  3. 즉시 회수(Eager Collection): 사용 중인 객체가 아닌 객체를 바로 회수하는 방식입니다. 이를 통해 가비지 컬렉션 주기를 최소화하여 성능을 개선할 수 있습니다.

결론

가비지 컬렉션은 자바스크립트의 핵심 기능 중 하나로, 메모리 관리를 간소화하여 안정성과 생산성을 높여줍니다. 자바스크립트 엔진은 다양한 가비지 컬렉션 알고리즘과 기법을 사용하여 최적의 성능을 제공하며, 이를 이해하고 활용하는 것은 개발자에게 중요한 역량입니다.

더 자세한 내용은 아래 참고 자료를 참고하시기 바랍니다.

참고 자료