가비지 콜렉션
자바스크립트도 자바와 마찬가지로 코드 실행 중 메모리를 관리합니다.
C나 C++같은 언어는 프로그래머가 직접 메모리를 관리해 줘야 하며, 이는 매우 골치아픈 작업입니다.
자바스크립트 같은 가비지콜렉션을 지원하는 언어는 필요한 메모리를 자동 할당하고, 더 이상 사용하지 않는 메모리를 자동으로 회수합니다.
원리
간단합니다.
더 이상 사용하지 않을 변수를 찾아내서 해당 변수가 차지하는 메모리를 회수합니다.
이 프로세스는 주기적으로 실행되며, 특정 시점에서 메모리를 회수하게 할 수도 있습니다.
사용여부 판단은?
그렇다면 어떻게 사용여부를 판단할 수 있는 걸까요?
사용여부 판단을 위해서 표시하기 지우기, 참조 카운팅 두 가지 중 하나의 방식을 사용합니다.
참조 카운팅은 순환참조 등에 문제가 있기때문에 일반적으로 표시하기 지우기를 많이 사용하고 있습니다.
표시하기 지우기
mark-and-sweep라 불리는 방식입니다.
변수가 특정 컨텍스트에서 사용할 것으로 정의되면 그 변수는 컨텍스트 안에 있는 것으로 표시 되며, 변수가 컨텍스트 밖으로 나가면 밖에 있다고 표시됩니다.
표시라는게 구현 방법이 다양하기 때문에 브라우저마다 조금씩 다르긴하지만 일반적으로 특정 비트를 on상태로 표시하거나 컨텍스트 내부, 외부를 나타내는 변수 목록을 따로 두거나 하는 방식으로 구현하고 있습니다.
표시가 됐다면 메모리 청소가 실행될 때마다 표시를 체크하여 메모리 정리를 합니다.
참조 카운팅
참조 카운팅은 널리 쓰이지는 않는 방식입니다.
각 값이 참조 되었는지 추적하여 카운트를 기록합니다.
값의 참조 카운트가 0이되면 사용할 일이 없으니 메모리를 회수합니다.
이 방식의 경우 순환참조 문제가 발생하면 메모리가 회수되지 않아서 문제가 됩니다.
순환 참조란 A와 B객체가 있을 때, A 객체가 B를 참조하고, B 객체가 A를 참조할 경우 서로 참조카운트가 줄어들지 않아 발생하는 오류입니다.
이에 대한 해결 방법으로는 순환참조한 변수에 null을 대입해줘서 참조를 끊어주는 방법이 있습니다.
가비지 컬렉션을 수동으로 실행할 수 있으나 추천하지는 않습니다.
일례로 IE에서는 window.CollectGarbage() 메서드 등으로 실행 할 수 있습니다.
마치며
가비지 컬렉션에 경우 일반적으로 브라우저에서 알아서 처리해 주기 때문에 개념만 간단하게 알아보았습니다.
다음 포스트에서는 자바스크립트에 참조타입들과 기능들에 대해서 알아보겠습니다.