dolog

가비지 컬렉션 2 본문

JavaScript/객체 : 기본

가비지 컬렉션 2

dokite 2022. 7. 20. 01:23

연결된 객체

 

let marry = (man, woman) => {

woman.husband = man;

man.wife = woman;

 

return { // 새로운 객체 반환

father: man,

mother: woman

}

}

 

let family = marry({

name: “Kim”

}, 

{

name: “Shim”

});

 

father과 mother.husband를 지우면 ⬇️

 

delete family.father;

delete family.mother.husband;

 

둘 중 하나만 삭제해도 모든 객체는 여전히 도달 가능한 상태지만

두개 모두 지우면 Kim으로 들어오는 참조는 모두 사라져 도달 가능한 상태가 X ➡️ 메모리 삭제

 

즉, 외부에서 들어오는 참조만이 도달 가능한 상태에 영향을 준다 !!

 

결과적으로 family에서 mother만 남게 되는 구조로 변경된다

 

도달할 수 없는 섬

  • 객체 연결 ➡️ 섬 구조 
  • 만약 섬에 도달할 방법이 없다면? 섬을 구성하는 객체 전부 메모리에서 삭제

 

위에 예시에서 family에 null 값을 주면 ⬇️

 

family = null; // 아무것도 참조하지 않음

 

father, mother, name(kind ,shim)의 객체가 모두 삭제

 

즉, root 객체를 참조할 수 있도록 도달 가능성을 만들어 주는 것이 중요하다

 

내부 알고리즘

 

‘mark-and-sweep’ : 가비지 컬렉션의 기본 알고리즘

 

<단계>

(1)가비지 컬렉터는 root 정보를 수집하고 이를 mark(기억) 한다

(2)root가 참조하고 있는 모든 객체를 방문하고 똑같이 mark 한다

(3)mark 된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 mark(한번 방문한 객체는 전부 mark 하기 때문에 같은 객체 재방문 X)

(4)root에서 도달 가능한 모든 객체를 방문할 때까지 위 과정 반복

(5)mark 되지 않은 모든 객체를 메모리에서 삭제

 

root를 시작으로 참조를 따라가면서 도달 가능한 객체 모두에 페인트가 덮어진다고 생각하면 된다

이때 페인트가 덮어지지 않은 객체는 삭제

 

최적화 기법 : JS 엔진이 실행에 영향을 미치지 않고 더 빠르게 가비지 컬렉션을 수행하기 위한 기법

  • generational collection(세대별 수집) : 새로운 객체와 오래된 객체로 나누고 생성 이후 제 역할을 빠르게 수행하는 객체를 새로운 객체로 구분, 이런 객체를 메모리에서 삭제, 일정 시간 이상 동안 살아남은 객체를 오래된 객체라고 하고 덜 감시한다
  • incremental collection(점진적 수집) : 방문해서 mark 해야 할 객체가 많은 경우 가비지 컬렉션을 여러 부분으로 분리하고 각 부분을 별도로 수행하게 한다, 작업 분리와 변경 사항 추적 등 추가 작업이 필요하지만 긴 지연 ➡️ 짧은 지연 여러개로 분산시킬 수 있다
  • idle-time collection(유휴 시간 수집) : 실행에 주는 영향 최소화를 위해 CPU가 유휴 상태일 때만 실행

 

• CPU(Central Processing Unit) : 중앙 처리 장치로 컴퓨터 정중앙에서 모든 데이터를 처리하는 장치, 명령어의 해석, 데이터의 연산 및 비교 등의 처리를 제어하는 컴퓨터 시스템의 가장 핵심적인 장치, 제어장치, 연산장치, 레지스터로 구분

• 유휴 시간, 상태(idle time) & CPU의 유휴 상태 : 어떠한 프로그램에 의해서도 사용되지 않는 상태, CPU가 모든 task를 끝낸 상태

 

• 참조된다고 해서 도달 가능한 것은 아니며 서로 연결된 객체도 도달 불가능 할 수 있다(예시를 알아보자) 

• 자바스크립트에 익숙해진 엔진에 대해 학습하도록 하자

'JavaScript > 객체 : 기본' 카테고리의 다른 글

옵셔널 체이닝  (0) 2022.07.23
매서드와 this  (0) 2022.07.20
가비지 컬렉션 1  (0) 2022.07.19
참조에 의한 객체 복사  (0) 2022.07.18
객체 2  (0) 2022.07.17