ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바스크립트에서 가비지 컬렉션이란?
    코딩 이론 2023. 7. 4. 23:40

    자바스크립트는 눈에 보이지 않는 곳에서 가비지 컬렉터가 가비지 컬렉션을 활용하여 메모리 관리를 합니다. '도달가능성'이라는 개념을 통해 메모리 관리를 수행합니다. '도달 가능성'이라는 개념은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 것을 의미합니다. 또한 자바스크립트 엔진 내에서 가비지 컬렉터가 끊임없이 동작하며 모든 객체를 모니터링하고 도달할 수 없는 객체를 삭제합니다.

     

     

    let user = {
      name: "John"
    }; // (1)
    
    user = null; // (2)

     

    (1)에서 전역변수 user는 name을 키로 갖고 문자열 John을 값으로 갖는 객체를 참조합니다. user의 값을 다른 값으로 덮어쓰게 되면 즉 재할당을 하게 되면 앞의 객체를 참조하는 변수는 사라지게 됩니다. (2)에서 name을 키로 갖고 문자열 John을 값으로 갖는 객체에 접근할 방법이 사라졌습니다. 즉, 도달할 수 없는 상태가 되었습니다. 이때 가비지 컬렉터는 객체에 저장된 데이터를 삭제하고 객체를 메모리에서 삭제합니다.

    가비지 컬렉션의 내부 알고리즘

    가비지 컬렉션은 'mark-and-sweep’이라 불리는 알고리즘을 사용합니다.

     

     

    1. 가비지 컬렉터는 루트(root) 정보를 수집하고 이를 mark 합니다.
    2. 루트가 참조하고 있는 모든 객체를 방문하고 이것들을 mark 합니다.
    3. mark 된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 mark 합니다. 한번 방문한 객체는 전부 mark 하기 때문에 같은 객체를 다시 방문하는 일은 없습니다.
    4. 루트에서 도달 가능한 모든 객체를 방문할 때까지 위 과정을 반복합니다.
    5. mark 되지 않은 모든 객체를 메모리에서 삭제합니다.

    가비지 컬렉션의 최적화

    가비지 컬렉션은 자바스크립트 엔진은 실행에 영향을 미치지 않으면서 처리속도를 높이기 위해 다양한 최적화 기법을 사용합니다.

    • generational collection(세대별 수집) – 객체를 새로운 객체와 오래된 객체로 나눕니다. 객체 상당수는 생성 이후 제 역할을 빠르게 수행해 금방 쓸모가 없어지는데, 이런 객체를 새로운 객체로 구분합니다. 가비지 컬렉터는 이런 객체를 공격적으로 메모리에서 제거합니다. 일정 시간 이상 동안 살아남은 객체는 오래된 객체로 분류하고, 가비지 컬렉터가 덜 감시하게 됩니다.
    • incremental collection(점진적 수집) – 방문해야 할 객체가 많다면 모든 객체를 한 번에 방문하고 mark 하는데 상당한 시간이 소모됩니다. 가비지 컬렉션에 많은 리소스가 사용되어 실행 속도도 눈에 띄게 느려지게 됩니다.. 자바스크립트 엔진은 이런 현상을 개선하기 위해 가비지 컬렉션을 여러 부분으로 분리한 다음, 각 부분을 별도로 수행합니다. 작업을 분리하고, 변경 사항을 추적하는 데 추가 작업이 필요하긴 하지만 긴 지연을 짧은 지연 여러 개로 분산시킬 수 있다는 장점이 있습니다.
    • idle-time collection(유휴 시간 수집) – 가비지 컬렉터는 실행에 주는 영향을 최소화하기 위해 CPU가 유휴 상태일 때에만 가비지 컬렉션을 실행합니다.

    요약!

    • 가비지 컬렉션은 메모리를 효율적으로 관리하기 위해 사용됩니다.
    • 가비지 컬렉션은 엔진이 자동으로 수행합니다. 따라서 개발자는 이를 임의로 실행하거나 막을 수 없습니다.
    • 해당 객체가 도달 가능할 수 없는 상태일 때 가비지 컬렉터가 가비지 컬렉션을 수행하여 메모리에서 해당 객체를 제거합니다.

    '코딩 이론' 카테고리의 다른 글

    리액트의 생명주기  (0) 2023.05.15
    정규표현식  (0) 2023.05.04
    가우스 공식  (0) 2023.05.03
    str.repeat()  (0) 2023.05.02
    배열 생성자  (0) 2023.05.01
Designed by Tistory.