반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

자바스크립트-가비지 컬렉션 본문

JS

자바스크립트-가비지 컬렉션

5_hyun 2022. 5. 12. 20:44
반응형

자바스크립트는 눈에 보이지 않는 곳에서 메모리 관리를 한다. 더 이상 쓸모 없어진 변수, 함수, 객체 등을 어떻게 처리하는지 알아보겠다.

 

가비지 컬렉션 기준

도달 가능한 값: 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값

 

-태생부터 도달 가능한 값

이 값들은 명백한 이유 없이는 삭제되지 않는다.

1. 현재 함수의 지역 변수, 매개 변수

2. 중첩 함수의 체인에 있는 함수에서 사용되는 변수, 매개 변수

3. 전역 변수

4. 기타 등등

이런 값들은 루트라고 부른다.

 

  • 자바스크립트 엔진 내에서 가비지 컬렉터가 끊임없이 동작한다. 가비지 컬렉터는 모든 객체를 모니터링하고 도달할 수 없는 객체는 삭제한다.

-예시

// user엔 객체 참조 값이 저장됩니다.
let user = {
  name: "John"
};

user = null;

 

이러면 John은 도달할 수 없는 상태가 되었다. 그렇기에 가비지 컬렉터는 John에 저장된 데이터를 삭제하고, John을 메모리에서 삭제한다.

 

// user엔 객체 참조 값이 저장됩니다.
let user = {
  name: "John"
};

let admin = user;

user = null;

이렇게 하면 admin이 있어서 삭제되지 않는다.

 

-연결된 객체

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

  return {
    father: man,
    mother: woman
  }
}

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

이 코드의 메모리 구조

 

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

John의 참조를 지워버렸다.

그러면 John은 이제 도달 가능한 상태가 아니라서 메모리에서 제거된다.

 

-도달할 수 없는 섬

family = null;

이렇게 해버리면 family에 도달할 수 있는 방법이 없어서 객체 전부가 메모리에서 삭제된다.

 

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

내부 알고리즘은 mark-and-sweep라고 불린다.

 

-가비지 컬렉션 단계

1. 가비지 컬렉터는 루트 정보를 수집하고 이를 mark(기억)

2. mark 된 모든 객체를 방문하고 객체들이 참조하는 객체도 mark한다. 한번 방문한 객체는 전부 mark해서 다시 방문하지 않는다.

3. 루트에서 도달 가능한 모든 객체에 방문할 때까지 반복

4. mark 되지 않은 모든 객체를 메모리에서 삭제

 

-최적화 기법

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