가비지 컬렉션

미어캣의 개발일지·2023년 6월 30일
0
post-thumbnail

📚 가비지 컬렉션

📕 가비지 컬렉션(Garbage Collection)이란?

메모리 관리 방법 중 하나로, 프로그래머가 동적으로 할당한 메모리 영역 중 더 이상 쓰이지 않는 영역을 자동으로 찾아내어 해제하는 기능



📕 가비지 컬렉션 기준

  • 자바스크립트는 도달 가능성이라는 개념을 사용해 메모리 관리를 수행
  • 도달 가능한값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미, 도달 가능한 값은 메모리에서 삭제되지 않는다.
  1. 명백한 이유 없이 삭제 되지 않는 값들 예시
    • 현재 함수의 지역 변수와 매개변수
    • 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
    • 전역 변수

이러한 값은 루트(root)라고 부른다.

  1. 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 된다.
    • 전역 변수에 객체가 저장되어있다고 가정. 이 객체의 프로퍼티가 또 다른 객체를 참조하고 있다면, 프로퍼티가 참조하는 객체는 도달 가능한 값이다. 이 객체가 참조하는 다른 모든 것들도 도달 가능하다고 여겨진다.

📖 예시

// user엔 객체 참조 값이 저장
let user = {
    name: "John"
}

이 그림에서 화살표는 객체 참조를 나타냄. 전역 변수 "user"는 {name: "John"}(이하 John)이라는 객체를 참조. John의 프로퍼티 "name"은 원시값을 저장하고 있기 때문에 객체 안에 표현.

user의 값을 다른 값으로 덮어쓰면 참조(화살표)가 사라짐.

user = null;

이제 John은 도달할 수 없는 상태가 되었다. John에 접근할 방법도, John을 참조하는 것도 모두 사라졌다. 가비지 컬렉터는 이제 John에 저장된 데이터를 삭제하고, John을 메모리에서 삭제.


📖 연결된 객체

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

    return {
        father: man,
        mother: woman,
    };
}

let family = marry(
    {
        name: "John",
    },
    {
        name: "Ann",
    }
);

함수 marry(결혼하다)는 매개변수로 받은 두 객체를 서로 참조하게 하면서 '결혼’시키고, 두 객체를 포함하는 새로운 객체를 반환.

지금은 모든 객체가 도달 가능한 상태.

이제 참조 두 개를 지워보겠습니다.

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

삭제한 두 개의 참조 중 하나만 지웠다면, 모든 객체가 여전히 도달 가능한 상태였을 것이다.

하지만 참조 두 개를 지우면 John으로 들어오는 참조(화살표)는 모두 사라져 John은 도달 가능한 상태에서 벗어나게 됨.

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

가비지 컬렉션 후 메모리 구조는 아래와 같다.


📖 도달할 수 없는 섬

객체들이 연결되어 섬 같은 구조를 만드는데, 이 섬에 도달할 방법이 없는 경우, 섬을 구성하는 객체 전부가 메모리에서 삭제

family = null;

"family" 객체와 루트의 연결이 사라지면 루트 객체를 참조하는 것이 아무것도 없게 된다. 섬 전체가 도달할 수 없는 상태가 되고, 섬을 구성하는 객체 전부가 메모리에서 제거됨.




📕 요약

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

📚 참조

https://ko.javascript.info/garbage-collection

profile
이게 왜 안되지? 이게 왜 되지?

0개의 댓글