객체 : 가비지 컬렉션

라용·2022년 11월 13일
1

모던 JavaScript 튜토리얼 내용 일부를 정리 요약한 내용입니다. 더 자세한 설명은 원문 링크를 참고하세요.

자바스크립트의 원시값, 객체, 함수 등 우리가 만드는 모든 것은 메모리를 차지하는데, 자바스크립트는 도달 가능성(reachability)이라는 개념을 사용해 메모리 관리를 수행합니다. 도달 가능한 값은 어떻게든 접근하거나 사용할 수 있는 값을 의미하며 도달 가능한 값은 메모리에서 삭제되지 않습니다.

현재 함수의 지역 변수와 매개변수, 중첩 함수의 체임에 있는 함수에서 사용되는 변수와 매개변수, 전역 변수 외에 기타 값들은 도달 가능하기 때문에 이유없이 삭제 되지 않습니다. 이런 값들을 루트 root 라고 부릅니다. 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됩니다. 자바스크립트 엔진 내에선 가비지 컬렉터가 끊임없이 동작하고 가비지 컬렉터는 모든 객체를 모니터링하고 도달할 수 없는 객체는 삭제합니다.

// 아래 user 에 객체 참조값이 저장 되었을 때 

let user = {
    name: "John"
};

// user 의 값에 다른 값을 덮어 씌우면

user = null;

// name: "John" 이라는 값은 접근할 수도 어딘가에서 참조할 수도 없는 값이 됩니다. 
// 가비지 컬렉터는 저장된 데이터를 삭제하고 메모리에서도 삭제합니다.
// 만약 user 를 다른 변수로 복사해서 두가지 변수가 참조를 한다면

let admin = user;

// admin 을 통해 접근할 수 있으르모 해당 값이 메모리에서 삭제되지 않습니다.

자바스크립트 엔진은 실행에 영향을 미치지 않으면서 가비지 컬렉션을 더 빠르게 하는 다양한 최적화 기법을 적용합니다. 객체를 새로운 객체와 오래된 객체로 나누어서 생성 후 역할을 수행하고 금방 쓸모가 없어지는 새로운 객체를 공격적으로 메모리에서 제거하고 오래 살아남은 객체는 덜 감시하는 세대별 수집이 있습니다. 그리고 방문해야 할 모든 객체들을 분리해서 긴 지연을 짧은 지연 여러개로 분산시키는 점진적 수집, CPU가 유휴 상태일 때만 가비지 컬렉션을 실행하는 유휴 시간 수집이 있습니다.


추가로 찾아본 것

MDN 에 기술된 자바스크립트 메모리 관리 내용 일부를 정리한 내용입니다.

자바스크립트는 객체가 생성될 때 자동으로 메모리를 할당하고 메모리가 필요하지 않게 되면, 자동으로 해제 한다. 이를 가비지 컬렉션이라고 한다. 메모리 생존주기는 프로그래밍 언어와 관계없이 비슷하다. 필요할 때 할당되고 할당된 메모리를 사용하고 (읽기, 쓰기) 필요하지 않으면 해제한다. 읽기와 쓰기는 거의 모든 언어에서 명시적으로 사용되지만 할당과 해제는 저수준 언어에서만 명식적이고 자바스크립트와 같은 고수준 언어에서는 암묵적으로 작동한다.

값이란 기본적으로 할당된 메모리를 읽고 쓰는 것을 의미한다. 변수나 객체 속성의 값을 읽고 쓰거나 함수 호출 시 함수에 인수를 전달해 수행할 수 있다. 이 때 '할당된 메모리가 더 이상 필요없을 때'를 알아내기 어렵기 때문에 대부분의 문제가 발생한다.

자바스크립트와 같은 고수준 언어들은 가비지 콜렉션이라는 자동 메모리 관리 방법을 사용한다. 가비지 콜렉터는 메모리 할당을 추적하고 할당된 메모리 블록이 더 이상 필요하지 않게 되었는지 판단하고 회수한다. 메모리의 필요여부를 판단하는 것이 비결정적이기 때문에 완벽한 방법이 아니다.

profile
Today I Learned

0개의 댓글