
자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어로서 가비지 콜렉터를 통해 메모리 누수를 방지한다. 프로그래밍 언어는 메모리 관리 방식에 따라 언매니지드 언어와 매니지드 언어로 분류할 수 있다. 언매니지드 언어는 메모리 제어를 개발자가 주도할 수 있지만 자바스크립트 같은 매니지드 언어는 메모리 할당 및 해제를 위한 메모리 관리 기능을 언어 차원에서 관리하고 개발자의 직접적인 메모리 제어를 허용하지 않는다.
💡 가비지 콜렉터란 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여
더 이상 사용되지 않는 메모리를 해제하는 기능을 말한다. 더 이상 사용되지 않는 메모리란 간단히 말하자면어떤 식별자도 참조하지 않는 메모리 공간을 의미한다.
함수 호출이 끝나면 함수에 대응하는 렉시컬 환경이 메모리에서 제거된다. 함수와 관련된 변수들은 이때 모두 사라진다. 함수 호출이 끝나면 관련 변수를 참조할 수 없는 이유가 바로 여기에 있다. 자바스크립트에서모든 객체는 도달 가능한 상태일 때만 메모리에 유지된다.
그런데 호출이 끝난 후에도 여전히 도달 가능한 중첩 함수가 있을 수 있다. 이때는 이중첩 함수의 [[Environment]] 프로퍼티에 외부 함수 렉시컬 환경에 대한 정보가 저장된다. 도달 가능한 상태가 되는 것이다.함수 호출은 끝났지만 렉시컬 환경이 메모리에 유지되는 이유는 바로 이 때문이다.해당 렉시컬 환경 객체를 참조하는 중첩 함수가 하나라도 있으면 사라지지 않는다.
전역 변수는 앱이 종료될 때까지 계속 메모리에 유지된다. 그렇기 때문에 가급적이면 전역 변수를 사용하지 않는 것이 좋다. 변수는 최대한 필요한 곳에서 선언해서 쓰는 것이 좋다. 클래스, 모듈, 함수, 조건문, 블록 안에서 또는 가까운 곳에서 선언하여 쓰는 것이 좋다.
지역 변수를 선언하면 블록에 진입하면서 변수가 선언되고, 메모리에 탑재되고, 블록이 끝나면 메모리가 자동으로 정리된다. 즉, 블록 내부에서만 존재하고, 블록이 끝나면 가비지 컬렉터에 의해서 소멸된다. 함수 내부에서도 블록 안에서 필요한 경우에는 필요한 곳에서 블록 안에서 변수를 선언하고 사용해야 한다.
자바스크립트 엔진 백그라운드 프로세스가 청소해 준다. 하지만 이것는 CPU가 하기 때문에 최대한 불필요한 메모리를 할당하거나 재할당하지 않고, 필요한 만큼 사용하는 것이 좋다.
정리
- 개발자가 명시적으로 메모리를 할당하고 해제할 수 없다.
더 이상 사용되지 않는 메모리를 해제하는 기능- 모든 객체는
도달 가능한 상태일 때만 메모리에 유지- 해당 렉시컬 환경 객체를
참조하는 중첩 함수가 하나라도 있으면 사라지지 않는다.- 변수는 최대한
필요한 곳,가까운 곳에 선언해서 사용한다.- 최대한
불필요한 메모리를 할당하거나 재할당하지 않고, 필요한 만큼 사용하는 것이 좋다.