티스토리 뷰

가비지 컬렉터 ( Garbage Collector )


가비지 컬렉터란?

  • 가비지 컬렉터 ( Garbage Collector ) 줄여서 GC라 부르겠다. GC는 쓰레기 수집기라고 해석할 수 있다. 이름과 어울리게 메모리 내에서 동적으로 할당된 객체중 더 이상 사용되지 않을 객체를 찾아 직접 해제하는 역할을 한다.

 

가비지 컬렉터의 목적

  • GC는 개발자가 메모리를 직접관리 하게 될 때 자주 Memory Leak 이 발생하여, 이러한 해제에 대해서 직접 하지 않게하여 애플리케이션의 안정성을 높이기 위해 탄생하였다.

 

가비지 컬렉터의 한계

  • GC는 결국 객체간 참조관계를 확인하고 삭제하는 과정을 거쳐야하기 때문에, 메모리를 직접관리하는 것 보다 오버헤드가 발생할 수 밖에 없다.

 

 

가비지 컬렉터의 알고리즘


가비지 컬렉터는 크게 참조 횟수 가비지 컬렉터와 추적 기반 가비지 컬렉터 두 가지로 나눌 수 있다.

 

Reference Counting Garbage Collection ( 참조 횟수 가비지 컬렉터 )


참조 횟수 가비지 컬렉터란?

GC의 초기 방식으로 Objective-C 나 Swift 에서 사용하는 방식이다. 각 인스턴스에 refCount(참조 횟수) 를 체크할 수 있도록 하고 refCount 가 0 된 즉, 더 이상 해당 인스턴스에 접근 불가능하게 된 순간 메모리를 해제한다.

 

 

장점

  • 오버헤드가 분산되어 애플리케이션이 매끄럽다.
    • 뒤에 얘기할 추적 기반 가비지 컬렉터의 경우 접근 불가능하게 된 순간과 메모리가 해제되는 순간이 다르다. 즉 어느정도 개수를 모아두었다가 GC를 해제하는 방법을 사용한다. 이 때문에 오버헤드가 한 순간에 발생 하게되는데 그와 반대로 참조 횟수 기반 가비지 컬렉터의 경우 refCount 가 0이 되는 순간 메모리를 해제하기 때문에 오버헤드를 분산할 수 있게 된다. 이 때문에 애플리케이션이 매끄러워진다.

 

단점

  • 순환 참조시 메모리 누수 발생
    • refCount 가 0일 때 메모리가 해제된다면, 순환 참조가 발생할 때, 실질적으로 내가 사용하지 않도록 되었어도 힙 메모리 내부에서 서로를 참조하고 있어 메모리가 사라지지 않은 상태로 Memory Leak을 발생시킬 위험이 있다.

Tracing Garbage Collection ( 추적 가비지 컬렉터 )


  • 특정 root로 부터 객체의 참조를 따라 들어가 reachable 한 객체와 unreachable 한 객체를 결정하고 unreachable 한 객체의 메모리를 해제하는 방식의 GC다.
    • 예를 들어 LinkedList 의 특정 노드 삭제를 위해서는 나를 참조하는 노드가 내 다음 노드를 가르키게만 하면 되는것과 같다고 볼 수 있다.

 

Mark and Sweep

  • 개념
    • Root Set 에서 시작하는 참조 관계를 추적하여, Garbage 대상이 아닌 오브젝트에는 Marking을 하고, 그 외의 오브젝트를 Sweep한다.
    • Reference Counting Garbage Collection 의 방식에서 순환참조 문제를 해결했다

 

  •  한계
    • GC가 Marking or Sweep을 하기 위한, Stop-the-word를 가져와 한 순간에 큰 오버헤드가 생길 수 있다.
    • 메모리 단편화(Memory Fragmentation)가 발생하여, 메모리가 충분하여도 사용할 수 없는 상황이 생길 수 있다.

 

Mark-and-Compact Algorithm

  • 개념
    • Mark and Sweep 방식의 메모리 단편화라는 단점을 해결하기 위해 나온 방식으로. Sweep 이후 Compact 라는 과정을 포함한다.
    • Compact 작업은 Window PC의 조각모음과 같다고 볼 수 있다. Sweep 작업으 파편화 되어있는 사용 메모리를 한 곳으로 모이는 작업을 한다. 

  •  단점
    • Compact라는 작업이 추가되어 메모리 단편화라는 문제는 해결되었지만 작업이 추가되었다는 것은 오버헤드가 늘어났다는 것을 의미한다.

 

Generational Algorithm

  • 배경
    • Mark-and-Compact Algorithm 의 약점을 해결하고자 사용된 방법, 가설을 기반으로 생겨났다.
      • **대부분의 객체가 금세 접근 불가(unreachable )하게 된다.
      • 오래된 객체가 젊은 객체를 참조할 일은 적다.

 

  •  개념
    • 메모리를 Yong 영역과 Old 영역으로 구분하고 GC가 실행될 때 마다 age-bit 값을 증가시킨 후 임계점을 넘었을 때 Yong 영역의 오브젝트를 Old 영역으로 이동시킨다.

  •  
댓글