👋 가비지 컬렉션 처리


가비지 컬렉션

  • 참조하는 object가 바뀌면 참조했던 오브젝트가 가비지 컬렉션 처리 됨
  • 가비지 컬렉션 처리

    let obj = new WeakMap();
    let sports = () => {
    point: 1;
    };
    obj.set(sports, '변경 전');
    // sports에 Function 오브젝트를 할당하고 이것을 WeakMap 인스턴스에 key로 설정
    
    sports = () => {
    point: 2;
    };
    // 새로운 함수를 생성하여 할당함
    // 바로 위의 sports가 참조하는 메모리 주소가 바뀜
    // sprots가 참조하는 메모리 주소가 바뀌면 앞의 sports가 참조했던 오브젝트를 호출할 수 없게 됨
    // 이렇게 사용할 수 없게 된 {point: 1} 오브젝트는 GC대상이 됨
    // 엔진이 주기적으로 GC처리를 함
    
    obj.set(sports, '변경 후');
    // sports를 key로 하여 WeakMap에 설정함
    // 앞에서 sports를 key로 하여 설정했으며 여기서도 sports를 key로 하여 설정하므로 값이 대체되어야 하지만
    // 두 개의 sports가 참조하는 주소가 다르므로 sports가 추가됨

  • WeakMap 인스턴스의 GC상태

    let obj = new WeakMap();
    let sports = () => {
    point: 1;
    };
    obj.set(sports, '변경 전');
    /*
    	1. 아래에서 sports 변수에 {point: 2}를 할당하므로
    		- sports가 참조하는 오브젝트가 바뀜
    */
    
    sports = () => {
    point: 2;
    };
    obj.set(sports, '변경 후');
    /*
    	1. obj의 [[Entries]]를 펼치면 0과 1이 있음
    		- 변숫값은 바뀌어 하나이지만
    		- WeakMap 인스턴스에는 두 개가 있음
    
    	2. {point: 1}과 {point: 2}의 메모리 주소가 다르며
    		- sports는 사람이 보는 것으로
    		- WeakMap은 값인 메모리 주소가 다르므로 각각 저장 합니다.
    
    3. 그래서 sports로 저장하지 않고 
    		- 인덱스를 부여하여 저장하는 것
    		- 엔진은 인덱스가 key이며
    		- sports는 프로퍼티 value에서 프로퍼티 키 임
    */
    
    setTimout(function () {
    debugger;
    console.log(obj.get(sports));
    }, 4000);
    debugger;
    /*
    	1. {point: 1}의 sports를 사용할 수 없으므로
    		- GC가 {point: 1}의 sports를 메모리에서 지움
    		- 또한 obj의 "변경 전"도 삭제 함
    
    	2. 인덱스 1번이 0번이 됨
    
    	3. Map 오브젝트에서 entry를 삭제해도 인덱스를 정리 함
    */