hmk run dev

자바스크립트 가비지 콜렉션 본문

javascript

자바스크립트 가비지 콜렉션

hmk run dev 2024. 3. 10. 22:53

가비지 콜렉션이란?

가비지 콜렉션은 자바스크립트 엔진이 자동으로 더 이상 사용되지 않는 메모리를 찾아내고 해제하는 프로세스를 의미합니다. 개발자가 명시적으로 메모리를 해제할 필요가 없어져 코드 작성이 간편해지는 장점이 있습니다.

 

 

메모리 관리의 중요성

메모리 관리는 프로그램의 성능과 안정성에 직접적인 영향을 미칩니다. 메모리 누수가 발생하면 시스템이 불안정해지고, 성능이 저하될 수 있습니다. 가비지 콜렉션은 이러한 문제를 해결하여 개발자가 메모리를 효율적으로 사용할 수 있도록 도와줍니다.

 

 

가비지 콜렉션의 작동 원리

자바스크립트 엔진은 주기적으로 가비지 콜렉션을 수행합니다. 이때, 더 이상 사용되지 않는 객체를 찾아내고, 해당 객체가 참조하는 메모리를 해제합니다. 이는 프로그램이 실행 중에 동적으로 생성되는 객체들 중에서 필요 없어진 것들을 체크하는 방식으로 이루어집니다.

 


 

1. 레퍼런스 카운팅 방식


레퍼런스 카운팅은 각 객체가 몇 개의 참조를 가지고 있는지 세는 방식입니다. 객체의 참조가 증가하거나 감소할 때마다 해당 객체의 참조 카운트를 갱신하고, 참조 카운트가 0이 되면 해당 객체를 해제하는 방식입니다. 이 방식은 단순하고 빠르지만 순환 참조(circular references) 문제에 취약합니다.

let x = {
  a: {
    b: 2,
  },
};
// 2개의 객체가 생성되었습니다. 하나의 객체는 다른 객체의 속성으로 참조됩니다.
// 나머지 하나는 'x' 변수에 할당되어 참조됩니다.
// 명백하게, 가비지 콜렉션 수행될 메모리는 하나도 없습니다.

let y = x;
// 'y' 변수는 위의 객체를 참조하는 두 번째 변수입니다.

x = 1;
// 이제 'y' 변수가 위의 객체를 참조하는 유일한 변수가 되었습니다.

let z = y.a;
// 위의 객체의 'a' 속성을 참조했습니다.
// 이제 이 객체는 두 개의 참조를 가집니다.
// 'y'가 속성으로 참조하고 'z'라는 변수가 참조합니다.

y = "mozilla";
// 이제 맨 처음 'x' 변수가 참조했던 객체에 대한 참조가 없기 때문에, 가비지 컬렉션이 가능합니다.
// 그러나, 객체의 'a' 속성이 여전히 'z' 변수에 의해 참조되므로
// 메모리를 해제할 수 없습니다.

z = null;
// 이제 맨 처음 'x' 변수가 참조했던 객체의 'a' 속성에는
// 참조가 없으므로 가비지 콜렉션이 수행될 수 있습니다.

 

순환 참조한계

function f() {
  const x = {};
  const y = {};
  x.a = y; // x는 y를 참조합니다.
  y.a = x; // y는 x를 참조합니다.

  return "azerty";
}

f();

 

 

2. 마크 앤 스위프(Mark and Sweep) 방식

"sweep(쓸어버린다)"라고 이름을 붙였듯이, 이건 힙 메모리에 있는 모든 도달 불가능한 객체를 치워버립니다.


마크 앤 스위프는 레퍼런스 카운팅의 한계를 극복하기 위해 개발된 가비지 콜렉션 알고리즘 중 하나입니다.

현재 거의 모든 최신 자바스크립트엔진은 해당 방식을 사용합니다. 이 알고리즘은 다음과 같은 단계로 작동합니다.

마크(Mark) 단계: 루트(root)로부터 시작해 모든 도달 가능한(Reachable) 객체를 표시(mark)합니다. 이는 활성 객체들을 표시하는 단계로, 더 이상 도달할 수 없는 객체는 표시되지 않습니다.

스위프(Sweep) 단계: 마크되지 않은 모든 객체를 해제(sweep)합니다. 이 단계에서는 가비지로 판단되는 객체들을 해제하고, 메모리를 회수합니다.

 

 

 

간단한 동작방식

 

1. 모든 객체들의 marked bit들을 false로 설정

 

2. 도달할 수 있는 객체면 true 마크

 

 

 

3. 도달할 수 없는 객체는 힙에서 정리됨

 

 

 

장점

 

순환참조 문제를 제어할 수 있고 무한루프 문제 해결

 

 

 

단점

마크 앤 스위프 방식은 순환 참조 문제를 해결하고 메모리를 효과적으로 관리할 수 있는 장점이 있습니다. 
그러나 이 알고리즘은 프로그램이 일시적으로 실행이 중단될 수 있고, 메모리 회수를 위해 일정한 시간이 소요될 수 있다는 단점이 있습니다.

자바스크립트 엔진은 이러한 가비지 콜렉션 알고리즘을 효과적으로 조합하여 최적의 성능을 제공하도록 노력하고 있습니다.

'javascript' 카테고리의 다른 글

자바스크립트와 V8  (0) 2024.04.11
자바스크립트의 call by value와 call by reference  (0) 2024.03.13
CommonJS와 ESM(esModule)  (0) 2024.02.24
자바스크립트의 stack & heap  (0) 2024.01.18
javascript 동작 원리  (0) 2023.04.12
Comments