dolog
가비지 컬렉션 2 본문
연결된 객체
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 |