코어 자바스크립트 (가비지 컬렉션)

Vorhandenheit ·2021년 6월 16일
0

JS.코어

목록 보기
5/29
post-custom-banner

가비지 컬렉션 garbage collection

1.가비지 컬렉션 기준

JS는 reachability 도달가능성 이라는 개념을 사용해 메모리 관리를 수행

  • reachability는 어떻게든 접근하거나 사용할수 있는 값을 의미

1) 아래 소개해 드릴 값, 태생부터 도달 가능하기 때문, 명백한 이유 없이 삭제되지않음

  • 현재 함수의 지역 변수와 매개변수
  • 중첩 함수의 체인에 이는 함수에서 사용되는 변수와 매개변수
  • 전역 변수
    = 이런 값 '루트'라고 부름

2) 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됨
전역 변수가 객체에 저장된다고 가정, 이 객체의 프로퍼티가 또 다른 객체를 참조하고 있다면, 프로퍼티가 참조하는 객체는 도달 가능한 값이 됨

가비지 컬렉터는 모든 객체를 모니터링, 도달할 수 없는 객체는 삭제

2. 간단한 예시

let user = {
	name: "John"
};

user 값을 다른 값으로 덮어스면 참조가 사라짐

user = null;

이렇게 되면 object에 접근할 방법이 사라짐, 가비지 컬렉터는이 john에 저장된 데이터를 삭제

3.참조

참조를 user에 admin 복사했다고 가정


let user = {
	name: "John"
};
let admin = user;

user값을 없애도 admin을 통해 접근할 수 있으므로 john 메모리 삭제되지않음

4.연결된 객체

funtion marry(man, womn){
	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;
  • 그림으로 이해하는게 편함, 나중에 객체를 다룰때 이렇게 이해할 것,
    외부에서 들어오는 참조만이 도달 가능한 상태에 영향

5.도달할 수 없는 섬

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

6.내부 알고리즘

'mark-and-sweep' 가비지 컬렉션 기본 알고리즘

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

<최적화기법>

  • generatinoal collection(세대별 수집) : 객체를 '오래된 객체'와 '새로운 객체'로 나눔, 가비지 컬렉터는 이런 객체를 공격적으로 메모리에서 제거

  • incremental collection(점진적 수집) : 방문해야 할 객체가 많다면 모든 객체를 한 번에 방문하고 mark 하는데 상당한 시간이 소모, 가비지 컬렉션에 많은 리소스가 사용되어 실행 속도도 눈에 띄게 느려질 것, 이걸 개선하기 위해 가비지 컬렉션을 여러 부분으로 분리, 각 부분을 별도로 수행

  • idle-time collection(유휴 시간 수집) : 가비지 컬렉터는 실행에 주는 영향을 최소화하기 위해 유휴 상태일 때에만 가비지 컬렉션을 실행

profile
읽고 기록하고 고민하고 사용하고 개발하자!
post-custom-banner

0개의 댓글