본문 바로가기

이것저것 스터디📚/JavaScript

가비지 컬렉션

- 가비지 컬렉션(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되지 않은 객체는 메모리에서 해제하는 알고리즘이다.


학습 단계로 잘못된 정보가 있을 수 있습니다. 잘못된 부분에 대해 알려주시면 정정하도록 하겠습니다.

참고 : https://ko.javascript.info/garbage-collection

https://velog.io/@bumsu0211/JavaScript-Garbage-Collection

 

'이것저것 스터디📚 > 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