- 가비지 컬렉션(Garbage Collection)은 메모리 관리의 한 형태로, 프로그램이 더이상 사용하지 않는 메모리를 자동으로 회수하고 재활용하는 과정이다.
- 이는 메모리 누수를 방지하고, 프로그램이 효율적으로 작동하도록 도와준다.
- JavaScript의 원시값, 객체, 함수 등 우리가 만드는 모든 것은 메모리를 차지하고, JavaScript는 눈에 보이지 않는 곳에서 메모리 관리를 수행한다.
가비지 컬렉션 기준
- JavaScript에서는 도달 가능성(reachability)이라는 개념을 사용해 메모리 관리를 수행한다.
- 도달 가능성이라는 것은 어떻게든 접근하거나 사용할 수 있는 값인가를 의미한다.
- 루트(root) : 처음부터 도달 가능하기 때문에, 명백한 이유 없이는 삭제되지 않는다.
1. 현재 함수의 지역 변수와 매개변수
2. 중첩함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
3. 전역 변수
4. 기타 등등
- 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값도 도달 가능한 값이 된다.
예시1
let user = {
name : "kim"
};
user = null;
- 위 예시에서 처음에 전역 변수 "user"는 { name: "kim" } 이라는 객체를 참조하고 있다.
- 만약 user를 다른 값(예시에서는 null)으로 덮어쓰면 { name : "kim" } 이라는 객체에 대한 참조가 사라진다.
- 참조가 사라지는 경우 { name : "kim" } 이라는 객체는 도달할 수 없는 상태가 되었기 때문에, 가비지 컬렉터는 { name : "kim" }에 저장된 데이터를 삭제하고, 메모리에서 삭제한다.
예시2
let user = {
name: "kim"
};
let admin = user;
user = null;
- 위 예제에서 처음에 user, admin 변수 모두 { name : "kim" } 객체를 참조하고 있다.
- user 변수에 다른 값(예시에서는 null)으로 덮어 쓰더라도 admin 변수에서 { name : "kim" } 객체를 참조하고 있기 때문에 { name : "kim" } 객체는 가비지 컬렉터의 대상이 되지 않는다.
가비지 컬렉션의 내부 알고리즘
- 과거 브라우저에서는 참조 카운팅 방식(참조 개수를 카운팅하여 참조가 하나도 없으면 가비지로 판단하는 방법)을 사용하였지만, 2012년 이후 모든 최신 브라우저들은 mark-and-sweep 방식을 사용한다고 한다.
- 다음은 "mark-and-sweep"의 동작 단계이다.
1. 가비지 컬렉터는 루트(root) 정보를 수집하고 이를 mark(기억)한다.
2. 루트가 참조하고 있는 모든 객체를 방문하고 이것들을 mark(기억)한다.
3. mark된 모든 객체에 방문하고 그 객체들이 참조하는 객체도 mark 한다.
4. 루트에서 도달 가능한 모든 객체를 방문할 때까지 위 과정을 반복한다.
5. mark 되지 않는 모든 객체를 메모리에서 삭제한다.
- 위 이미지에서처럼 루트(global)에서 도달 가능한 모든 객체를 mark(초록색으로 표시)하고 mark되지 않은, 즉 도달 불가능한(unreachables) 객체는 가비지 컬렉터의 대상이 되어 메모리에서 삭제된다.
* 내 정리
- 가비지 컬렉션은(Garbage Collection)은 메모리 관리의 한 형태로, 프로그램이 더이상 사용하지 않는 메모리를 자동으로 회수하고 재활용하는 과정으로, 메모리 누수를 방지하고, 프로그램이 효율적으로 작동하도록 도와준다.
- JavaScript의 원시값, 객체, 함수 등 우리가 만드는 모든 것은 메모리를 차지하고, JavaScript는 눈에 보이지 않는 곳에서 메모리 관리를 수행한다.
- 과거 브라우저의 가비지 컬렉션 내부 알고리즘은 참조 카운팅 방식이었지만, 최근 브라우저는 "도달 가능성"이라는 기준으로 메모리 관리를 수행한다. "도달 가능성"이라는 것은 어떤 값에 접근할 수 있는지 여부를 뜻하는데, 루트(현재 함수의 지역 변수와 매개변수, 중첩함수의 체인에 있는 함수에서 사용되는 변수와 매개변수, 전역 변수, 기타 등등)와 루트와 연결된 체인을 통해 참조될 수 있는 값들은 모두 도달 가능한 값이다.
- 가비지 컬렉션의 주요 알고리즘은 "mark-and-sweep"으로 루트에서부트 도달 가능한 모든 객체를 mark하고 mark되지 않은 객체는 메모리에서 해제하는 알고리즘이다.
학습 단계로 잘못된 정보가 있을 수 있습니다. 잘못된 부분에 대해 알려주시면 정정하도록 하겠습니다.
'이것저것 스터디📚 > JavaScript' 카테고리의 다른 글
var, let, const 차이 (1) | 2024.01.15 |
---|---|
call, apply, bind (0) | 2024.01.14 |
커링과 클로저 (2) | 2023.12.05 |
React에서 서버와 통신하는 과정을 구현하는 방법 (1) | 2023.11.21 |
Virtual DOM이란? (1) | 2023.11.21 |