자바스크립트는 눈에 보이지 않는 곳에서 메모리 관리를 수행합니다.
가비지 컬랙션 기준
reachable: 어떻게든 접근하거나 사용할 수 있는 값을 의미합니다. 이는 메모리에서 삭제되지 않습니다.
- 현재 함수의 지역 변수와 매개변수
- 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
- 전역변수
- 기타 등등
이러한 값들은 태생부터 도달 가능하기 때문에 명백한 이유없이는 삭제되지 않습니다.
이러한 값들을 루트라고 불립니다.
예시
let user = {
name: "John"
};
user =null;
이렇게 될 경우 John은 도달할 수 없는 상태가 되었고 가비지 컬렉터는 John에 저장된 데이터를 삭제하고 메모리에서도 삭제하게 됩니다.
참조 두개
참조가 두개인 경우 ,
let user = {
name : "John"
};
let admin =user;
user = null;
이러한 경우 John은 admin을 통해서 접근할 수 있기 때문에 여전히 도달가능한 값입니다. admin에게 다른 값으로 덮어쓰면 John은 메모리에서 삭제 될수도 있습니다.
연결된 객체
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을 하게 되면
John과 Ann은 여전히 서로를 참조하고 있고 외부에서 들어오는 객체를 참조하고 있지만 family와의 연결이 사라지면 루트 객체를 참조하는 것이 사라지게 되므로 전체가 도달 할 수 없는 상태가 되고 이것들은 전부 메모리에서 사라지게 됩니다.
이것이 도달할 수 없는 섬입니다.
가비지 컬렉션 관련 알고리즘: mark and sweep algorithm
최적화 기법
- incremental collection
- idle-time collection
'개발 > javascript' 카테고리의 다른 글
[javascript] new 연산자와 생성자 함수 (0) | 2024.03.16 |
---|---|
[javascript]메서드와 this (0) | 2024.03.14 |
[javascript]async & await (0) | 2023.07.26 |
[javascript]Promise & 콜백지옥 (0) | 2023.07.25 |
[javascript]동기&비동기 (0) | 2023.07.24 |