[Deep JavaScript] 가비지 컬렉션

자바스크립트에서 가비지 컬렉션은 어떤식으로 동작할까?

*가비지 컬렉션(GC) : 프로그램 메모리 관리 기법으로 할당했던 메모리 중에서 불필요한 영역을 제거하는 기능이다.


가비지컬렉션 기준


  • 자바스크립트는 도달 가능성 이라는 개념을 사용해 메모리 관리를 수행합니다.

  • 도달 가능한 값은 어떻게든 접근하거나 사용할 수 있는 값을 의미합니다.

  • 도달 가능한 값은 메모리에서 삭제되지 않습니다.

  • ROOT의 참조 가능여부가 중요한 포인트입니다.


ROOT?


  1. 현재 함수의 지역 변수와 매개변수

  2. 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수

  3. 전역(global) 변수

위 값 들이 ROOT이며, 처음부터 도달 가능하기 때문에 명백한 이유 없이는 삭제되지 않습니다.

ROOT가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됩니다.


Example


객체 복사

const obj = {
     name : 'jo',
     age  : 28,
}
// obj 복사
const test = obj;
// obj 제거
obj = null;
  • 전역변수 test 통하면 여전히 객체 jo에 접근할 수 있기 때문에 test는 메모리에서 삭제되지 않습니다.
  • 이 상태에서 test에 다른 값(null 등)으로 덮어쓰면 jo은 메모리에서 삭제될 수 있습니다.

연결된 객체

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

    return {
        father: man,
        mother: woman
    }
}

let family = marry({
    name: "John"
}, {
    name: "Ann"
});
  • 메모리 구조는 아래와 같이 나타낼 수 있습니다.


  • John 도달 가능성 모두제거
delete family.father;
delete family.mother.husband;

  • John으로 들어오는 참조(화살표)는 모두 사라져 John은 도달 가능한 상태에서 벗어납니다.

  • 외부로 나가는 참조는 도달 가능한 상태에 영향을 주지 않습니다.
  • 외부에서 들어오는 참조만이 도달 가능한 상태에 영향을 줍니다.
  • John은 이제 도달 가능한 상태가 아니기 때문에 메모리에서 제거됩니다.
  • John에 저장된 데이터(프로퍼티) 역시 메모리에서 사라집니다.

요약


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

Reference

https://ko.javascript.info/

좋은 웹페이지 즐겨찾기