IT_Programming/JavaScript

자바스크립트 완벽가이드 - 4.5 가비지 컬렉션

JJun ™ 2010. 7. 4. 18:54


참조 타입은 크기가 고정되어 있지 않다. 참조 타입 중 몇 가지는 경우에 따라선 매우 커질 수도 있다.

이미 앞에서 설명했듯이 참고되는 값은 변수에 직접 담기지 않는다. 그 값은 어딘가 다른 위치에 저장되어

있고, 변수는 그저 그 위치에 대한 참조를 담고 있을 뿐이다. 여기서는 그 값을 실제로 담고 있는 저장소에

대해 잠시 생각해 보자.


문자열, 객체, 배열 등은 크기가 정해져 있지 않다. 따라서 이들을 담기 위한 저장소는 그 크기를 알 수 없는 상태에서 동적으로 할당되어야 한다. 자바스크립트 프로그램에서 문자열이나 배열, 또는 객체 등을 생성할 때마다, 인터프리터는 해당 개체를 저장하기 위한 메모리를 할당해야 한다. 이렇게 동적으로 할당된 메모리는 언젠가는 반드시 해제되어 재활용될수 있어야 한다. 그렇지 않으면 자바스크립트 인터프리터가 시스템의 모든 가용 메모리를 잡아먹어 결국은 시스템이 다운되고 말 것이다.


C, C++ 같은 언어에서는 반드시 수동으로 메모리를 해제해야만 한다. 프로그래머는 생성된 객체들을 계속

추적하고 더이상 필요가 없을 때엔(메모리를 해제하여) 소멸시켜야만 한다. 이러한 작업은 귀찮기도 하거니와 종종 버그를 낳곤 한다.


자바스크립트에서는 프로그래머가 수동으로 메모리를 해제하도록 강제하지 않는 대신, 가비지 컬렉션이라

불리는 기술에 의존한다. 자바스크립트 인터프리터는 어떤 객체가 어느 시점부터 프로그램에서 더이상

쓰이지 않는지 알아챌 수 있다. 어떤 객체가 더이상 접근할 수 없다고 판명되면 (즉, 프로그램의 변수에서

그 객체를 참조할 방법이 없으면) 해당 객체가 더이상 필요치 않다는 의미이므로 할당했던 메모리를 회수해도 좋은 것이다. 다음의 예를 살펴보자.


     var s = "hello";                 // 문자열을 위한 메모리를 할당한다.
     var u = s.toUpperCase();  // 새로운 문자열을 생성한다.
     s = u;                             // 원래의 문자열에 다른 참조를 덮어 쓴다.


위의 코드가 실행된 이후로는 원래의 문자열 "hello"에 더이상 접근할 수 없다.

프로그램 상의 어떤 변수에도 그에 대한 참조가 없다. 시스템에선 이 사실을 파악하고,

원래의 문자열에 할당되었던 메모리를 해제하여 재활용될 수 있게 한다.


가비지 컬렉션은 프로그래머에게 보이지 않고 자동적으로 일어난다.

여러분이 얼마든지 가비지 객체를 생성하고 다니더라고 시스템이 이를 따라다니면서

깨끗이 청소해줄 것이다. 여러분은 그저 이 사실만 알고 가비지 컬렉션을 믿으면 된다.