[Deep JavaScript] 가비지 컬렉션
자바스크립트에서 가비지 컬렉션은 어떤식으로 동작할까?
*가비지 컬렉션(GC) : 프로그램 메모리 관리 기법으로 할당했던 메모리 중에서 불필요한 영역을 제거하는 기능이다.
가비지컬렉션 기준
-
자바스크립트는 도달 가능성 이라는 개념을 사용해 메모리 관리를 수행합니다.
-
도달 가능한 값은 어떻게든 접근하거나 사용할 수 있는 값을 의미합니다.
-
도달 가능한 값은 메모리에서 삭제되지 않습니다.
-
ROOT의 참조 가능여부가 중요한 포인트입니다.
ROOT?
-
현재 함수의 지역 변수와 매개변수
-
중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
-
전역(global) 변수
위 값 들이 ROOT이며, 처음부터 도달 가능하기 때문에 명백한 이유 없이는 삭제되지 않습니다.
ROOT가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됩니다.
Example
객체 복사
const obj = {
name : 'jo',
age : 28,
}
// obj 복사
const test = obj;
// obj 제거
obj = null;
- 전역변수 test 통하면 여전히 객체 jo에 접근할 수 있기 때문에 test는 메모리에서 삭제되지 않습니다.
- 이 상태에서 test에 다른 값(null 등)으로 덮어쓰면 jo은 메모리에서 삭제될 수 있습니다.
연결된 객체
function marry(man, woman) {
woman.husband = man;
man.wife = woman;
return {
father: man,
mother: woman
}
}
let family = marry({
name: "John"
}, {
name: "Ann"
});
- 메모리 구조는 아래와 같이 나타낼 수 있습니다.
- John 도달 가능성 모두제거
delete family.father;
delete family.mother.husband;
- John으로 들어오는 참조(화살표)는 모두 사라져 John은 도달 가능한 상태에서 벗어납니다.
- 외부로 나가는 참조는 도달 가능한 상태에 영향을 주지 않습니다.
- 외부에서 들어오는 참조만이 도달 가능한 상태에 영향을 줍니다.
- John은 이제 도달 가능한 상태가 아니기 때문에 메모리에서 제거됩니다.
- John에 저장된 데이터(프로퍼티) 역시 메모리에서 사라집니다.
요약
- 가비지 컬렉션은 엔진이 자동으로 수행하므로 개발자는 이를 억지로 실행하거나 막을 수 없습니다.
- 객체는 도달 가능한 상태일 때 메모리에 남습니다.
- 참조된다고 해서 도달 가능한 것은 아닙니다. 서로 연결된 객체들도 도달 불가능할 수 있습니다.
Reference
Author And Source
이 문제에 관하여([Deep JavaScript] 가비지 컬렉션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jodheeee/Deep-JavaScript-가비지-컬렉션저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)