[JavaScript] Garbage Collection

Song-YunMin·2021년 1월 27일
1

JavaScript

목록 보기
7/22
post-thumbnail
post-custom-banner

Garbage Collection

Garbage Collection(이하 GC) 은 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던(Heap 영역) 영역 중에서 필요없게 된 영역을 해제하는 기능이다.
즉, 동적으로 할당 된 메모리 영역 가운데 어떤 변수도 가리키지 않는 메모리 영억을 탐지하여 자동으로 해제하는 기법이다.

C언어 같은 Unmanaged Language는 메모리 관리를 위해 malloc(), free() 등을 사용하지만, 자바스크립트 같은 경우에는 그렇지 않다. 즉, 자동으로 메모리를 할당하고 쓸모 없어졌을 때 자동으로 해제하는 기법을 사용하는데, 이게 바로 GC의 목적이다.
이렇게 GC에 의존하는 코딩을 하라고 만든것은 아니다. 이러한 자동 메모리 관리는 잠재적 혼란의 원인이기도 하며, 계속 GC에 의존하는 코딩을 하다가는 프로그램이 일단 돌아가기만 하면 비효율성에 대해 고민하지 않고 개발과정을 끝내버리기도 한다.

Memory Life Cycle

메모리의 생존주기는 프로그래밍 언어와 관계없이 거의 비슷하다

  • 필요할 때 할당
  • 사용
  • 필요 없어지면 해제

위 세가지의 과정으로 진행되는데 여기서 문제가 발생한다. '필요할 때 할당' 과 '필요 없어지면 해제' 는 개발자가 임의로 지정할 수 없다. C언어는 '필요할 때 할당' 부분에서 malloc() 으로 명시적으로 지정하며, '필요 없어지면 해제' 부분은 free() 로 명시적으로 지정한다.
앞서 설명했듯이 자바스크립트는 그것이 불가능하다. GC에서 필요하다 판단하면 할당하고, 필요없다 판단하면 해제한다. 즉, 코딩하기는 편해졌지만 개발자가 생각해야 하는 범위는 줄었다.

JavaScript Memory Management

Initialize Value

자바스크립트는 값을 선언할 떄 자동으로 메모리를 할당한다.

let n = 123;
let s = 'Yunmin'; 		// 값을 담기 위한 메모리 할당

let obj = {
  yunmin : 35,
  Song : 53
};						// 오브젝트 및 오브젝트의 값을 위한 메모리 할당

Assignment via function call

let song = new Date();		// Data 객체를 위해 메모리를 할당
let yun = document.createElement('div'); 	// DOM 엘리먼트를 위한 메모리 할당

함수도 마찬가지다. 변수와 크게 다르지 않다.

Use value

보통은 이렇게 할당받은 값을 사용한다. 할당받은 값을 사용하는것은 우리가 자주 사용하듯이 할당된 메모리를 읽고, 쓰는 것을 의미한다.
이 부분은 저수준 언어와 고수준 언어가 다르지 않다. 명시적으로 할당을 받았든, 암묵적으로 할당을 받았든 사용하는건 똑같기 때문이다.

Unassign memory

개발자를 괴롭게 하는 부분이 이부분이라고 한다.
고수준 언어 (Javascript, JAVA 등..)에서 메모리 할당은 암묵적이라고 하지만 사실 필요에 의해 정의하기 마련이다. 그저 할당의 타이밍이 암묵적인 것이다.
하지만 할당 해제는 이야기가 다르다. 왜냐하면 어떤 메모리가 계속 필요한 것인지 아닌지를 판단하는 것은 비결정적 문제이기 때문이다.

Mark-and-Sweep Algorithm

2012년 기준으로 모든 최신 브라우저들은 가비지 콜렉션에서 Mark-and-Sweep 알고리듬을 사용한다. 지난 몇년간 연구된 자바스크립트 GC 알고리듬의 개선들은 모두 이 알고리듬에 대한 것이다.
Mark-and-Sweep은 아래와 같이 동작된다.
이 알고리즘은 'roots'라는 오브젝트의 집합을 가지고 있다. (JS에서는 전역변수를 의미) 주기적으로 GC는 roots로부터 시작하여 roots가 참조하는 오브젝트들, roots가 참조하는 오브젝트가 참조하는 오브젝트들을 '닿을 수 있는 오브젝트'라고 표시(Mark)한다. 그리고 '닿을 수 없는 오브젝트'에 대해 GC를 수행한다.

수동 메모리 해제는 불가능?

위에서 설명한 것처럼 수동으로 개발자가 직접 해제할때가 편할때가 분명있다. 그러기 위해서는 저수준 언어, 예를 들어 C언어의 free() 같은 명시적 키워드가 필요한데 2019년 기준으로 현재 Javascript에서는 명시적으로 GC를 동작할 수 없다.

profile
고독한 서버 개발 3년차
post-custom-banner

0개의 댓글