#17 - 가비지 컬렉션

arthyun·2023년 6월 14일
0

JavaScript의 모든것

목록 보기
17/18
post-thumbnail

가비지 컬렉션?

자바스크립트는 눈에 보이지 않는 곳에서 메모리 관리를 수행합니다.
원시값, 객체, 함수 등 우리가 만드는 모든 것은 메모리를 차지합니다. 그렇다면 더는 쓸모 없어지게 된 것들은 어떻게 처리될까요? 지금부턴 자바스크립트 엔진이 어떻게 필요 없는 것을 찾아내 삭제하는지 알아보겠습니다.

가비지 컬렉션 기준

자바스크립트는 도달 가능성(reachability) 이라는 개념을 사용해 메모리 관리를 수행합니다. ‘도달 가능한(reachable)’ 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미합니다. 도달 가능한 값은 메모리에서 삭제되지 않습니다.

  1. 아래 소개해 드릴값들은 그 태생부터 도달 가능하기 때문에, 명백한 이유 없이는 삭제되지 않습니다.

    예시:

    현재 함수의 지역 변수와 매개변수
    중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
    전역 변수
    기타 등등
    이런 값은 루트(root) 라고 부릅니다.

  2. 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됩니다. 전역 변수에 객체가 저장되어있다고 가정해 봅시다. 이 객체의 프로퍼티가 또 다른 객체를 참조하고 있다면, 프로퍼티가 참조하는 객체는 도달 가능한 값이 됩니다. 이 객체가 참조하는 다른 모든 것들도 도달 가능하다고 여겨집니다. 자세한 예시는 아래에서 살펴보겠습니다.

자바스크립트 엔진 내에선 가비지 컬렉터(garbage collector)가 끊임없이 동작합니다. 가비지 컬렉터는 모든 객체를 모니터링하고, 도달할 수 없는 객체는 삭제합니다.

//간단한 예시
// user엔 객체 참조 값이 저장됩니다.
let user = {
  name: "John"
};
  • 이 그림에서 화살표는 객체 참조를 나타냅니다. 전역 변수 "user"는 {name: "John"} (줄여서 John)이라는 객체를 참조합니다. John의 프로퍼티 "name"은 원시값을 저장하고 있기 때문에 객체 안에 표현했습니다.
user = null;
  • user의 값을 다른 값으로 덮어쓰면 참조(화살표)가 사라집니다.
  • 이제 John은 도달할 수 없는 상태가 되었습니다. John에 접근할 방법도, John을 참조하는 것도 모두 사라졌습니다. 가비지 컬렉터는 이제 John에 저장된 데이터를 삭제하고, John을 메모리에서 삭제합니다.

결론

  • 가비지 컬렉션은 엔진이 자동으로 수행하므로 개발자는 이를 억지로 실행하거나 막을 수 없습니다.
  • 객체는 도달 가능한 상태일 때 메모리에 남습니다.
  • 참조된다고 해서 도달 가능한 것은 아닙니다. 서로 연결된 객체들도 도달 불가능할 수 있습니다.

출처 - 가비지 컬렉션

profile
Junior Front-End Developer

0개의 댓글