프론트엔드 기본개념 복습/Javascript

[Javascript] 가비지 컬렉션 (Garbage Collection)

콘요맘떼 2022. 3. 2. 18:23

가비지 컬렉션 (Garbage Collection)

  프로그래밍 언어와 무관하게 메모리는 다음과 같은 생명주기를 공통적으로 가진다.

1) 필요한 메모리를 할당한다.

2) 할당된 메모리를 사용한다. (읽기, 쓰기)

3) 해당 메모리가 필요 없어지면 메모리를 해체한다.

 

  개발자가 메모리의 해체 시기를 직접 결정해야 하는 로우레벨 언어(ex. C, C++)와 달리 자바스크립트는 가비지 컬렉션이라는 자동 메모리 관리 형식을 활용한다. 참고로 가비지 컬렉션은 필요 없어진 메모리만을 해제하지만 필요 없어진 메모리들이 모두 해체되는 것은 아니다. (그렇기 때문에 근사적 작업이라고 볼 수 있다.) 가장 대표적인 가비지 컬렉션 알고리즘에는 크게 두 가지 종류가 있다.

 

1. 참조-세기 (reference-counting)

  다른 어떤 객체도 참조하지 않는 객체는 더 이상 필요하지 않다고 정의하여 가비지 컬렉션을 수행하는 알고리즘이다.

  참조 세기 알고리즘은 순환 참조(Circular Reference)에 대처할 수 없다는 문제가 발생한다.

 

  위 이미지에서 x와 y 객체는 서로를 참조한다. 그렇기 때문에 참조-세기 알고리즘에 따르면 실질적으로 해당 객체들이 필요하지 않아도 x 객체와 y 객체는 필요한 데이터라고 판단되어 메모리가 해제되지 않는다. 

 

 

2. Mark-and-sweep

  참조-세기 알고리즘의 순환 참조 문제를 극복하기 위해 등장한 알고리즘이다. Mark-and-sweep 알고리즘은 도달 가능성(reachability)이라는 개념을 통해 메모리의 필요 여부를 판단한다. 다른 말로 '닿을 수 없는 객체'는 필요 없는 객체라고 규정짓는 알고리즘이다. Mark-and-seep 알고리즘은 우선적으로 전역 객체들이 담긴 root 집합으로부터 그것들이 참조해나가는 객체들로 뻗어나간다. 만약 루트에서 시작하여 도달하지 못한 객체가 있다면 해당 객체는 메모리가 해체된다. 자바스크립트 엔진 내부의 가비지 컬렉터는 끊임없이 모든 객체들의 도달 가능성을 검사하며 가비지 컬렉션을 수행한다. 최근의 브라우저는 대부분 Mark-and-sweep 알고리즘을 통해 가비지 컬렉션을 수행한다. Mark-and-sweep 알고리즘의 과정은 구체적으로 세 단계로 나눌 수 있다.

 

(1) 객체 생성

  객체가 생성되면 기본적으로 mark bit가 false(0)으로 설정된다.

 

(2) Mark 단계

  루트부터 시작하여 루트가 참조하는 모든 객체들을 mark한다. (mark한 객체들은 mark bit가 true(1)으로 변경된다.)

 

(3) Sweep 단계

  Mark 단계를 거친 후에도 mark bit가 0으로 설정되어 있다면 가비지 컬렉터가 그 메모리를 해제한다.

 

 

가비지 컬렉션의 최적화

  자바스크립트 엔진은 가비지 컬렉션의 성능을 최적화하기 위해 다양한 기법을 제공한다. 그 예시는 다음과 같다.

(1) 세대별 수집 (generational collection)

  대부분의 객체는 생성 후 자신의 역할을 곧바로 수행한 후에 빠르게 그 필요가 없어진다. 반면 일정 시간 이상 생존한 객체는 앞으로도 계속 활용될 가능성이 높다. 이러한 특성을 활용하여 생성되지 얼마 되지 않은 새로운 객체들에는 공격적인 메모리 해제를 수행하고 일정 시간 이상 생존한 객체에 대해서는 감시를 완화하는 방법을 통해 가비지 컬렉션을 최적화할 수 있다.

 

(2) 점진적 수집 (incremental collection)

  방문할 객체가 많아질수록 탐색에 많은 시간이 필요하고 이는 성능 저하로 이어질 수 있다. 따라서 가비지 컬렉션을 여러 부분으로 나눈 후 각 부분을 별도로 수행하여 긴 지연시간을 여러 작은 단위로 쪼개어 준다.

 

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

  가비지 컬렉션으로 인해 프로그램 성능이 영향받는 것을 방지하기 위해 CPU가 유휴 상태일 때에만 가비지 컬렉션을 수행한다.