JavaScript 가비지 콜렉션
업데이트:
가비지 콜렉션
자바스크립트는 실행환경에서 코드가 실행중에 주기적으로 메모리를 관리하는데 이것을 가비지 콜렉션이라고 부른다. 자바스크립트에서는 필요한 메모리를 자동으로 할당하고 사용되지 않는 메모리는 자동으로 회수되기때문에 개발자가 별도로 메모리 관리를 하지 않아도 된다.
기본동작 방식은 이렇다. 더이상 사용되지않을 변수를 찾아내어 해당 변수가 차지하고있던 메모리를 회수한다.
function a () {
var num = 123
return num;
}
a()
자바스크립트에서 함수는 한번 호출되면 실행되고서 소멸하게된다. 이때 내부에 있던 변수또한 소멸되는데 함수 내부에서 사용된 변수는 더이상 어딘가에서 도달할 수 없기때문에 메모리에서 제거된다.
function a () {
var num = 123
function b () {
num = 333
}
return b
}
a();
만약 위와같이 클로저가 사용된경우에는 a 라는 외부함수는 한번실행되고 소멸하지만 아직 내부의 b 함수가 외부함수에서 갖고있던 상태 num 에대해서 참조하고있기때문에 이때는 메모리에서 제거되지않는다.
브라우저에 탑재되어있는 자바스크립트 실행 엔진에 따라서 이 가비지콜렉션의 동작방식이 약간씩 다를 수 있고 계속적으로 업데이트될 수 있는 사항이기도하다. 이 중 두가지 방법을 흔히 사용하는데 표시하고 지우기, 그리고 참조 카운팅이 있다. 이 둘중에서는 표시하고 지우기 (mark-and-sweep)방법이 가장 널리 사용되고 있다.
표시하고 지우기 (mark-and-sweep)
가비지콜렉터가 작동하면 메모리에 저장된 변수 전체에 표시를 남기고 그다음 컨텍스트에 있는 변수와 컨텍스트에 있는 변수가 참조하는 변수에서 표시를 지운다. 이 과정을 거친후 표시가 남아있는 변수는 컨텍스트와 무관하기때문에 삭제를 진행한다.
메모리관리
자바스크립트는 특성상 웹 브라우저에 탑재되어있는 엔진에 따라 메모리관리가 이루어지고 있다. 그렇다고 성능을 전혀 신경안써도 되는것은 아니다. 가능한 최소한의 메모리사용을 만들어 성능을 향상시킬 수 있는데 코드상에서 필요한 데이터만 유지하는 방법이 있다. 바로 null 을 할당하여 참조를 제거하는 방법이다.
수동으로 참조를 제거해야할 대상은 주로 전역변수 및 전역객체의 프로퍼티이다. 지역변수는 컨텍스트를 빠져나가는 순간 자동으로 참조가 제거되기때문이다.
function createPerson(name) {
var localPerson = new Object();
localPerson.name = name;
return locaPerson;
}
let globalPerson = createPerson("kang");
// globalPerson 사용코드
globalPerson = null;
createPerson 은 실행되고 소멸되기때문에 내부에있는 localPerson 에 대해서 참조제거를 해줄필요는 없다. 그러나 globalPerson 은 전역변수로 사용되었으므로 더이상 사용하지않을때 null 을 명시해주어서 참조를 제거해 주어야 한다.
참조를 제거한다고해서 바로 메모리에서 제거되는것은 아니고 참조를 제거해 두면 가비지콜렉션이 동작할때 메모리를 회수할 수 있도록 해주는것이다.
댓글남기기