TIL_20210330

가비지 컬렉션

  • 자바스크립트는 도달 가능성(reachability) 이라는 개념을 사용해 메모리 관리를 수행
  • ‘도달 가능한(reachable)’ 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값
  • 아래의 값들은 그 태생부터 도달 가능하기 때문에, 명백한 이유 없이는 삭제되지 아니함. 이러한 값들을 루트(root)라고 부름
    • 현재 함수의 지역 변수와 매개변수
    • 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
    • 전역 변수
  • 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값
// Example 1

let user = {
  name: "John"
};

let admin = user;
  1. user엔 객체 참조 값 저장
  2. user의 값을 다른 값으로 덮어쓰기
user = null;
  1. 전역 변수 admin을 통하면 여전히 객체 John에 접근할 수 있기 때문에 John은 메모리에서 삭제되지 아니함. 이 상태에서 admin을 다른 값(null 등)으로 덮어쓰면 John은 메모리에서 삭제
// Example 2

function marry(man, woman) {
  woman.husband = man;
  man.wife = woman;

  return {
    father: man,
    mother: woman
  }
}

let family = marry({
  name: "John"
}, {
  name: "Ann"
});
  1. 함수 marry는 매개변수로 받은 두 객체를 서로 참조하게 하고, 두 객체를 포함하는 새로운 객체를 반환

  2. 참조 삭제

delete family.father;
delete family.mother.husband;

  1. John은 이제 도달 가능한 상태가 아니기 때문에 메모리에서 제거. John에 저장된 데이터(프로퍼티) 역시 메모리에서 사라짐

  2. 가비지 컬렉션 후 메모리 구조

도달할 수 없는 섬

  • 객체들이 연결되어 섬 같은 구조를 만드는데, 이 섬에 도달할 방법이 없는 경우, 섬을 구성하는 객체 전부가 메모리에서 삭제
  • "family" 객체와 루트의 연결이 사라지면 루트 객체를 참조하는 것이 아무것도 없게 되어, 섬 전체가 도달할 수 없는 상태가 되고, 섬을 구성하는 객체 전부가 메모리에서 제거
family = null;

좋은 웹페이지 즐겨찾기