본문 바로가기
개발/JavaScript

[JS] 가비지 콜렉터(Garbage Collecto)

by WaDDak 2024. 8. 20.

Garbage Collector는 프로그래밍 언어에서 메모리 관리의 자동화를 담당하는 중요한 기능입니다.

JS를 포함한 많은 고급 프로그래밍 언어에서는 가비지 컬렉터를 통해 더이상 사용되지 않는 메모리(객체나 변수 등)를 자동으로 해제합니다. 이를 통해 메모리 누수 문제를 방지하고, 개발자가 명시적으로 메모리 관리를 하지 않아도 되도록 합니다.

 

기본 개념 : 프로그램이 실행중 더 이상 사용되지 않는 메모리를 자동으로 식별하고 회수하는 프로세스.

 

주요 원리 : JS의 가비지 컬렉터는 주로 참조카운팅(reference counting)마크-앤-스윕(Mark-and-Sweep)이라는 알고리즘을 사용합니다.

 

  1. 참조카운팅(reference counting) 
    참조 카운팅은 객체가 몇 번 참조되고 있는지를 추적하는 간단한 메모리 관리 기법입니다. 기본 개념은 다음과 같습니다.
    • 참조 : 변수가 객체를 참조하고 있으면 그 객체의 참조 카운트가 증가합니다.
    • 참조 해제 : 변수가 더 이상 객체를 참조하지 않으면, 객체의 참조 카운트가 감소합니다.
    • 가비지 : 객체의 참조 카운트가 0이되면, 그 객체는 더 이상 프로그램에서 사용되지 않으니 메모리에서 해제됩니다.
  2. 마크-앤-스윕(Mark-and-Sweep)                                                                                                                                       JS의 현대적 가비지 컬렉션 알고리즘은 주로 마크앤스윕 방식을 사용합니다. 이 방법은 참조 카운팅의 문제점을 보완하며, 다음과 같이 동작합니다.
    • 루트 객체(root objects) : 기본적으로 전역 객체(window, global), 스코프체인에 있는 변수, 현재 호출 스택에 있는 함수 등이 루트 객체로 간주됩니다.
    • 마킹 (Mark) : 가비지 컬렉터는 루트 객체에서 시작하여 루트 객체가 참조하는 모든 객체를 "도달 가능" 이라 마킹합니다.
    • 스위핑(Sweep) : 마킹 과정이 완료되면, 마킹되지 않은 객체들은 더 이상 참조되지 않는 것으로 간주되며, 가비지로 식별되어 메모리에서 해제됩니다.
  3. 가비지 컬렉션의 한계와 주의점
    • 순환 참조 : 참조 카운팅은 순환 참조가 있는 객체( A -> B 참조해서 갔더니 B -> A참조하여 순환하는 구조)를 정확하게 해제하지 못하는 문제가 있습니다. (참조 카운팅 방식의 문제) 그러나 마크 앤 스윕 알고리즘은 이런 순환 참조 문제를 해결할 수 있습니다.
      • 마크 앤 스윕이 순환참조를 해결할 수 있는 이유 : 객체들이 서로를 참조하고 있더라도, 루트객체에서 도달할 수 없으면 해당 객체들을 가비지로 간주하여 해제할 수 있기 때문이다.
    • 성능 영향 : 순환 참조 해결을 위해 마크앤스윕 알고리즘을 주기적으로 실행하게 되며, 이 과정에서 일시적인 성능 저하가 발생할 수 있습니다. 특히, 큰 메모리 영역을 탐색하고 정리하는 과정은 시간이 걸릴 수 있습니다.             
    • 수동 메모리 관리 : 불필요한 객체를 너무 자주 생성하거나, 사용하지 않는 객체가 장시간 메모리에 남아있는 경우, 가비지 컬렉션의 부담이 증가할 수 있습니다.

 

 

[C++의 shared_ptr 과의 비교]

가비지 컬렉터의 참조 카운팅을 보고 든 생각은 C++의 shared_ptr의 방식과 비슷하다는 생각이 들었다.

 

  1. C++의 shared_ptr
    • 참조 카운팅 : shared_ptr은 스마트 포인터로, 내부적으로 참조 카운팅을 사용하여 객체의 메모리를 관리합니다. shared_ptr을 복사할 때마다 참조 카운트가 증가하고, 각 shared_ptr이 더 이상 사용되지 않을 때 참조카운트가 감소합니다. 참조 카운트가 0이되면 객체의 메모리가 해제됩니다.
  2. JS의 가비지 컬렉션
    • 참조 카운팅 및 마크 앤 스윕 : 가비지 컬렉션은 참조카운팅 뿐만아니라 마크 앤 스윕 등 다양한 알고리즘을 사용하여 메모리를 관리합니다. 이 과정은 완전히 자동화 되어 있으며, 개발자가 이를 직접 조작할 수 없습니다.

 

이렇듯 참조카운팅을 활용하는 것 자체는 비슷하지만 추가적인 알고리즘을 통해 자동으로 관리하는것과 개발자가 직접 수동으로 모든것을 관리해야 한다는 것이 두언어의 주요 차이점 인것 같다..

'개발 > JavaScript' 카테고리의 다른 글

[JS] Map 의 메서드 정리  (0) 2024.08.27
[JS] undefined 와 null  (0) 2024.08.20
[JS] 데이터 타입의 종류  (0) 2024.08.20
[JS] Map과 Set  (0) 2024.08.13
[JS] 일급 객체로서의 함수  (0) 2024.08.13