1 minute read

가비지 컬렉션

JS 엔진은 쓸모없어 지는 것들을 찾아내 삭제함

  • 가비지 컬렉션 기준

    도달 가능성 이라는 개념 사용해 메모리 관리

  • ‘도달 가능한 값’

    어떻게든 접근하거나 사용할 수 있는 값 메모리에서 삭제되지 않음 도달할 수 없는 상태가 되면 메모리에서 삭제.

  1. 태생부터 도달 가능한 값

    루트

  2. 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값.

  • 참조 두 개

    조할 수 있는 값이 하나라도 있을 경우 삭제되지 않음

  • 연결된 객체

    외부로 나가는 참조는 도달 가능한 상태에 영향주지 않고 삭제됨 외부에서 들어오는 참조만이 도달 가능한 상태에 영향을 주고 삭제되지 않음

  • 도달할 수 없는 섬

    객체들이 연결되어 섬 같은 구조가 만들어졌을 때 이 섬에 도달할 방법이 없는 경우 구성요소 전부 메모리에서 삭제

  • 내부 알고리즘

    ‘mark-and-sweep’ 이라 불리는 가비지 컬렉션 기본 알고리즘

    단계

    1. 루트 정보 수집하고 이를 ‘mark’(기억)

    2. 루트가 참조하고 있는 모든 객체 방문하고 이를 ‘mark’

    3. mark 된 모든 객체 방문하고 그 객체들이 참조하는 객체도 ‘mark’

    4. 한번 방문한 객체는 전부 mark 하기 때문에 같은 객체 방문하는 일 없음

    5. 루트에서 도달 가능한 모든 객체 방문할 때까지 위 과정 반봅

    6. mark 되지 안흔 모든 객체 메모리에서 삭제

  • 최적화 기법

    JS 엔진은 실행에 영향 미치지 않으면서 가비지 컬렉션 더 빠르게 하는 최적화 기법 적용

    1. generational collection (세대별 수집)

    객체를 ‘새로운 객체’ 와 ‘오래된 객체’로 나눔 빠르게 쓸모가 없어지는 객체를 ‘새로운 객체’로 구분하고 가비지 컬렉터가 공격적으로 제거 일정 기간 살아남은 객체를 ‘오래된 객체’로 나누고 컬렉터가 덜 감시

    1. incremental collection (점진적 수집)

    모든 객체 한번에 방문하고 mark 시 시간 오래 걸리고 리소스 낭비로 실행속도 느려짐 방지 위해 컬렉터 여러 부분으로 분리하고 각 부분 별도로 수행 긴 지연시간 짧은 지연 여래가로 분산 시키는 장점

    1. idle-time collection (유휴시간 수집)

    실행에 주는 영향 최소화 하기 위해 CPU 유휴일 때만 가비지 컬렉터 실행

요약

  • JS 엔진은 쓸모없어지는 것들 찾아내 제거하는 가비지 컬렉션 실행

  • 가비지 컬렉션 기준은 도달 가능성 사용

  • 도달 가능성 은 루트에서, 루트가 참고하는 값이나 체이닝으로 루트에서 참조할 수 있는 값

  • 내부 알고리즘은 ‘mark-and-sweep’ 으로 루트에서 밑으로 내려가며 ‘mark’ 하고 mark 되지 않은 값 삭제하는 방식

  • 최적화 기법은 세대별 수집, 점진적 수집, 유휴시간 수집

  • 세대별 수집은 객체를 ‘새로운 객체’ 와 ‘오래된 객체’로 나루고 빠르게 쓸모가 없어지는 객체를 ‘새로운 객체’로 구분하고 가비지 컬렉터가 공격적으로 제거

  • 점진적 수집은 모든 객체를 한번에 방문할 하지 않고 컬렉터 여러 부분으로 나눠서 각 부분 별도로 수행해서 지연 시간을 단축 시킴

  • 유휴시간 수정은 실행에 주는 영향 최소화하기 위해 CPU 유휴 일 때만 실행

Categories: ,

Updated: